データベース研究所の記事ですよ。
ワークシートに複数のテーブルがあって、場合によっては
「まとめて1つのリストとして扱いたいなあ」
と思うことがありますよねー。え? 別にない? ...... まあとにかく、今回は次のデータを使って説明しますよ。自分でやってみたい人はワークシートにコピーしてからテーブル変換して、テーブル名をそれぞれ「氏名1」、「氏名2」としてください。今回はこの2つのデータを1つの配列変数にまとめて放り込んでしまおうという記事なのです。
氏名 | ふりがな |
---|---|
丸小野治作 | まるおの じさく |
白奥千恵子 | しらおく ちえこ |
宮ヶ丁金寿 | みやがちょう かねひさ |
伊関孝実 | いせき たかみ |
門垣暁 | かどがき あかつき |
氏名 | ふりがな |
---|---|
能仁啓誌 | のうにん けいし |
翠川邦理 | みどりかわ くにただ |
夫馬朱 | ふま あや |
舌共康 | ぜつ ともやす |
一野谷時敏 | いちのや ときとし |
リスト連結マクロ
元のデータが2つのリストなので、前回のように Variant 型変数にまとめて放り込むことはできません。 For...Next ステートメントで1つ1つ地道に格納していきます。
Sub リスト連結()
Dim i As Integer, j As Integer
Dim k As Integer, ct As Integer
Dim mydata() As String
Dim myrg1 As Range, myrg2 As Range
'2つのリストそれぞれの行数を得ます
i = ActiveSheet.ListObjects("氏名1").ListRows.Count
j = ActiveSheet.ListObjects("氏名2").ListRows.Count
'2つのテーブルの行数を足します
k = i + j
'リストのデータ部分だけを変数に入れます
Set myrg1 = ActiveSheet.ListObjects("氏名1").DataBodyRange
Set myrg2 = ActiveSheet.ListObjects("氏名2").DataBodyRange
'配列の要素数を決めます
ReDim mydata(k, 2)
'「氏名1」のデータを配列に入れます
For ct = 1 To i
mydata(ct, 1) = myrg1.Cells(ct, 1)
mydata(ct, 2) = myrg1.Cells(ct, 2)
Next ct
'「氏名2」のデータを配列に入れます
For ct = i + 1 To k
mydata(ct, 1) = myrg2.Cells(ct - i, 1)
mydata(ct, 2) = myrg2.Cells(ct - i, 2)
Next ct
'連結されたリストの全データを出力します
For ct = 1 to k
Debug.Print mydata(ct, 1),mydata(ct,2)
Next
End Sub
マクロを実行するとイミディエイトウィンドウに「氏名1」と「氏名2」の全てのデータが表示されます。このようなマクロを動かすと、ワークシートでは見えませんが、配列 mydata を1つのまとまったデータとして扱うことができるようになります。
動的配列
上のマクロはちょっと長いけど、やってることは単純なので、添えてあるコメント文で意味がわかると思います。今回注目すべきところはまず
という記述です。変数 mydata を配列として宣言しているのですが、() の中に要素数が入っていません。これはこの段階では要素数がいくつになるのかわからないので(上の例は要素数 10 と分かりますが、リストの行数が色々であることを想定しています)、敢えて要素数を定めないようにしているのです。そして2つのリストの行数を得た後に ReDim ステートメントを用いて
として改めて要素数を確定しています。このような配列を 動的配列 とよびます。「動的」という言葉を使うと何だか必要以上に難しく感じられるのですが(こばと的には、あまり良いネーミングセンスとは思えないな)、単に 要素数が変数になっている というだけの話です。