目前,我有一系列我希望能够输入数组的字符串。但是,我不确定它是否正常工作,每当我尝试对数组做任何事情时,我都会得到一个超出范围错误的下标。我试着做一个Debug.Print来查看值是否进入数组但是导致了相同的错误。这是我到目前为止所拥有的......
UsedRow = ActiveWorkbook.Sheets(3).UsedRange.Rows.Count
Dim ProjectCounter As Long
Dim ArrRange As Range
'This determines the number of entries in the array (I know this part works)
i = UsedRow
ProjectCounter = 0
Do While Cells(i, 1).FormulaR1C1 <> vbNullString
ProjectCounter = ProjectCounter + 1
i = i - 1
Loop
'Array should have dimensions that match the number of projects
Dim ProjectArray() As Variant
ReDim ProjectArray(ProjectCounter - 1)
'Set range for array to cover
Set ArrRange = ActiveWorkbook.Sheets(3).Range("A" & UsedRow - ProjectCounter & ":A" & UsedRow)
'Populate array with projects
ProjectArray = ArrRange
For i = LBound(ProjectArray) To UBound(ProjectArray)
Debug.Print ProjectArray(i)
Next
这是设置数组的正确方法吗?如果没有,我做错了什么?感谢。
答案 0 :(得分:1)
我一直认为将1维范围复制为二维数组的方式是VBA最烦人的事情之一。修复结果下标超出范围错误的一种方法是,而不是记住包含无意义的下标,首先修复数组本身,这样如果数组在概念上是1维的,那么你的代码就可以这样处理它。以下子修改了为变量分配值范围时获得的数组类型。如果真的是二维的话,它就不会采取任何行动:
Sub FixArray(valArray As Variant) 'As Variant
'This sub takes a pseudo 2-dimenional 1-based variant array
'And makes it 1-dimensional
Dim fixedArray As Variant
Dim columnVector As Boolean
Dim i As Long, m As Long, n As Long
On Error GoTo err_handler
m = UBound(valArray, 1)
n = UBound(valArray, 2) 'will throw an error if already 1-dimensional
If m > 1 And n > 1 Then Exit Sub 'can't be fixed without losing data
If m > 1 Then
columnVector = True
Else
columnVector = False
m = n
End If
ReDim fixedArray(1 To m)
For i = 1 To m
If columnVector Then
fixedArray(i) = valArray(i, 1)
Else
fixedArray(i) = valArray(1, i)
End If
Next i
valArray = fixedArray
err_handler:
'no action - nothing to fix
End Sub
测试子(在调试模式下运行,本地窗口打开,看看v如何从2维变为1维):
Sub test()
Dim v As Variant
v = Range("A1:A3").Value
FixArray v
Debug.Print "here" 'convenient breakpoint
End Sub
答案 1 :(得分:0)
您可以将数组读入预设范围而无需重新编辑。声明没有括号的变体。
Dim ProjectArray as Variant
ProjectArray = ArrRange
您收到错误,因为您的数组有2个维度。你需要
for I = 1 to ubound(ProjectArray)
debug.print ProjectArray(I,1)
next I
当你这样做时,LBound将永远是1。