和風スパゲティのレシピ

日本語でコーディングするExcelVBA

配列を新規シートに出力して中身を確認する

VBAで配列を扱うときに困るのが、中身を確認するのにひと手間かかることです。

シートと違ってすぐに値を見ることができませんし、
ローカルウィンドウを使っても表形式では見せてくれません。


この対策として「配列を新規シートに出力する」マクロを用意するのがおすすめです。


ワークシートに書き出せば視覚的にもとても見やすくなりますし、
オートフィルターを付けるだけでソートや検索も使えるようになります。


デバッグ作業のいいお供になりますので、汎用関数に追加してみてください。

ソースコード

' 一次元配列 → 新規シート
Sub 一次元配列を新規シートに出力する(一次元配列 As Variant, Optional 配列名 As String = "配列")
    
    ' 新規シートを出力してシート名を配列名に
    Dim ws As Worksheet
    Set ws = Workbooks.Add.Worksheets(1)
    ws.Name = 配列名
    
    ' 縦方向に出力
    Dim 要素数 As Long: 要素数 = UBound(一次元配列) - LBound(一次元配列) + 1
    ws.Range("A1").Value = 配列名
    ws.Range("A2").Resize(要素数) = GetArray一次元配列→n行1列の二次元配列(一次元配列)
    
    ' フィルターを設置
    ws.Rows(1).AutoFilter
    
    ' 全セルをセンタリング
    ws.Cells.HorizontalAlignment = xlCenter
    
End Sub

' 一次元配列 → 二次元配列
Function GetArray一次元配列→n行1列の二次元配列(Arr As Variant) As Variant
    
    Dim 生成配列()
    ReDim 生成配列(LBound(Arr) To UBound(Arr), 1 To 1)
    
    Dim i As Long
    For i = LBound(Arr) To UBound(Arr)
        生成配列(i, 1) = Arr(i)
    Next
    
    GetArray一次元配列→n行1列の二次元配列 = 生成配列
    
End Function

' 二次元配列 → 新規シート
Sub 二次元配列を新規シートに出力する(二次元配列 As Variant, Optional 配列名 As String = "配列")
    
    ' 新規シートを出力してシート名を配列名に
    Dim ws As Worksheet
    Set ws = Workbooks.Add.Worksheets(1)
    ws.Name = 配列名
    
    ' 要素番号を見出しに使用
    Dim i As Long, C As Long: C = 1
    For i = LBound(二次元配列, 2) To UBound(二次元配列, 2)
        ws.Cells(1, C).Value = "要素" & i
        C = C + 1
    Next
    
    ' 配列をセルに出力
    Dim 行数 As Long: 行数 = UBound(二次元配列, 1) - LBound(二次元配列, 1) + 1
    Dim 列数 As Long: 列数 = UBound(二次元配列, 2) - LBound(二次元配列, 2) + 1
    ws.Range("A2").Resize(行数, 列数) = 二次元配列

    ' フィルターを設置
    ws.Rows(1).AutoFilter

    ' 全セルをセンタリング
    ws.Cells.HorizontalAlignment = xlCenter

End Sub

解説

中身は基本的な「配列をセルに書き出す」コードです。

配列→セル出力の基本コードについてはこちらをご覧ください。
www.limecode.jp


一次元配列を横に書き出してもオートフィルターは使えないので、
縦に出力してオートフィルターを設置しています。


縦に出力する場合は、要素数が少ないときは

ws.Range("A2").Resize(要素数) =WorksheetFunction.Transpose(一次元配列)

これで一発なのですが、Transpose関数は要素数上限が65,536であるため、
ここはしっかり「一次元配列→二次元配列」の関数を作って対応しています。

※ Transpose上限の詳しい解説はこちらをどうぞ
www.limecode.jp


デバッグ用の関数ということで大事にしたいのが、

ws.Name = 配列名

この「配列の名称をシート名に設定する」機能です。


このコードをマクロ本体やイミディエイトウィンドウで実行する際に、

Call 二次元配列を新規シートに出力する(Arr品物リスト, "Arr品物リスト")

このように変数名も文字列として渡しておくことで、

配列を新規シートに出力

こんな風に変数名がシート名になってデバッグが捗ります。


なかなか重宝する機能ですので是非ご活用ください。