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

作成時に配列のサイズを指定できます。1D 配列に入力するアイテムの数はわかっています »RowNumber変数 (特定の列のセルの量)。実行時に配列のサイズを変更できるようにするReDim代わりに使用します。Dimこの特定のケースでは、動的な行数のみを使用したいなど、配列から重複を削除するようには見えないため、実際には適していません。ただし、なぜ使用するのかを知ることは価値がReDimあります:)

ReDim idArray(RowNumber) as String

ID1 つのループを使用して配列を埋めることができるため、特別な変数は必要ありません。

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)を減らします。したがって、配列の最初の項目は から始まります。この場合、これは に等しくなります。コードのどこかで配列を使用する場合は、そうではありません。1010lbound(arr)redimedarr(5 to 10)lbound()50

配列を反復処理する場合、配列境界の数値表現を返す 2 つのバインドされた関数と を使用し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 に答える