「vba 配列 1から インデックス ずらす」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
VBA(Visual Basic for Applications)では、
モジュールの宣言部分に
Option Base 1
と書いたり、配列変数の宣言時に
ReDim arr(1 to n)
のような書き方をすることで、配列の添え字・インデックスの最小値を「1」にすることができますが、Split関数を使った場合は、インデックスの最小値が必ず「0」になります。
配列のインデックス・添え字の最小値を1にするサンプルマクロ
ですがExcel VBAの場合は、配列の添え字・インデックスの最小値は「1」のほうが扱いやすいことが多いので、「1」を最小値にしたいという要望が出てくるのは、とても納得できます。
ループを回しながら、配列の要素の値を一つずつ順番に入れ替えれば、もちろん最小値を「1」にすることができますが、実はループ処理をしなくてもできてしまいます。
Dim arr As Variant
arr = Split("い;ろ;は", ";")
Stop
ReDim Preserve arr(1 To UBound(arr) + 1)
Stop
ショートカットキー[F5]などで上記の実行した場合でも、Stop文の箇所でステップ実行モードになりますから、メニュー[表示]-[ローカルウィンドウ]からローカルウィンドウを表示させて、配列の各要素の様子をご確認ください。
一つ目のStop文の箇所では配列変数・arrは「0」から始まっていますが、
二つ目のStop文の箇所では「1」始まりに変更されているはずです。
サンプルマクロの解説
添え字・インデックスの最小値を「0」から「1」にずらしているのは、
ReDim Preserve arr(1 To UBound(arr) + 1)
の部分です。
Preserveキーワードを使ってReDimすることで、格納されているデータを保持したまま、配列のサイズを変更していますが、ここで最小値を「1」と指定することで、「0」から「1」へずらすことができてしまうのです。
最大のポイントは、
Dim arr As Variant
のように、配列にする変数をバリアント型で宣言することです。
ここを、
Dim arr() As String
のようにVariant以外の型で宣言するとヘルプの、
「キーワード Preserve を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。添字の下限を変更しようとすると、エラーが発生します。」
という記述通りの動作となり、
ReDim Preserve arr(1 To UBound(arr) + 1)
の行で「インデックスが有効範囲にありません。」エラーが発生します。
- Newer:直線の情報を取得するPowerPointマクロ
- Older:背景のスタイルを1枚にだけ適用したい
Home » エクセルマクロ・Excel VBAの使い方 » 配列 » VBAで配列のインデックス・添字の最小値を1にずらす