如何在VBA中动态调整数组大小?我不断收到下标和索引问题
我不确定为什么我得到的索引超出范围错误 基本上,每次找不到工作表名称时,我都希望将其添加到数组中,然后最终让用户知道缺少的工作表的名称 因此,最好的员工将不会丢失任何工作表。最糟糕的是错过了它们。问题在于UBoundcodesArray。不能在尚未标注尺寸的数组上调用UBound 您可以使用错误处理来处理这种情况。抽象为潜在有用的子项:如何在VBA中动态调整数组大小?我不断收到下标和索引问题,vba,excel,Vba,Excel,我不确定为什么我得到的索引超出范围错误 基本上,每次找不到工作表名称时,我都希望将其添加到数组中,然后最终让用户知道缺少的工作表的名称 因此,最好的员工将不会丢失任何工作表。最糟糕的是错过了它们。问题在于UBoundcodesArray。不能在尚未标注尺寸的数组上调用UBound 您可以使用错误处理来处理这种情况。抽象为潜在有用的子项: Dim codesArray() As Variant ... If WorksheetExists(workSheetName) Then ... E
Dim codesArray() As Variant
...
If WorksheetExists(workSheetName) Then
...
Else
ReDim Preserve codesArray(UBound(codesArray) + 1) ' Error subscript
codesArray(UBound(codesArray)) = cell.Value
End If
问题在于UBoundcodesArray。不能在尚未标注尺寸的数组上调用UBound
您可以使用错误处理来处理这种情况。抽象为潜在有用的子项:
Dim codesArray() As Variant
...
If WorksheetExists(workSheetName) Then
...
Else
ReDim Preserve codesArray(UBound(codesArray) + 1) ' Error subscript
codesArray(UBound(codesArray)) = cell.Value
End If
使用变量k
Sub ExtendArray(A As Variant, Optional NewPlaces = 1, Optional LBase = 0)
On Error GoTo err_handler
ReDim Preserve A(LBound(A) To UBound(A) + NewPlaces)
Exit Sub
err_handler:
ReDim A(LBase To LBase + NewPlaces - 1)
End Sub
高位代码数组编号从0开始
下面的代码数组编号从1开始。LboundcodeArray为1
Dim codesArray() As Variant
Dim k As Long
...
If WorksheetExists(workSheetName) Then
...
Else
ReDim Preserve codesArray(k) ' Error subscript
codesArray(k) = Cell.Value
k = k + 1
End If
使用变量k
Sub ExtendArray(A As Variant, Optional NewPlaces = 1, Optional LBase = 0)
On Error GoTo err_handler
ReDim Preserve A(LBound(A) To UBound(A) + NewPlaces)
Exit Sub
err_handler:
ReDim A(LBase To LBase + NewPlaces - 1)
End Sub
高位代码数组编号从0开始
下面的代码数组编号从1开始。LboundcodeArray为1
Dim codesArray() As Variant
Dim k As Long
...
If WorksheetExists(workSheetName) Then
...
Else
ReDim Preserve codesArray(k) ' Error subscript
codesArray(k) = Cell.Value
k = k + 1
End If
如前所述,var将在绑定检查时出错。
要做到这一点而不出现任何错误,可以使用如下代码:
Dim codesArray() As Variant
Dim k As Long
...
If WorksheetExists(workSheetName) Then
...
Else
k = k + 1
ReDim Preserve codesArray(1 To k) ' Error subscript
codesArray(k) = Cell.Value
End If
Dim codesArray
...
If WorksheetExists(workSheetName) Then
...
Else
If IsArray(codesArray) Then
ReDim Preserve codesArray(UBound(codesArray) + 1)
Else
ReDim codesArray(0)
End If
codesArray(UBound(codesArray)) = cell.Value
End If
或者像这样:
Dim codesArray() As Variant
Dim k As Long
...
If WorksheetExists(workSheetName) Then
...
Else
k = k + 1
ReDim Preserve codesArray(1 To k) ' Error subscript
codesArray(k) = Cell.Value
End If
Dim codesArray
...
If WorksheetExists(workSheetName) Then
...
Else
If IsArray(codesArray) Then
ReDim Preserve codesArray(UBound(codesArray) + 1)
Else
ReDim codesArray(0)
End If
codesArray(UBound(codesArray)) = cell.Value
End If
这样做的好处是避免了任何更改代码的错误。因此,如果错误有不同的原因,它将不会被抑制。
也应该是自我解释的。。。。如果你还有什么问题要问 如前所述,var将在绑定检查时出错。
要做到这一点而不出现任何错误,可以使用如下代码:
Dim codesArray() As Variant
Dim k As Long
...
If WorksheetExists(workSheetName) Then
...
Else
k = k + 1
ReDim Preserve codesArray(1 To k) ' Error subscript
codesArray(k) = Cell.Value
End If
Dim codesArray
...
If WorksheetExists(workSheetName) Then
...
Else
If IsArray(codesArray) Then
ReDim Preserve codesArray(UBound(codesArray) + 1)
Else
ReDim codesArray(0)
End If
codesArray(UBound(codesArray)) = cell.Value
End If
或者像这样:
Dim codesArray() As Variant
Dim k As Long
...
If WorksheetExists(workSheetName) Then
...
Else
k = k + 1
ReDim Preserve codesArray(1 To k) ' Error subscript
codesArray(k) = Cell.Value
End If
Dim codesArray
...
If WorksheetExists(workSheetName) Then
...
Else
If IsArray(codesArray) Then
ReDim Preserve codesArray(UBound(codesArray) + 1)
Else
ReDim codesArray(0)
End If
codesArray(UBound(codesArray)) = cell.Value
End If
这样做的好处是避免了任何更改代码的错误。因此,如果错误有不同的原因,它将不会被抑制。
也应该是自我解释的。。。。如果你还有什么问题要问 使用集合而不是数组可能会更好-无需调整大小
Dim codesArray
...
If WorksheetExists(workSheetName) Then
...
Else
If IsArray(codesArray) Then
ReDim Preserve codesArray(UBound(codesArray) + 1)
codesArray(UBound(codesArray)) = cell.Value
Else
codesArray = Array(cell.Value)
End If
End If
使用集合而不是数组可能会更好,这样就不需要调整大小
Dim codesArray
...
If WorksheetExists(workSheetName) Then
...
Else
If IsArray(codesArray) Then
ReDim Preserve codesArray(UBound(codesArray) + 1)
codesArray(UBound(codesArray)) = cell.Value
Else
codesArray = Array(cell.Value)
End If
End If
我用了第二个,我仍然得到同样的错误。下标超出范围。我认为您关于数组未初始化的说法是正确的。@软件很有趣您是否已将Dim codesArray作为变体更改为Dim codesArray???我使用了第二个,但仍然得到相同的错误。下标超出范围。我认为您关于数组未初始化的说法是对的。@softwareisfun您是否已将Dim codesArray作为变体更改为Dim codesArray???@softwareisfun,当我们第一次进入循环时,k是0。数组大小从1开始,但数组编号为0。codeArray0,codeArray1,codeArray2,codeArrayn@softwareisfun,上面的代码LboundcodeArray是0。@softwareisfun,当我们第一次进入循环时,k是0。数组大小从1开始,但数组编号为0。codeArray0,codeArray1,codeArray2,codeArrayn@softwareisfun,上限代码LboundcodeArray为0。