簡體   English   中英

數組“下標超出范圍”的異常行為

[英]Array “subscript out of range” odd behavior

在MS Word VBA中考慮以下代碼:

Sub Test()
    Dim x() As Document
    ReDim Preserve x(UBound(x) + 1)
    Set x(UBound(x)) = Application.ActiveDocument
End Sub

如果我將光標放在里面並按F5鍵運行它,則會收到錯誤消息

下標超出范圍

ReDim Preserve x(UBound(x) + 1) 具體來說,它不喜歡UBound(x) ,盡管它應該基於MSDN返回-1 (請參見“返回值”下的內容)。

現在,如果我在ReDim Preserve x(UBound(x) + 1)上設置一個斷點,運行它,然后將光標懸停在UBound(x) ,則表明相同:

在此處輸入圖片說明

但是我發現,如果我將鼠標懸停在以下行中的變量x上:

在此處輸入圖片說明

然后返回並再次將鼠標懸停在上一行的UBound(x)上,我得到一個不同的結果:

在此處輸入圖片說明

然后,如果我按F5鍵運行其余代碼,的確,那時候我沒有出錯。

此外,如果我更改代碼以添加IsArray(x)

Sub Test()
    Dim x() As Document
    IsArray (x) 'This is just here to preclude VBA array "bug"
    ReDim Preserve x(UBound(x) + 1)
    Set x(UBound(x)) = Application.ActiveDocument
End Sub

它也運行良好。 發生了什么,如何在沒有IsArray(x) hack的情況下使代碼在運行時工作?

MSDN:

如果Array只有一個元素,則UBound返回0。如果Array沒有元素,例如,如果它是長度為零的字符串,則UBound返回-1。

這並不是說數組沒有元素,未初始化或沒有維度。 在不首先在數組上至少使用一次ReDim或不使用錯誤處理的情況下,您不應該依賴UBound的值。

更好的方法是使用錯誤處理:

Dim x() As Document

Dim n As Long
On Error Resume Next
Err.Clear
n = LBound(x)
If Err.Number = 0 Then
    Debug.Print "Array is allocated."
Else
    Debug.Print "Array is not allocated."
End If

其他注意事項,請參見此鏈接

或者,如果可能,請確保數組的尺寸至少為一次( ReDim )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM