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"中的
-去掉第一个"If Not"
-删除"Elseif"块
删除操作正确,没有任何 syntax/logic 错误。
我还以任何可能的方式检查了所有使用的变量(包括 "pTypes" 的字符串数组)。一切似乎都很好。
我还尝试将这段代码直接合并到我的另一个子程序中(它通过一个 For 循环遍历 CCase 对象数组)而不是通过 CCase 对象过程调用它,不知何故它适用于第一个 CCases 对象然后强制循环超出 CCase 数组上限...我无法理解这一点。
当我逐行查看代码时,错误发生在 "End sub" 行。但是,当我删除错误处理时,它会正常运行,但错误会以某种方式传递到代码中的其他地方,而该代码无论如何都与该 sub 无关,并且之前工作正常……然后,如果我只是删除对该 sub 的任何调用一切正常。
此外,即使发生错误,我的工作表行仍然使用 "N/A" 进行了很好的更新(这也是应该的,因为我的案例对象目前都没有类型)。就像潜艇被诅咒了一样。这让我发疯。
我注意到的几件事:
我不知道这些是否能解决您遇到的问题,但它们可能有用:
参数 ByVal colNb
没有类型。
我怀疑 ElseIf i = UBound(pTypes) Then
这行是为了去掉尾随的 ";"
如果是这种情况,类似的代码最好放在 for 循环之外。
考虑:数组 pTypes
是否可以在 UBound 索引位置有一个值为 <> ""
的值。如果是这样你可能有逻辑错误。
如果单元格没有值并且使用了 Len(.Cells(rowNb, colNb).Value) - 1)
,当用作左函数的参数时会引发错误。我认为当数组只包含空字符串时会发生这种情况。
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
我在这个简单的子程序中遇到了一个奇怪的 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"中的
-去掉第一个"If Not"
-删除"Elseif"块
删除操作正确,没有任何 syntax/logic 错误。
我还以任何可能的方式检查了所有使用的变量(包括 "pTypes" 的字符串数组)。一切似乎都很好。
我还尝试将这段代码直接合并到我的另一个子程序中(它通过一个 For 循环遍历 CCase 对象数组)而不是通过 CCase 对象过程调用它,不知何故它适用于第一个 CCases 对象然后强制循环超出 CCase 数组上限...我无法理解这一点。
当我逐行查看代码时,错误发生在 "End sub" 行。但是,当我删除错误处理时,它会正常运行,但错误会以某种方式传递到代码中的其他地方,而该代码无论如何都与该 sub 无关,并且之前工作正常……然后,如果我只是删除对该 sub 的任何调用一切正常。
此外,即使发生错误,我的工作表行仍然使用 "N/A" 进行了很好的更新(这也是应该的,因为我的案例对象目前都没有类型)。就像潜艇被诅咒了一样。这让我发疯。
我注意到的几件事: 我不知道这些是否能解决您遇到的问题,但它们可能有用:
参数
ByVal colNb
没有类型。我怀疑
ElseIf i = UBound(pTypes) Then
这行是为了去掉尾随的";"
如果是这种情况,类似的代码最好放在 for 循环之外。 考虑:数组pTypes
是否可以在 UBound 索引位置有一个值为<> ""
的值。如果是这样你可能有逻辑错误。如果单元格没有值并且使用了
Len(.Cells(rowNb, colNb).Value) - 1)
,当用作左函数的参数时会引发错误。我认为当数组只包含空字符串时会发生这种情况。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