如何在VBA中动态调整数组大小?我不断收到下标和索引问题

如何在VBA中动态调整数组大小?我不断收到下标和索引问题,vba,excel,Vba,Excel,我不确定为什么我得到的索引超出范围错误 基本上,每次找不到工作表名称时,我都希望将其添加到数组中,然后最终让用户知道缺少的工作表的名称 因此,最好的员工将不会丢失任何工作表。最糟糕的是错过了它们。问题在于UBoundcodesArray。不能在尚未标注尺寸的数组上调用UBound 您可以使用错误处理来处理这种情况。抽象为潜在有用的子项: Dim codesArray() As Variant ... If WorksheetExists(workSheetName) Then ... E

我不确定为什么我得到的索引超出范围错误

基本上,每次找不到工作表名称时,我都希望将其添加到数组中,然后最终让用户知道缺少的工作表的名称

因此,最好的员工将不会丢失任何工作表。最糟糕的是错过了它们。

问题在于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
问题在于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。