簡體   English   中英

VBA Excel:奇數下標超出范圍錯誤(9)

[英]VBA Excel : Odd subscript out of range error (9)

在這個簡單的子代碼中,我遇到了奇怪的VBA下標超出范圍錯誤:

Sub writeTypes(ByVal rowNb As Long, ByVal colNb, ws As Worksheet)

    On Error GoTo ErrorHandler_ObjMethod

    Const METHOD_NAME = "writeTypes (CCase)"

    With ws

        If Not isArrayEmpty(pTypes) Then

            For i = LBound(pTypes) To UBound(pTypes)

                If pTypes(i) <> "" Then

                    .Cells(rowNb, colNb).Value = .Cells(rowNb, colNb).Value & pTypes(i) & ";"

                ElseIf i = UBound(pTypes) Then

                    .Cells(rowNb, colNb).Value = Left(.Cells(rowNb, colNb).Value, Len(.Cells(rowNb, colNb).Value) - 1)

                End If

            Next i

        Else: .Cells(rowNb, colNb).Value = "N/A"

        End If

    End With

ErrorHandler_ObjMethod:
    If err.Number <> 0 Then
        Workbooks(AA_RESOURCES_WB).Close SaveChanges:=True
        MsgBox (METHOD_NAME & vbNewLine & err.Number & vbNewLine & err.description)
        End
    End If

End Sub

該過程的調用行是: pUnassignedCases(i).writeTypes j, 7, ws (作為參數傳遞的變量是正確的,我確保了幾次)

這是我已經嘗試做的事情:

-要刪除參數中的“ ByVal”

-刪除第一個“如果不是”

-刪除“ Elseif”塊

刪除操作正確完成,沒有任何語法/邏輯錯誤。

我還以任何可能的方式檢查了所有使用過的變量(包括“ pTypes”字符串數組)。 一切似乎都很好。

我還嘗試將此代碼直接合並到我的其他子代碼中(該代碼通過帶有For循環的CCase對象數組),而不是通過CCase對象過程調用它,並且它以某種方式適用於第一個CCases對象,然后強制循環超越CCase數組的上限...我對此毫無意義。

當我逐行瀏覽代碼時,錯誤發生在“ End sub”行。 但是,當我刪除錯誤處理后,它可以正常運行,但是以某種方式,錯誤會傳遞到與該子程序無關的代碼中的其他地方,並且在此之前運行良好……然后,如果我簡單地刪除了對該子程序的任何調用一切都按原樣進行。

另外,即使發生錯誤,我的工作表行也仍然可以很好地更新為“ N / A”(這也可以推測是因為我的case對象現在都沒有類型)。 這就像是被詛咒的潛艇。 這真讓我抓狂。

我注意到了幾件事:我不知道這些是否能解決您遇到的問題,但可能有用:

  1. 參數ByVal colNb沒有類型。

  2. 我懷疑ElseIf i = UBound(pTypes) Then意在去除結尾的";" 如果是這種情況,最好將類似的代碼放在for循環之外。 考慮:數組pTypes在UBound索引位置中的值可以為<> "" pTypes 如果是這樣,您可能有邏輯錯誤。

  3. 如果單元格沒有值,並且使用了Len(.Cells(rowNb, colNb).Value) - 1)則在用作左函數的參數時,它將引發錯誤。 我認為當數組僅包含空字符串時會發生這種情況。

  4. isArrayEmpty :我想知道此函數的作用。 我認為它按錫罐上的說明去做。

上面沒有解釋您的問題,“ err”為小寫字母很奇怪,如另一個答案中所述。 如果Exit sub在錯誤處理程序之前,則它將在沒有錯誤發生時停止評估if語句。

哈維

代碼顯示差的錯誤處理。

Sub a3(optional RaiseAnError As Boolean = true)

On Error GoTo errhand

If RaiseAnError Then
    Err.Raise 1, "", "Simulating code that might raise and error "
End If

MsgBox "Got to the end of your code"

errhand:
If Err.Number <> 0 Then
    MsgBox "Err.Number = " & Err.Number
    Err.Raise 2, "", "Simulating code ie workbook close that might raise and error "
    MsgBox "ok"
    End
End If
End Sub

暫無
暫無

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

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