Excelmacros整列到一维数组中
我有这样的数据表
ID Name ------------------- B23 Max D27 Nads W34 sads A65 Robin C37 Harvard C65 Nivkai V87 adsdasd Q78 sadsad
我需要把所有的ID作为string放在一个“一维数组”中。所以我试了一下,
Dim RowCount As Integer RowNumber = wb1.Sheets(1).UsedRange.Rows.Count Dim idArray() As String For j = 1 To RowNumber ID = wb1.Sheets(1).Cells(j, 1).Value ReDim idArray(j) idArray(j) = CStr(ID) Next j
我的主要目标是以这种方式使用此idArray在不同的工作表上应用filter
wb2.Sheets(1).Range(Selection, Selection.End(xlDown)).AutoFilter Field:=1, Criteria1:=idArray(), Operator:=xlFilterValues
但后来当我试图打印整个数组使用下面的代码,它打印nothing.And似乎idArray()是空的。
For n = 1 To UBound(idArray) Debug.Print QidArray(n) Next n
任何人都可以告诉我我做错了什么。
谢谢,
您可以在创build时指定数组的大小 – 您知道将要input到一维数组中的项目的数量? RowNumber
variables( 特定列中的单元格数量 )。 您使用ReDim
而不是Dim
来能够在运行时更改数组的大小。 在这个特殊的情况下,它并不适合你,因为它似乎不会从数组等删除重复,你只想使用dynamic数量的行。 这是值得知道为什么你会使用ReDim
虽然:)
ReDim idArray(RowNumber) as String
您不需要特殊的ID
variables,因为您可以使用一个循环来填充数组。
ReDim idArray(RowNumber) As String Dim j As Long For j = 1 To RowNumber idArray(j - 1) = CStr(wb1.Sheets(1).Cells(j, 1).Value) Next j ReDim Preserve idArray(UBound(idArray) - 1)
ReDim Preserve idArray(UBound(idArray) - 1)
索引从0
开始,第1
行将数组的大小(长度 ReDim Preserve idArray(UBound(idArray) - 1)
减1
。 因此,数组中的第一个项目从0
开始,在这种情况下等于lbound(arr)
。 如果代码中的某个地方将数组重新编号为arr(5 to 10)
那么lbound()
将是5
而不是0
。
在迭代数组时,使用两个绑定函数,返回数组bounds的绑定函数lbound lbound()
和ubound()
。 这将把你的整个数组打印到立即窗口CTRL + G
For j = LBound(idArray) To UBound(idArray) Debug.Print idArray(j) Next j
所以,这里的解决scheme可能是这样的:
Sub Arrr() Dim wb1 As Workbook Set wb1 = ThisWorkbook Dim RowNumber As Long RowNumber = wb1.Sheets(1).UsedRange.Rows.Count ReDim idArray(RowNumber) As String Dim j As Long For j = 1 To RowNumber idArray(j - 1) = CStr(wb1.Sheets(1).Cells(j, 1).Value) Next j ReDim Preserve idArray(UBound(idArray) - 1) For j = LBound(idArray) To UBound(idArray) Debug.Print j, idArray(j) Next j End Sub
虽然Mehow已经雄辩地回答了您的具体要求,但是在更为一般的说明中,尽量避免在工作表中循环 – 这很慢。 在内存中复制数组并总是循环更快 – 这里有几个select:
1.唯一值
Sub UniqueValuesOnly() Dim vData, idArray As Variant Dim x As Long Dim oDic As Object Set oDic = CreateObject("scripting.dictionary") vData = Sheets(1).Cells(1, 1).CurrentRegion.Resize(, 1).Value For x = LBound(vData) + 1 To UBound(vData) If Not oDic.exists(vData(x, 1)) Then oDic.Add vData(x, 1), Nothing End If Next x idArray = oDic.keys End Sub
2.不要循环less量的数据
Sub AllSmallData() Dim idArray With Sheets(1).Cells(1, 1).CurrentRegion idArray = Application.Transpose(.Offset(1).Resize(.Rows.Count - 1, 1).Value) End With End Sub
3.通过数组循环访问大量数据
Sub AllLargeData() Dim idArray() As String, vData Dim x As Long With Sheets(1).Cells(1, 1).CurrentRegion vData = .Offset(1).Resize(.Rows.Count - 1, 1).Value End With ReDim idArray(1 To UBound(vData)) For x = LBound(vData) To UBound(vData) idArray(x) = vData(x, 1) Next x End Sub