このサイトはCocoonを使っています。現在「ミックスブルー [作者: y.hiroaki氏]」スキンを適用中です(^^)/

Excel VBA 配列を使いこなすためのプチサンプル紹介します

スポンサーリンク

前回記事で解説したとおり、同じ種類のデータを番号付きで格納できるのが「配列」です。配列を覚えるとデータをまとめることが出来てVBAコードがスッキリします。取得した配列データを一瞬にしてシートのセルへ貼り付ける等で実行速度の向上にもつながります

くるみこ
くるみこ

配列の使い方は奥が深いので、実際に使っていきながら事例をたくさん知っておくことが大事です。そこで今回は、基本的な事例サンプルをたくさん紹介していくこととしますね(^^)

実際に使ってみるにしても、サンプルがあると助かっちゃいますね。
よろしくお願いしますm(_ _)m

前回のおさらいはこちらの記事です(^^)/ 下のカードをクリックすれば開きます

くるみこ
くるみこ

前回記事でわかった主なことは

・配列の宣言方法がわかりました
・配列の型宣言は変数と同じで、宣言をしない場合はバリアント型です
・配列のインデックスは指定しない場合は「0」から始まります

【この記事でわかること
・「配列」のいろいろな初期化方法がわかります

「配列」のいろいろな代入方法や配列データの使用方法がわかります
・「配列」内データのいろいろな処理方法がわかります

スポンサーリンク

配列を使いこなすためのサンプル集

配列変数は効率よく初期化して活用しよう

同じ配列変数をマクロ内の各所で使用する場合、必要に応じ初期化してから新たなデータを代入することが何回でも可能です。初期化の各種方法を知っていれば効率良くマクロを作成できます

空データを代入して初期化する方法

'空データを代入して初期化する方法
Sub ArraySample_01()
    Dim i As Long, j As Long
    Dim arr(5, 100) As String
    arr(1, 1) = "配列初期化テスト⓵"
    MsgBox "データ確認(" & arr(1, 1) & ")"
    For i = 0 To 5
        For j = 0 To 100
            arr(i, j) = ""   '空白を代入して消しています
        Next
    Next
    MsgBox "データ確認(" & arr(1, 1) & ")"
End Sub

ReDim で宣言を再設定して初期化する方法

'ReDim で宣言を再設定して初期化する方法
Sub ArraySample_02()
    ReDim arr(5, 100) As String
    arr(1, 1) = "配列初期化テスト⓶"
    MsgBox "データ確認(" & arr(1, 1) & ")"
    ReDim arr(5, 100)    'ReDimで再宣言して消しています
    MsgBox "データ確認(" & arr(1, 1) & ")"
End Sub

Eraseステートメントで初期化する方法

'Eraseステートメントで配列データを初期化する方法
Sub ArraySample_03()
    Dim arr(5, 100) As String
    arr(1, 1) = "配列初期化テスト"
    MsgBox "データ確認(" & arr(1, 1) & ")"
    Erase arr            'Eraseステートメントで消去しています
    MsgBox "データ確認(" & arr(1, 1) & ")"
End Sub

Join関数で配列要素を連結して1個の文字変数にする

Join関数 は文字列型配列の要素(文字列)を、指定した区切り文字で連結させ、1つの文字列として返します。配列変数を普通の変数に変えて処理したい時に使用できる便利な関数です。ただし、二次元配列ではJoin関数は使えませんので注意が必要です

Join関数で配列要素を連結する方法

'Join関数で配列要素を連結する方法
Sub ArraySample_04()
    Dim arr(2) As String
    Dim arrStr As String
    arr(0) = "ABC"
    arr(1) = "DEF"
    arr(2) = "GHI"
 
    '区切り文字の指定しない(この場合はスペースが入る)
    arrStr = Join(arr) & vbCrLf                 'ABC DEF FHI
    '区切り文字を空白に指定
    arrStr = arrStr & Join(arr, "") & vbCrLf    'ABCDEFFHI
    '区切り文字に「|」を指定
    arrStr = arrStr & Join(arr, "|") & vbCrLf   'ABC|DEF|FHI
    '区切り文字を改行に指定
    arrStr = arrStr & Join(arr, vbCrLf) & vbCrLf 'ABC
                                                 'DEF
                                                 'FHI
    MsgBox arrStr
End Sub

Array関数は配列へデータを一括代入できます

Array関数の使用方法

Array関数は、配列が格納されたバリアント型の値を返します
通常は配列にデータを代入する場合、インデックス番号を指定して1つ1つ代入します。しかし、バリアント型の変数を用意して、配列の中身をArray関数を使ってまとめて代入することが可能です

'Array関数で配列を一括代入
Sub ArraySample_05()
    Dim n As Long
    Dim tgDate As Date, inDate As String
    Dim youbi As Variant
    youbi = Array("日", "月", "火", "水", "木", "金", "土")
    inDate = InputBox("「年/月/日」を入力して下さい!")
    If IsDate(inDate) Then
        tgDate = CDate(inDate)
        tgDate = Format(tgDate, "yyyy""年""mm""月""dd""日""")
    Else
        MsgBox "「年/月/日」が入力されませんでした!"
        Exit Sub
    End If
    n = Weekday(tgDate)
    MsgBox tgDate & " は " & youbi(n - 1) & "曜日です!"
End Sub

・7行目、InputBox で年月日の入力を求めます
・15行目、Weekday 関数で曜日番号を調べます

セルの範囲データをまとめて配列へ代入

セル範囲のデータをまとめて、バリアント型の2次元の配列へ代入できます
次のサンプルは、”Sheet1″のデータを配列に入れ、”Sheet3″へ取得データを書き出しています

'セル範囲データをまとめて配列へ代入する
Sub ArraySample_06()
    Dim db As Variant      'セルデ-タ処理
    Dim i As Long, j As Long 'Loopカウンタ
    Dim endr As Long        '最終行
    Dim endc As Long        '最終列
    Dim a As String
 
    'セル範囲取得
    With ThisWorkbook.Sheets("Sheet1")
        endr = .Cells.SpecialCells(xlCellTypeLastCell).Row
        endc = .Cells.SpecialCells(xlCellTypeLastCell).Column

        ReDim db(endr, endc)
        'CurrentRegionプロパティでセル範囲の値を代入
        db = .Range("A1").CurrentRegion.Value
    End With
 
    With ThisWorkbook.Sheets("Sheet3")
        .Cells(1, 1) = "dt = new Array();"
        For i = 1 To endr
            a = "dt[" & i & "] = |"
            For j = 1 To endc
                a = a & db(i, j) & "|"
            Next
            .Cells(i + 1, 1) = a
        Next
    End With
End Sub

配列のデータを別シートのセルに書き出す

シートのセル範囲データを配列へ取り込み、その配列を別のシートに書き込むサンプルです
次のサンプルは、”Sheet1″のデータを配列に入れ、”Sheet2”へ表のまま書き出しています

'セル範囲データを別シートのセルに書き出す
Sub ArraySample_07()
    Dim db() As Variant      'セルデ-タ処理
    Dim i As Long, j As Long 'Loopカウンタ
    Dim endr As Long        '最終行
    Dim endc As Long        '最終列
 
    'セル範囲取得
    With ThisWorkbook.Sheets("Sheet1")
        endr = .Cells.SpecialCells(xlCellTypeLastCell).Row
        endc = .Cells.SpecialCells(xlCellTypeLastCell).Column

        ReDim db(endr, endc)
        'CurrentRegionプロパティでセル範囲の値を代入
        db = .Range("A1").CurrentRegion.Value
    End With
 
    With ThisWorkbook.Sheets("Sheet2")
        For i = 1 To endr
            For j = 1 To endc
                .Cells(i, j) = db(i, j)
            Next
        Next
    End With
End Sub

配列内データを処理するサンプル例

データの処理や加工を行う場合、セルデータをそのまま制御するより、1度配列へ格納して配列変数を使って処理すれば実行速度が向上します。その配列データ処理のサンプルを紹介します

配列内のランダムデータを昇順に並び替える

データを配列変数へ代入した後、そのデータを昇順に並び替えたいケースがあります。次のサンプルは、1次元の配列内データを昇順に並び替える処理です。(このサンプルの例を活用して2次元配列の並べ替えにも使用することができます)

'配列内のランダムなデータを昇順に並び替える
Sub ArraySample_08()
    Dim dat(10) As Long, damy As Long
    Dim i As Long, j As Long
    'サンプル数字をランダムに代入
    dat(1) = 3: dat(2) = 1: dat(3) = 8
    dat(4) = 0: dat(5) = 9:    dat(6) = 4
    dat(7) = 2: dat(8) = 5: dat(9) = 7: dat(10) = 6
    '昇順に並べ替えする
    For i = 1 To 10
        For j = i + 1 To 10
            If dat(i) > dat(j) Then
                damy = dat(i)
                dat(i) = dat(j)
                dat(j) = damy
            End If
        Next
    Next
    MsgBox dat(1) & " " & dat(2) & " " & dat(3) & " " _
            & dat(4) & " " & dat(5) & " " & dat(6) _
            & " " & dat(7) & " " & dat(8) & " " & _
            dat(9) & " " & dat(10)
End Sub

・If ステートメント条件式の <> を逆にすれば昇順・降順を入れ替えることができます

配列内のランダムデータを降順に並び替える

 こちらは降順に並び替えるサンプルですが、配列をArray関数で作成しています

'Array関数を使った配列内のランダムなデータを降順に並び替える
Sub ArraySample_09()
    Dim dat As Variant, damy As Long
    Dim r As Long, j As Long
    'Array関数でランダムなサンプル数字を代入
    dat = Array(3, 1, 8, 0, 9, 4, 2, 5, 7, 6)
    '降順に並べ替える
    For j = 0 To 9
        For r = 9 To j Step -1
            If dat(j) < dat(r) Then
                damy = dat(j)
                dat(j) = dat(r)
                dat(r) = damy
            End If
        Next
    Next
    MsgBox dat(0) & " " & dat(1) & " " & dat(2) _
            & " " & dat(3) & " " & dat(4) _
            & " " & dat(5) & " " & dat(6) & " " _
            & dat(7) & " " & dat(8) & " " & dat(9)
End Sub

・こちらも、Ifの<>を逆にすれば同じ昇順に変更できます

配列要素の特定インデックスへデ-タを挿入する

配列要素は別なデ-タを入れると、それ以降の要素が1個後ろへずらされます(割り込ませるという感じです)
次のサンプルでは3番目(0から始まるので4個目)に”+”を入れて、それ以降をずらしています

'配列要素の特定インデックスへデ-タを挿入する
Sub ArraySample_10()
    Dim dat As Variant
    Dim i As Long
    'サンプル文字を(最後に空白を入れて)Array関数で一括代入
    dat = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "")
    '4番目(0から始まるので)に文字(+)を追加
    dat(3) = "+"
    '変更状況を表示
    MsgBox dat(0) & " " & dat(1) & " " & dat(2) & " " _
        & dat(3) & " " & dat(4) & " " & dat(5) & " " _
        & dat(6) & " " & dat(7) & " " & dat(8) & " " _
        & dat(9) & " " & dat(10)
End Sub

配列内の途中にあるブランクデータを詰め

配列の中に余分なデータがある場合そのデータを削除して配列要素を詰めたいことがあります
次のサンプルは余分なブランクデータを削除して配列をつめる処理です

'配列内の途中にあるブランクデータを詰める
Sub ArraySample_11()
    Dim dat As Variant
    Dim i As Long, j As Long
    'サンプル文字を(6番目に空白を入れて)Array関数で一括代入
    dat = Array("A", "B", "C", "D", "E", "", "F", "G", "H", "I", "J")
    '空白を探して詰める処理
    For i = 0 To 9
        If dat(i) = "" Then
            For j = i To 9
                dat(j) = dat(j + 1)
            Next
        End If
    Next
    '変更状況を表示
    MsgBox dat(0) & " " & dat(1) & " " & dat(2) & " " _
        & dat(3) & " " & dat(4) & " " & dat(5) & " " _
        & dat(6) & " " & dat(7) & " " & dat(8) & " " & dat(9)
End Sub

一次元配列データをセルに表形式で記入する

次のサンプルは、配列データの内容を直接処理するものではありませんが、配列データをセルへ書き込む例として、算術演算子「\」(割り算の整数[余りはカット])と「Mod」(割り算の余り[整数部はカット])を使って「行」と「列」の指定に活用すれば、簡単に表形式で書き込むことができます

'配列内データをセルに1行5列に記入例
Sub ArraySample_12()
    Dim dat As Variant
    Dim i As Long, r As Long, c As Long
    dat = Array("A", "B", "C", "D", "E", _
                "F", "G", "H", "I", "J", _
                "0", "1", "2", "3", "4", _
                "5", "6", "7", "8", "9", _
                "A", "B", "C", "D", "E", _
                "F", "G", "H", "I", "J")
    '列は「Mod」割り算の余り、行は「\」割り算の商
    For i = 1 To 30
        c = (i - 1) Mod 5 + 1
        r = (i - 1) \ 5 + 1
        Cells(r, c) = dat(i - 1)
    Next
End Sub

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
今回の記事では実行例の「画像」などは割愛しました!
実際に動かして確認してもらいたいという思いからです。是非、動かしてみてください!

まとめと感想など

くるみこ
くるみこ

今回は、配列を使いこなすために有効活用できるようなプチサンプルをたくさん紹介しました。今後のプログラミングの参考にしてください(^^)

すごく勉強になりました!

使いこなせるようになるまでしっかり復習していきます!

くるみこ
くるみこ

配列はまだまだ奥が深いのでしっかり頑張ってくださいね(^^)/
次回も配列に関連する内容で解説を継続したいと思います!

この記事で紹介したプチサンプルの項目を列記してまとめとします
・配列データの初期化例
・Join関数で配列データをつないで1個の文字変数にする例
・Array関数で配列へデータを一括代入する例
・セル範囲データをまとめて配列へ代入する例
・配列データをまとめてセルへ書き込む例
・配列内データを処理するマクロ例
・昇順・降順に並び替える例
・配列内のにデータを挿入する例
・配列内のブランクデータを詰める例
・配列内データをセルに表形式で書き込む例

マクロ(VBA)を実行する際は必ずバックアップを取ってから行ってください
・マクロ(VBA)は実行後にファイルを保存すると元に戻すことはできません!
・実行後にファイルを保存せず終了すれば、実行前に戻すことができます!


ブログランキングに参加しています(^^)応援よろしくお願いしますm(_ _)m

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
当面は「初心者向けマクロVBA」の記事を継続して書いていきます

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう現在検討中です
・その他雑記的に「小ネタなどいろいろ」・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください

スポンサーリンク

スポンサーリンク