2

我有这样的数据表

ID    Name
-------------------
B23     Max
D27     Nads
W34     sads
A65     Robin
C37     Harvard
C65     Nivkai
V87     adsdasd
Q78     sadsad

我需要将所有 ID 作为字符串放入“一维数组”中。所以我尝试了这个,

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

谁能告诉我我做错了什么。

谢谢,

4

2 回答 2

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
于 2013-09-10T11:18:11.897 回答
3

您可以在创建时指定数组的大小 - 您知道将输入一维数组的项目数 »RowNumber变量(特定列中的单元格数量)。您使用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)减小为索引从和 rows开始。所以数组中的第一项从 开始,在这种情况下等于。如果在代码中的某个位置您的数组将不是.1010lbound(arr)redimedarr(5 to 10)lbound()50

迭代数组时,您使用两个绑定函数,它们返回数组边界的数字表示lbound()ubound(). 这会将您的整个数组打印到即时窗口CTRL+G

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

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

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
于 2013-09-10T09:29:55.510 回答