22

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

4

8 に答える 8

31

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

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

  1. VBA IDEで、[表示]メニュー>[ローカルウィンドウ]をクリックします
  2. [ローカル]ペインで、配列名を見つけます。 ここに画像の説明を入力してください
  3. ノードを展開して値を見つけます。ノードは、アレイのタイプによって異なります。

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

ここに画像の説明を入力してください

ここに画像の説明を入力してください

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

于 2016-07-12T18:10:14.750 に答える
12

誰かが参照できるように、これを行うための簡単なループを作成しました。

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
于 2014-06-04T12:07:07.180 に答える
10

いいえ、どちらかを行う必要があります。

  • ループしてデバッグウィンドウに出力する関数を作成して呼び出します。
  • これがデバッグ用の場合は、IDEの変数を右クリックして[ウォッチの追加]をクリックすると、配列の値の変更を追跡し、ブレークポイントに到達したときにその内容を表示するウィンドウが表示されます。
于 2013-01-11T12:06:16.823 に答える
1

列B(年齢)の列A(名前)のデータの下に貼り付けます

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
于 2016-12-27T10:23:40.030 に答える
1

これを試して

code1の代わりにcode1:code2と入力することもできます。_これは、 arrがarray(array(、)、array(、)...)として定義されている場合
にのみ表示され、c = Lbound (arr(r)、 1)to ubound(arr(r)、1) Debug.Print arr(r)(c) 最初は2d配列で、最後は1番目の配列であるため。 私





'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
于 2018-01-10T05:15:11.210 に答える
1

このメソッドは、配列を即時デバッグウィンドウに出力します。列の幅を自動調整し、列の輪郭を右側に表示して、同じ列の数値を比較しやすくします。

Public Sub Array2DToImmediate(ByVal arr As Variant, _
                                Optional ByVal spaces_between_columns As Long = 2, _
                                Optional ByVal NrOfColsToOutlineLeft As Long = 2)
'Prints a 2D-array of values to a table (with same sized column widhts) in the immmediate window

'Each character in the Immediate window of VB Editor (CTRL+G to show) has the same pixel width,
'thus giving the option to output a proper looking 2D-array (a table with variable string lenghts).
Dim i As Long, j As Long
Dim arrMaxLenPerCol() As Long
Dim str As String
Dim maxLength As Long: maxLength = 198 * 1021& 'capacity of Immediate window is about 200 lines of 1021 characters per line.

'determine max stringlength per column
ReDim arrMaxLenPerCol(UBound(arr, 1))
For i = LBound(arr, 1) To UBound(arr, 1)
    For j = LBound(arr, 2) To UBound(arr, 2)
        arrMaxLenPerCol(i) = IIf(Len(arr(i, j)) > arrMaxLenPerCol(i), Len(arr(i, j)), arrMaxLenPerCol(i))
    Next j
Next i

'build table
For j = LBound(arr, 2) To UBound(arr, 2)
    For i = LBound(arr, 1) To UBound(arr, 1)
        'outline left --> value & spaces & column_spaces
        If i < NrOfColsToOutlineLeft Then
            On Error Resume Next
            str = str & arr(i, j) & space$((arrMaxLenPerCol(i) - Len(arr(i, j)) + spaces_between_columns) * 1)
        
        'last column to outline left --> value & spaces
        ElseIf i = NrOfColsToOutlineLeft Then
            On Error Resume Next
            str = str & arr(i, j) & space$((arrMaxLenPerCol(i) - Len(arr(i, j))) * 1)
                    
        'outline right --> spaces & column_spaces & value
        Else 'i > NrOfColsToOutlineLeft Then
            On Error Resume Next
            str = str & space$((arrMaxLenPerCol(i) - Len(arr(i, j)) + spaces_between_columns) * 1) & arr(i, j)
        End If
    Next i
    str = str & vbNewLine
    If Len(str) > maxLength Then GoTo theEnd
Next j

theEnd:
'capacity of Immediate window is about 200 lines of 1021 characters per line.
If Len(str) > maxLength Then str = Left(str, maxLength) & vbNewLine & " - Table to large for Immediate window"
Debug.Print str
End Sub

たとえば出力のサブ:

Sub testArray2DToImmediate()
Dim ar() As Variant
ReDim ar(1 To 5, 1 To 4)

ar(1, 1) = "ID": ar(2, 1) = "Name": ar(3, 1) = "Values1": ar(4, 1) = "Values2": ar(5, 1) = "Values3"
ar(1, 2) = 1: ar(2, 2) = "Example where only": ar(3, 2) = FormatNumber(123 * 123#, 2): ar(4, 2) = 89: ar(5, 2) = "Wow"
ar(1, 3) = 2: ar(2, 3) = "first 2 columns are": ar(3, 3) = FormatNumber(234 * 234#, 2): ar(4, 3) = 456789: ar(5, 3) = "Nice"
ar(1, 4) = 3: ar(2, 4) = "outlined Left": ar(3, 4) = FormatNumber(567 * 567#, 2): ar(4, 4) = 123456789: ar(5, 4) = "Table":

Array2DToImmediate ar
End Sub

出力例:

ID  Name                    Values1    Values2  Values3
1   Example where only    15.129,00         89      Wow
2   first 2 columns are   54.756,00     456789     Nice
3   outlined Left        321.489,00  123456789    Table
于 2021-06-11T09:47:50.247 に答える
0

次の手順では、関数を使用して配列をイミディエイトウィンドウに出力します。この関数は、配列を行ごとに文字列に変換します。

Sub test()
'declare the 2D array
   Dim intA(0 To 2, 0 To 3) As Integer
'populate the array
   intA(0, 0) = 45:   intA(0, 1) = 50:   intA(0, 2) = 55:   intA(0, 3) = 60
   intA(1, 0) = 65:   intA(1, 1) = 70:   intA(1, 2) = 75:   intA(1, 3) = 80
   intA(2, 0) = 85:   intA(2, 1) = 90:   intA(2, 2) = 95:   intA(2, 3) = 100
Debug.Print Print2DArrayToImmediate(intA)

' <<<<<<<<<<    Or  >>>>>>>>>>
Dim myarr()
myarr = Range("A1:C5").Value
Debug.Print Print2DArrayToImmediate(myarr)

End Sub

Function Print2DArrayToImmediate(arr)
Dim arrStr As String, x As Long, y As Long
arrStr = ""

For i = LBound(arr, 1) To UBound(arr, 1)
    If LBound(arr, 1) = 0 Then i = i + 1
    arrStr = arrStr & vbCrLf
    arrStr = arrStr & Join(Application.Index(arr, i, 0), vbTab & vbTab)
Next i

Print2DArrayToImmediate = arrStr
End Function

ここに画像の説明を入力してください

于 2021-07-03T06:45:35.367 に答える
-1

このために独自の関数を作成しました。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
)
于 2018-11-08T14:11:22.923 に答える