Excel宏整列到一维数组

时间:2013-09-10 09:24:20

标签: arrays excel vba excel-vba

我有这样的数据表

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

任何人都可以告诉我我做错了什么。

谢谢,

2 个答案:

答案 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

在迭代数组时,使用两个绑定函数,返回数组边界0lbound()的数值表示。这会将整个数组打印到立即窗口 CTRL + G

ubound()

所以,这里的解决方案可能如下所示:

For j = LBound(idArray) To UBound(idArray)
    Debug.Print idArray(j)
Next j