<Sheet to Array> 「シート」を「配列」へ

「シート」を「配列」に入れるプロシージャです。

'*****************************************************
'* 「シート」を「配列」に入れるプロシージャ(2次元配列保証)
'* SheetName:シート名前
'* myArray:出力される配列(参照渡し)
'* RejectRw=1 とすると頭の1行目を除いた表が配列に入る
'* 1セル・1行・1列でも常に 2次元配列
'*****************************************************
Sub sheet_to_array(ByVal SheetName As String, ByRef myArray As Variant, Optional RejectRw As Long = 0)
    Dim ws As Worksheet
    Dim Target As Range
    Dim r As Long, c As Long
    Dim i As Long, j As Long
    Dim v As Variant
    
    Set ws = Worksheets(SheetName)
    Set Target = ws.UsedRange
    
    ' RejectRw が指定されていれば最初の行数を除外
    If Target.Rows.Count > RejectRw And RejectRw > 0 Then
        Set Target = Target.Resize(Target.Rows.Count - RejectRw).Offset(RejectRw)
    End If
    
    ' 範囲が空の場合は1x1の配列にする
    If Target.Cells.Count = 0 Then
        ReDim myArray(1 To 1, 1 To 1)
        myArray(1, 1) = ""
        Exit Sub
    End If
    
    ' 値を取得
    v = Target.Value
    
    ' 1セルだけの場合
    If Target.Cells.Count = 1 Then
        ReDim myArray(1 To 1, 1 To 1)
        myArray(1, 1) = v
        Exit Sub
    End If
    
    ' 複数セルの場合だが、1行または1列で1次元配列になっている場合
    If Target.Rows.Count = 1 Or Target.Columns.Count = 1 Then
        r = Target.Rows.Count
        c = Target.Columns.Count
        ReDim myArray(1 To r, 1 To c)
        
        For i = 1 To r
            For j = 1 To c
                myArray(i, j) = Target.Cells(i, j).Value
            Next j
        Next i
        Exit Sub
    End If
    
    ' 通常の複数行・複数列
    myArray = v
End Sub

「SheetName」のシートの使用しているすべてのセルを、配列にいれています。見出しなど、1行目が不要の場合は、「RejectRw=1」としてください。

このプロシージャの特徴、どのようなシートでも2次元配列に入ります。

  1. 1セルでも常に 2 次元配列
    • myArray(1,1) に値が入る
  2. 1行だけ / 1列だけでも 2 次元配列
    • 1行 × N列 → (1 To 1, 1 To N)
    • N行 × 1列 → (1 To N, 1 To 1)
  3. 複数行・複数列の場合
    • Excelの Range.Value をそのまま配列化
  4. RejectRw によるヘッダー行除外対応
    • 先頭行を除外して配列に格納可能
  5. 空シートの場合も 1×1 配列を返す
    • エラーを防ぐため空文字を格納

使用例は、次です。

Dim arr() As Variant

' シートを配列に入れる、テストプロシージャ。
Private Sub test、シートを配列に入れる()
    ' (SheetName, ByRef arr, Optional RejectRw = 0)
    Call sheet_to_array("TEST", arr)
End Sub

以下のような「TEST」シートで、これを実行すると、

「arr」の中は、以下の通りです。

「RejectRw=1」の使用例です。

Dim arr() As Variant

' シートを配列に入れる、テストプロシージャ、見出しを除く。
Private Sub test、シートを配列に入れる1()
    ' (SheetName, ByRef arr, Optional RejectRw = 0)
    Call sheet_to_array("TEST", arr, 1)
End Sub

これを実行すると、「arr」の中は、以下の通りです。1行目の見出しを除いたデータが配列に入ります。

本サイトに関連ある記事一覧

Follow me!