web-dev-qa-db-ja.com

VBAのイミディエイトウィンドウで2次元配列を印刷する方法

VBAのイミディエイトウィンドウで2次元配列を印刷する方法これを行うための一般的な方法はありますか?イミディエイトウィンドウで行ごとに配列の1行をプロットするいくつかの方法は、この問題を解決できます。これは、配列の各行に対してこのコードをループすることだけが必要だからです。

15
Qbik

誰でも参照できるように、簡単なループを作成しました。

Sub WriteArrayToImmediateWindow(arrSubA As Variant)

Dim rowString As String
Dim iSubA As Long
Dim jSubA As Long

rowString = ""

Debug.Print
Debug.Print
Debug.Print "The array is: "
For iSubA = 1 To UBound(arrSubA, 1)
    rowString = arrSubA(iSubA, 1)
    For jSubA = 2 To UBound(arrSubA, 2)
        rowString = rowString & "," & arrSubA(iSubA, jSubA)
    Next jSubA
    Debug.Print rowString
Next iSubA

End Sub
9
user3706920

これがデバッグ目的の場合は、プログラムの実行中に配列の内容を表示するマクロを記述するのは不便です。問題を引き起こす可能性もあります。

プログラムの実行中にデバッグするには、すべてのVBプロジェクトで使用できるコードフリーのメソッドが必要で、配列の内容をスパイします。

  1. VBA IDEで、[表示]メニュー> [ローカルウィンドウ]をクリックします。
  2. ローカルペインで、アレイ名を見つけます。 enter image description here
  3. ノードを展開して値を見つけます。ノードは、アレイのタイプによって異なります。

この例では、「aLookList」はバリアント配列です。 「Value2」の下の値は、範囲から取得されます。

enter image description here

enter image description here

ここで別の答えは、ウォッチペインの使用を提案しています。これは私の回答に似ていますが、ポスターに、配列名をWatchに追加するだけで配列全体(すべてのセル)をスパイできることは説明されていませんでした。次に、ノードをドリルダウンします。 [ウォッチ]ウィンドウに対する[ローカル]ウィンドウの利点は、[ローカル]ペインでは、手動で配列をペインに追加する必要がなく、すでにそこにあることです。したがって、少し手間がかかりません。

14
johny why

いいえ、必要があります。

  • ループしてデバッグウィンドウに出力する関数を作成して呼び出します。
  • これがデバッグ用である場合は、IDE& "Add Watch"で変数を右クリックすると、配列の値の変更を追跡するウィンドウが表示され、ブレークポイント時にその内容が表示されますヒットしています。
10
Alex K.

列B(Age)の列A(Name)の下にデータを貼り付け

Name    Age
A   10
B   20
C   30
D   40
E   50
F   60
G   70

以下のコードを実行します

Sub Array_Demo()

Dim arr() As String
Dim i As Integer, j As Integer

' fill the array with strings

Last = Range("A" & Rows.Count).End(xlUp).Row
ReDim arr(Last, 1)

For i = 0 To Last - 1

    arr(i, 0) = Cells(i + 1, 1).Value
    arr(i, 1) = Cells(i + 1, 2).Value


Next

' only one loop to display its contents !!!
Dim v As Variant

For Each v In arr

    Debug.Print v

Next


End Sub

イミディエイトウィンドウで以下の出力を確認できます

Name
A
B
C
D
E
F
G

Age
10
20
30
40
50
60
70
1
Swapnil

これを試して








'Define 2d array
arr = [ {"A",1; "B",2; "C",3 } ]: _
For r = LBound(arr, 1) To UBound(arr, 1): _
        For c = LBound(arr, 2) To UBound(arr, 2): _
            Debug.Print arr(r, c): _
       Next c: _
Next
1
user3235365

私はこれのために独自の関数を書きました。 VBAの場合はprint_r()。配列、辞書、コレクション、MatchCollectionなどを評価できます。全体もネストされます。さらに、データ型が指定され、特殊文字はUnicodeとして文字列に表示されます。

http://wiki.yaslaw.info/doku.php/vba/functions/print_r/index

print_r(array(1,2,3,array("A","B")))
<Variant()>  (
    [0] => <Integer> 1
    [1] => <Integer> 2
    [2] => <Integer> 3
    [3] => <Variant()>  (
        [0] => <String> 'A'
        [1] => <String> 'B'
    )
)

print_r([{1,2;3,4}])
<Variant()>  (
    [1.1] => <Double> 1
    [1.2] => <Double> 2
    [2.1] => <Double> 3
    [2.2] => <Double> 4
)
0
Yaslaw