【VBA】ReDimステートメント
今回は動的配列とReDimステートメントについて解説します。タイトルクリエーターで作成した架空書籍の「表題」「著者」「出版社」の一覧表を使います。
「沖縄の大王」 | 嵩原勝伍 | 大和出版協会 |
「不死の鉄塔」 | 浜阪貴佑 | 大和書房 |
「異国読み書き」 | 斧渕咲樹 | ハスキー |
「隠されたジャズ」 | 平出将誉 | ブックフォレスト |
「苦悩する都市」 | 山辺吉亘 | 大和図書館協会 |
データを用意するのが面倒な人は表をコピーしてセル B2 に張り付けてください。
このデータを次のような要素の配列として取り込んでみます。
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) |
ただし、リストはユーザーさんが新たな項目を付け加えて、行数については変更されることも想定してコードを書きます。そのような場合に動的配列と Redim ステートメントを使用します。
'[VBA]Redimステートメントのサンプルコード(1) Option Base 1 Sub Book_List() '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ステートメントで配列の要素数を確定 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 ' 実行結果: '「沖縄の大王」 嵩原勝伍 大和出版協会 '「不死の鉄塔」 浜阪貴佑 大和書房 '「異国読み書き」 斧渕咲樹 ハスキー '「隠されたジャズ」 平出将誉 ブックフォレスト '「苦悩する都市」 山辺吉亘 大和図書館協会
Book_List() では二次元配列 mybook(y, x) を定義していますが、
Dim mybook() As String
では mybook を「文字列型の入る変数です」とだけ宣言し、この段階では次元数も要素数も決められていません。そして
lc = Cells(rc, 2).End(xlUp).Row
によって、リストの最終行の行番号 lc を得てから、
ReDim mybook(lc, 3)
によって次元数を 2 , それぞれの次元について要素数を lc , 3 とした配列を定めています。冒頭で用意した表を使えば lc には 5 が入りますが、表に項目を追加すれば lc の値は増えていきます。そのあと繰り返し処理によってこの 2 次元配列にセルのデータを格納しています。
選択したセルを含む列のデータを一次元配列に格納するプロシージャも載せておきます。
上図にある通り、見出しの部分は除きます。
よければ以下のサンプルデータを使ってください。
表題 | 著者 | 発行所 | 税込価格 |
---|---|---|---|
「世紀末名画」 | 藤久保大幹 | 押売ブッククラブ | 1120 |
「不思議なラブレター」 | 村野秀政 | 第四書館 | 1120 |
「大人のイレブン」 | 宝珠由太 | 欧文社 | 1730 |
「シロクマ笑い」 | 芝築地貴耶 | 黄昏児童館 | 1590 |
「日本の少女」 | 井出尾謙史郎 | ペガサス社 | 2620 |
「本日のダイヤモンド」 | 滝本哲央 | 大和文芸社 | 1740 |
「恐竜の花いちもんめ」 | 広砂豊士 | 角善 | 3980 |
「男前のインチキ」 | 森井敬紀 | こころ出版 | 3600 |
「ふれあい世界」 | 松岡喜芳 | 赤木書店 | 1860 |
「大宇宙の野球部」 | 記平真昂 | 旧大和出版社 | 2700 |
'[VBA] Redimステートメントのサンプルコード(2) 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ステートメントで要素数を確定 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
Rarray1D() を実行すると、選択されている列のデータが全て表示されるはずです。
コメント
【AI解説】VBAのReDimステートメントは配列サイズを再定義します
[ChatGPT] VBAのReDimステートメントは、配列のサイズを再定義するために使用されます。具体的には、既存の配列の要素数を変更するか、新しい配列を作成します。以下に、ReDimステートメントの使用方法といくつかの重要なポイントを説明します。
使用方法:ReDimステートメントは、変数宣言の一部として使用されることが一般的です。つまり、変数を宣言するときに配列を作成する場合に使用されます。以下に、ReDimステートメントの基本的な構文を示します。
arrayName: 配列の識別子であり、配列の要素にアクセスするために使用される名前です。
dimensions: 配列の各次元の要素数を指定するリストです。次元ごとに要素数をカンマで区切って指定します。
dataType: 配列の要素のデータ型を指定します。
以下は、ReDimステートメントを使用して配列を作成する例です。
この例では、myArrayという名前の整数型の配列を宣言し、ReDimステートメントを使用して要素数6の配列を作成しています(0から5までの6つの要素)。
重要なポイント:
・ReDimステートメントを使用して配列のサイズを変更すると、元の配列の内容は失われます。新しいサイズで初期化された配列が作成されます。したがって、必要な場合は、元の配列の要素をバックアップしておく必要があります。
・ReDimステートメントを使用して配列のサイズを拡大する場合、拡大された部分の要素は初期化され、デフォルトの値(整数型の場合は0、文字列型の場合は空文字列)が設定されます。
・配列の一部の次元の要素数のみを変更することもできます。その場合、変更された次元より後の次元の要素数はそのまま維持されます。
・既存の配列の要素数を減らす場合、その要素数に合わない既存の要素は失われます。