[VBA] 動的配列 ReDim ステートメントで要素数を確定します

動的配列 (ReDim ステートメントで要素数を確定します)

 今回は 動的配列と ReDim ステートメント について解説します。タイトルクリエーターで作成した架空書籍の「表題」「著者」「出版社」の一覧表を使って説明します。

「沖縄の大王」 嵩原勝伍 大和出版協会
「不死の鉄塔」 浜阪貴佑 大和書房
「異国読み書き」 斧渕咲樹 ハスキー
「隠されたジャズ」 平出将誉 ブックフォレスト
「苦悩する都市」 山辺吉亘 大和図書館協会

 データを用意するのが面倒な人は表をコピーしてセル B2 に張り付けてくださいな。

 Excel ユーザーが項目を追加する可能性のあるリスト

 このデータを次のような要素の配列として取り込んでみます。

mybook (1, 1) mybook (1, 2) mybook (1, 3)
mybook (2, 1) mybook (2, 2) mybook (2, 3)
mybook (3, 1) mybook (3, 2) mybook (3, 3)
mybook (4, 1) mybook (4, 2) mybook (4, 3)
mybook (5, 1) mybook (5, 2) mybook (5, 3)

 ただし、リストはユーザーさんが新たな項目を付け加えて、行数については変更されることも想定してコードを書きます。そのような場合に 動的配列 を使用するのです。

 Option Base 1

 '書籍データを配列に入れるマクロです

 Sub BookList()

 'mybook を文字列型データを格納する配列として宣言します
 Dim mybook() As String
 Dim rc As Long, lc As Long, i As Long

 'リストの最終行をカウントします
 rc = ActiveSheet.Rows.Count
 lc = Cells(rc, 2).End(xlUp).Row

 '配列の要素数を確定します
 ReDim mybook(lc, 3)

 For i = 1 To lc

  mybook(i, 1) = Cells(i, 2).Value
  mybook(i, 2) = Cells(i, 3).Value
  mybook(i, 3) = Cells(i, 4).Value

 Next i

 For i = 1 To lc

  Debug.Print mybook(i, 1), mybook(i, 2), mybook(i, 3)

 Next i

 End Sub

 BookList マクロを実行すると

 「沖縄の大王」    嵩原勝伍   大和出版協会
 「不死の鉄塔」    浜阪貴佑   大和書房
 「異国読み書き」   斧渕咲樹   ハスキー
 「隠されたジャズ」  平出将誉   ブックフォレスト
 「苦悩する都市」   山辺吉亘   大和図書館協会

というように、ワークシートの表と同じ並びで表示されます。
 

次元と要素数を確定しないで配列を宣言します

 このマクロでは mybook(y, x) という 2 次元配列を用いるのですが、

Dim mybook() As String

というコードでは mybook を「文字列型の入る変数です」とだけ宣言し、この段階では次元数も要素数も決められていません。そして

lc = Cells(rc, 2).End(xlUp).Row

によって、リストの最終行の行番号 lc を得てから、

ReDim mybook(lc, 3)

によって次元数を 2 , それぞれの次元について要素数を lc , 3 とした配列を定めています。冒頭で用意した表を使えば lc には 5 が入りますが、表に項目を追加すれば lc の値は増えていきます。そのあと繰り返し処理によってこの 2 次元配列にセルのデータを格納しています。
 

選択したセルを含む列のデータを配列に入れます

 選択したセルを含む列のデータを 1 次元配列に格納するプロシージャも載せておきます。

 選択セルを含む列データを 1 次元配列に入れるプロシージャ

 上図にある通り、見出しの部分は除きます。
 よければ以下のサンプルデータを使ってくださいな。

表題 著者 発行所 税込価格
「世紀末名画」 藤久保大幹 押売ブッククラブ 1120
「不思議なラブレター」 村野秀政 第四書館 1120
「大人のイレブン」 宝珠由太 欧文社 1730
「シロクマ笑い」 芝築地貴耶 黄昏児童館 1590
「日本の少女」 井出尾謙史郎 ペガサス社 2620
「本日のダイヤモンド」 滝本哲央 大和文芸社 1740
「恐竜の花いちもんめ」 広砂豊士 角善 3980
「男前のインチキ」 森井敬紀 こころ出版 3600
「ふれあい世界」 松岡喜芳 赤木書店 1860
「大宇宙の野球部」 記平真昂 旧大和出版社 2700
 '選択したセルを含む列のデータを配列に入れます

 Sub Rarray1D()

  Dim x As Variant
  Dim a() As Variant
  Dim k As Long, n As Long
  Dim y1 As Long, y2 As Long

  '選択されているセルが空白ならマクロ終了
  If Selection.Value = "" Then

   MsgBox "空白以外のセルを選択してください"

   Exit Sub

  End If

  '選択セルの列番号を取得
  x = Selection.Column

  '選択セルを含むデータ列の見出しの次の行番号を取得
  y1 = Selection.End(xlUp).Row + 1

  '選択セルを含むデータ列の最後のデータの行番号を取得
  y2 = Selection.End(xlDown).Row

  'データの数を計算
  n = y2 - y1 + 1

  '配列の要素数を決定
  ReDim a(n)

  '配列にデータを格納
  For k = y1 To y2

   a(k - y1 + 1) = Cells(k, x)

  Next k

  '以下は Debug なので動作を確認したら削除してください
  For k = 1 To n

   Debug.Print a(k)

  Next k

 End Sub

 実行すると、選択されている列のデータが全て表示されるはずです。

 ≫ VBA 辞典メニューに戻って他の記事も読んでくださいな~♪

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

コメントをどうぞ

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

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

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