0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AccessのVBAで配列を扱う際の基礎知識(固定長、可変長)

Last updated at Posted at 2023-05-06

固定長(その1)

変数宣言時には要素数を指定せず、 Array() で初期化する方法。

動作確認用サンプルコード
Dim arr_1_() As Variant
arr_1_ = Array("あ", "い", "う")

Dim val_1_ As Variant
For Each val_1_ In arr_1_
    Debug.Print val_1_ & " ですね"
Next

要素数が多くなったり、要素の値が長いと Array() が横にどんどん長くなってしまう。
(コードの可読性が落ちる)
また、後述のような注意点もある。

変数はVariantで宣言が必要

下記コードはコンパイルエラーにならない、しかし…

コンパイルは通るのに実行時に例外となるサンプル
Dim arr_1_() As String
arr_1_ = Array("あ", "い", "う")

実行時に下記のように例外になってしまう。
image.png
image.png

固定長(その2)

『最大インデックス』を指定して変数宣言する方法。
『要素数』ではなく『最大インデックス』なので注意。

動作確認用サンプルコード
Dim arr_2_(2) As String
arr_2_(0) = "いち"
arr_2_(1) = "にー"
arr_2_(2) = "さん"

Dim val_2_ As Variant
For Each val_2_ In arr_2_
    Debug.Print val_2_ & " ですね"
Next

可変長

ReDim Preserve を使って配列を再定義。

動作確認用サンプルコード
Dim arr_3_() As String

Dim i_ As Long
For i_ = 0 To 2

    'ReDimで配列を再定義できる。
    'しかし、ReDim『だけ』だとそれまで入っていた要素を全て消してしまう。
    'なので、 Preserveを付けている。
    ReDim Preserve arr_3_(i_)

    'UBound()で配列の『最大インデックス』が取得できる。
    arr_3_(UBound(arr_3_)) = (i_ + 1) & "ばんめ"

Next

Dim val_3_ As Variant
For Each val_3_ In arr_3_
    Debug.Print val_3_ & " ですね"
Next

実行結果は下記。
image.png

変数宣言時に最大インデックス指定するとコンパイルエラー

image.png

蛇足

『固定長(その1)』は一見便利そうだが、『人が気を付けてコーディングする必要がある』という点があるのでやめた方がいい。

『固定長(その2)』は『要素が固定』という前提が崩れることがほぼゼロ%が場合に限りアリ。

要素が動的に変わる(変わる余地がありそう)なら、配列ではなく連想配列(Scripting.Dictionary)を使った方がいい。

参考サイトさん

バージョン

Windows 10 Pro 22H2 19045.2913
Microsoft Access for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?