当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【VBA】動的配列とReDimステートメント

【VBA】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)

ただし、リストはユーザーさんが新たな項目を付け加えて、行数については変更されることも想定してコードを書きます。そのような場合に動的配列と 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 次元配列にセルのデータを格納しています。

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

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

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

表題 著者 発行所 税込価格
「世紀末名画」 藤久保大幹 押売ブッククラブ 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() を実行すると、選択されている列のデータが全て表示されるはずです。

コメント

  1. あとりえこばと より:

    【AI解説】VBAのReDimステートメントは配列サイズを再定義します

    [ChatGPT] VBAのReDimステートメントは、配列のサイズを再定義するために使用されます。具体的には、既存の配列の要素数を変更するか、新しい配列を作成します。以下に、ReDimステートメントの使用方法といくつかの重要なポイントを説明します。

    使用方法:ReDimステートメントは、変数宣言の一部として使用されることが一般的です。つまり、変数を宣言するときに配列を作成する場合に使用されます。以下に、ReDimステートメントの基本的な構文を示します。

    Sub RedimSample()
        Dim arrayName(dimensions) As dataType
        ReDim arrayName(dimensions)
    End Sub

    arrayName: 配列の識別子であり、配列の要素にアクセスするために使用される名前です。

    dimensions: 配列の各次元の要素数を指定するリストです。次元ごとに要素数をカンマで区切って指定します。

    dataType: 配列の要素のデータ型を指定します。
    以下は、ReDimステートメントを使用して配列を作成する例です。

    Sub RedimSample2()
        Dim myArray() As Integer ' 配列の宣言
        ReDim myArray(5) ' 要素数6の配列を作成
    End Sube

    この例では、myArrayという名前の整数型の配列を宣言し、ReDimステートメントを使用して要素数6の配列を作成しています(0から5までの6つの要素)。

    重要なポイント:
    ・ReDimステートメントを使用して配列のサイズを変更すると、元の配列の内容は失われます。新しいサイズで初期化された配列が作成されます。したがって、必要な場合は、元の配列の要素をバックアップしておく必要があります。

    ・ReDimステートメントを使用して配列のサイズを拡大する場合、拡大された部分の要素は初期化され、デフォルトの値(整数型の場合は0、文字列型の場合は空文字列)が設定されます。

    ・配列の一部の次元の要素数のみを変更することもできます。その場合、変更された次元より後の次元の要素数はそのまま維持されます。
     
    ・既存の配列の要素数を減らす場合、その要素数に合わない既存の要素は失われます。

タイトルとURLをコピーしました