前回記事で解説したとおり、同じ種類のデータを番号付きで格納できるのが「配列」です。配列を覚えるとデータをまとめることが出来て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
まとめ(おわりに)
・いかがでしたでしょうか?
・今回の記事では実行例の「画像」などは割愛しました!
・実際に動かして確認してもらいたいという思いからです。是非、動かしてみてください!
まとめと感想など
今回は、配列を使いこなすために有効活用できるようなプチサンプルをたくさん紹介しました。今後のプログラミングの参考にしてください(^^)
すごく勉強になりました!
使いこなせるようになるまでしっかり復習していきます!
配列はまだまだ奥が深いのでしっかり頑張ってくださいね(^^)/
次回も配列に関連する内容で解説を継続したいと思います!
・マクロ(VBA)を実行する際は必ずバックアップを取ってから行ってください!
・マクロ(VBA)は実行後にファイルを保存すると元に戻すことはできません!
・実行後にファイルを保存せず終了すれば、実行前に戻すことができます!
★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★
今後の記事について
今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
当面は「初心者向けマクロVBA」の記事を継続して書いていきます
【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう現在検討中です
・その他雑記的に「小ネタなどいろいろ」・・・・・
・今後の記事にもご期待ください(^^)/
記事のサンプルファイルをダウンロードできます
この記事のサンプルはこのリンク先からダウンロードできます!
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください
この記事で紹介したプチサンプルの項目を列記してまとめとします
・配列データの初期化例
・Join関数で配列データをつないで1個の文字変数にする例
・Array関数で配列へデータを一括代入する例
・セル範囲データをまとめて配列へ代入する例
・配列データをまとめてセルへ書き込む例
・配列内データを処理するマクロ例
・昇順・降順に並び替える例
・配列内のにデータを挿入する例
・配列内のブランクデータを詰める例
・配列内データをセルに表形式で書き込む例