#181 データ量に応じて配列のサイズを動的に変更する方法 VBA

通常、配列を使う場合には、次のようにあらかじめ配列のサイズを指定して宣言することが多いと思います。
Dim strCustmr(100) As String
配列のサイズがカッコ内に指定した要素数を超えないことが確かな場合にはこれでまったく問題ないのですが、状況によって、あるいは将来的に超える可能性がある場合には、この方法では思わぬエラーが発生したり、定期的にプログラムを変更しなければならない可能性も出てきてしまいます。かといって、あらかじめ余裕を見込んで大きなサイズを確保しておくのも無駄な話しです。そこでここでは、データ量に応じて配列のサイズを動的に変更する方法を紹介します。


次の例では、テーブル「顧客マスタ」の全レコードを読み込んで、顧客の「氏名」を配列にセットします。ポイントは、配列の宣言方法とReDimステートメントの使用です。テーブル「顧客マスタ」にはいったいいくつのレコードがあるのか分かりません。また、今後どれだけ増加するかも分かりません。このような場合は、配列のサイズをあらかじめ固定せず、”動的配列”として宣言します。そして、実際にテーブルを開いた段階で総レコード数を調べ、それに見合うだけの領域をその時点で確保するようにします。そうすれば、レコード数の増減にプログラムを柔軟に対応させることができます。
Dim dbs As Database
Dim rst As Recordset
'顧客氏名の配列を動的配列として宣言します
'(動的配列では配列の要素数を指定しません)
Dim strCustmr() As String
'配列添え字(=レコード番号)のカウンタ
Dim lngRecNum As Long

Set dbs = CurrentDb
'テーブルを開きます
Set rst = dbs.OpenRecordset("顧客マスタ")
With rst
  'レコード数分の配列領域を確保します
  ReDim strCustmr(1 To .RecordCount)
  '配列の最初の添え字を設定します
  lngRecNum = 1
  '全レコードを読み込むループ
  Do Until .EOF
    '氏名フィールドの値を配列にセットします
    strCustmr(lngRecNum) = !氏名
    '配列の添え字をインクリメントします
    lngRecNum = lngRecNum + 1
    .MoveNext
  Loop
  .Close
End With
  
'配列に格納されたすべての氏名データを表示します
'配列の最後(添え字の最大値)はUBound関数で取得します
For lngRecNum = 1 To UBound(strCustmr)
  Debug.Print lngRecNum, strCustmr(lngRecNum)
Next lngRecNum
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved