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到一维数组中的项目的数量? RowNumbervariables( 特定列中的单元格数量 )。 您使用ReDim而不是Dim来能够在运行时更改数组的大小。 在这个特殊的情况下,它并不适合你,因为它似乎不会从数组等删除重复,你只想使用dynamic数量的行。 这是值得知道为什么你会使用ReDim虽然:)

 ReDim idArray(RowNumber) as String 

您不需要特殊的IDvariables,因为您可以使用一个循环来填充数组。

 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