我正在使用数组而且我很抱歉,但我有点新鲜并且仍然感到困惑。我已经有了这个代码来将值存储在一个数组的范围内,如果我运行它,它就是空的。
attPresent = ws.Range("H4:H" & lastrow)
ReDim attPresent(1 To UBound(attPresent))
For k = LBound(attPresent) To UBound(attPresent)
MsgBox attPresent(k)
Next
有人可以告诉我哪里错了吗?我已阅读任何其他帖子并收集一些想法,但仍无效。
答案 0 :(得分:3)
你可以这样
Dim attPresent as Variant
attPresent = ws.Range("H4:H" & lastrow).Value '<-- this will automatically size the array to a 2dimensional array of as many rows as the range ones and one column
For k = LBound(attPresent,1) To UBound(attPresent,1)
MsgBox attPresent(k,1)
Next
或者
Dim attPresent as Variant
attPresent=Application.Transpose(Range("H4:H" & lastrow).Value) '<-- this will automatically size the array to a 1dimensional array of as many elements as the range
For k = LBound(attPresent) To UBound(attPresent)
MsgBox attPresent(k)
Next
答案 1 :(得分:2)
参考MSDN: ReDim Statement (Visual Basic)
当您Redim
数组时,您正在删除所有值。使用ReDim Preserve
调整数组的最后一个维度,并保留数组的值。
在分配动态数组后(第一次使用Redim),您只能调整数组的最后一个维度,并且无法更改维数。在你的代码中,你试图将2维数组转换为1维数组,你不能这样做。
你应该看完这个完整的系列:Excel VBA Introduction。这是相关视频:Excel VBA Introduction Part 25 - Arrays
答案 2 :(得分:0)
'Try this code example to suit your case
Sub StoreRangeofCellsToAnArray()
'presumes optionbase=0
'presume Range("a1:c3") contain number 1 to 9
Dim MyRange, MyArray(9), n
n = 0
For Each c In Range("a1:c3")
MyArray(n) = c
n = n + 1
Next
'testing: reprint array
For n = 0 To 8
Debug.Print MyArray(n)
Next
End Sub