動的配列を使って複数のリストを連結します

 データベース研究所の記事ですよ。
 ワークシートに複数のテーブルがあって、場合によっては
「まとめて1つのリストとして扱いたいなあ」
と思うことがありますよねー。え? 別にない? ...... まあとにかく、今回は次のデータを使って説明しますよ。自分でやってみたい人はワークシートにコピーしてからテーブル変換して、テーブル名をそれぞれ「氏名1」、「氏名2」としてください。今回はこの2つのデータを1つの配列変数にまとめて放り込んでしまおうという記事なのです。

氏名 ふりがな
丸小野治作 まるおの じさく
白奥千恵子 しらおく ちえこ
宮ヶ丁金寿 みやがちょう かねひさ
伊関孝実 いせき たかみ
門垣暁 かどがき あかつき
氏名 ふりがな
能仁啓誌 のうにん けいし
翠川邦理 みどりかわ くにただ
夫馬朱 ふま あや
舌共康 ぜつ ともやす
一野谷時敏 いちのや ときとし

 

リスト連結マクロ

 元のデータが2つのリストなので、前回のように Variant 型変数にまとめて放り込むことはできません。 For...Next ステートメントで1つ1つ地道に格納していきます。

 Option Base 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つのまとまったデータとして扱うことができるようになります。

動的配列

 上のマクロはちょっと長いけど、やってることは単純なので、添えてあるコメント文で意味がわかると思います。今回注目すべきところはまず

Dim mydata() As String

という記述です。変数 mydata を配列として宣言しているのですが、() の中に要素数が入っていません。これはこの段階では要素数がいくつになるのかわからないので(上の例は要素数 10 と分かりますが、リストの行数が色々であることを想定しています)、敢えて要素数を定めないようにしているのです。そして2つのリストの行数を得た後に ReDim ステートメントを用いて

ReDim mydata(k, 2)

として改めて要素数を確定しています。このような配列を 動的配列 とよびます。「動的」という言葉を使うと何だか必要以上に難しく感じられるのですが(こばと的には、あまり良いネーミングセンスとは思えないな)、単に 要素数が変数になっている というだけの話です。

 ≫ データベース研究所

Google広告
スポンサーリンク
スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください