我有这样的数据表
ID Name
-------------------
B23 Max
D27 Nads
W34 sads
A65 Robin
C37 Harvard
C65 Nivkai
V87 adsdasd
Q78 sadsad
我需要将所有ID放入“One dimetional Array”作为字符串。所以我试过这个,
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在不同的工作表上应用过滤器
wb2.Sheets(1).Range(Selection, Selection.End(xlDown)).AutoFilter Field:=1, Criteria1:=idArray(), Operator:=xlFilterValues
但后来当我尝试使用下面的代码打印整个数组时,它什么都没打印。似乎idArray()是空的。
For n = 1 To UBound(idArray)
Debug.Print QidArray(n)
Next n
任何人都可以告诉我我做错了什么。
谢谢,
答案 0 :(得分:5)
虽然Mehow已经雄辩地回答了您的具体要求,但是在更一般的说明中,尽量避免在工作表中循环 - 这很慢。将数组复制到内存中并循环通过它总是更快 - 这里有几个选择:
<强> 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。没有为少量数据循环
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
答案 1 :(得分:3)
您可以在创建时指定数组的大小 - 您知道要输入1D数组的项目数量»RowNumber
变量(特定列中的单元格数量< / em>的)。您可以使用ReDim
而不是Dim
来在运行时更改数组的大小。在这种特殊情况下,它并不适合你,因为它似乎不会从数组等中删除重复,你只想使用动态行数。值得知道为什么你会使用ReDim
但是:)
ReDim idArray(RowNumber) as String
您不需要特殊的ID
变量,因为您可以使用一个循环来填充数组。
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)
将数组的(长度)缩小1
,因为索引从0
和行1
开始。因此,数组中的第一项从0
开始,在这种情况下等于lbound(arr)
。如果代码中的某个位置({1}}您的数组为redimed
,则arr(5 to 10)
将为lbound()
而不是5
。
在迭代数组时,使用两个绑定函数,返回数组边界0
和lbound()
的数值表示。这会将整个数组打印到立即窗口 CTRL + G
ubound()
所以,这里的解决方案可能如下所示:
For j = LBound(idArray) To UBound(idArray)
Debug.Print idArray(j)
Next j