VBAにおける配列やコレクションの起点について
VBAの配列を扱っていると、0から開始されていたり1から開始されていたりします。
さすがに、混乱したり、間違ってしまう事もあると思います。
1から開始される場合を、「1オリジン」英語では「one-based」
このような呼び方をします。
VBAでの、これらの違いについてお話したいと思います。
配列の起点について
Option Base
特に指定が無ければ、これは0オリジンで、0~3の配列になります。
特に指定が無ければと書きましたが、
Option Base 1
これを指定すると、1オリジンとなり、1~3の配列になります。
マイナスや2以上は指定できません。
既定は、Option Base 0です。
もちろん、
Dim ary(1 To 3)
このようにすれば、Option Baseに関係なく1オリジンの配列になります。
セル範囲から作成される配列
これで作成される配列は、
Option Baseの影響を受けることなく常に1オリジンの2次元配列になります。
Range(・・・).Value = 配列
この配列は0オリジンでも1オリジンでも、2次元配列でさえあればどっちでも構いません。
どちらでも、動作結果は同じになります。
Split関数とFilter関数で作成される配列
変数 = Filter(配列)
Split関数とFilter関数で作成される配列は、Option Baseの影響を受けることなく常に0オリジンになります。
Split関数とFilter関数の結果を1オリジンにする書き方は、私の知る限りでは存在しません。
Array関数で作成される配列
これで作成される配列は、Option Baseにより決定されます。
Base 0なら、0オリジンになります。
Base 1なら、1オリジンになります。
Base 0が既定ですので、通常は0オリジンという事です。
変数 = VBA.Split(・・・)
変数 = VBA.[_HiddenModule].Array(・・・)
このようにタイプ ライブラリの名前で修飾した書き方をすると、
Option Baseの影響を受けずに常に0オリジンになります。
ParamArray指定の引数
ParamArrayキーワードを指定した引数の配列は、Option Baseの影響を受けることなく常に0オリジンになります。
呼び出し側でこの引数を省略した場合は、LBoundは0、UBoundは-1となります。
コレクション
Worksheets(0)やWorkbooks(0)はエラーとなります。
コレクションと配列の記述が同じになっているので混同されがちですが、
コレクションにおける、コレクション(インデックス)
これは、
コレクション.Item(インデックス)
この記述の省略形になります。
メンバーを省略した場合はItemを指定したことと同じになります。
Itemはプロパティですので、プロパティが引数を受け取って値を返しているので、
0オリジンか1オリジンかは、プロパティ次第という事です。
ただし、Excelに用意されているコレクションは全て0オリジンで統一されています。
あくまで、Excel作成したときの都合で1オリジンにしたというだけの事になります。
Collectionオブジェクト
このCollectionオブジェクトも常に1オリジンです。
c.Add "A"
Debug.Print c(1)
c(1)は、c.Item(1)の省略形です。
なぜメソッドにしたのかは分かりませんが、
少なくともメソッドであるがゆえに、以下の記述はできなくなっています。
c(1) = "B"
メソッドですから、値を受け取ることはできても値を入れることはできません。
ただし、プロパティでも読み取り専用にすればよいので、これはメソッドにしている理由ではないでしょう。
その他:文字列関数
Right、Mid、Left、InStr等々
先頭から1文字目が1、これだけを見たらわかりやすいとは思います。
ですが、配列と合わせて使う場合には注意が必要になってきます。
配列の起点の原則
・Rangeから作成は1オリジン
・Splitは常に0オリジン
・ParamArrayは常に0オリジン
・Option Baseで変更できるのはDimおよびRedimの配列
・コレクションは1オリジン
・文字列関数は1オリジン
原則として、Option Baseは使わないことにすれば、
・Rangeから作成は1オリジン
・コレクションは1オリジン
・文字列関数は1オリジン
・以外は0オリジン
同じテーマ「マクロVBA技術解説」の記事
PowerQueryの強力な機能をVBAから利用する方法
ShapesとDrawingObjectsの相違点と使い方
新規挿入可能なシート名の判定
VBAにおける配列やコレクションの起点について
VBAのマルチステートメント(複数のステートメントを同じ行に)
クリップボードに2次元配列を作成してシートに貼り付ける
ユーザー定義型の制限とクラスとの使い分け
シングルクォートの削除とコピー(PrefixCharacter)
空文字列の扱い方と処理速度について(""とvbNullString)
VBAにおける変数のメモリアドレスについて
Evaluateメソッド(文字列の数式を実行します)
新着記事NEW ・・・新着記事一覧を見る
シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理|Power Query(M言語)入門(2023-02-28)
新旧マスタの差異比較|Power Query(M言語)入門(2023-02-28)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-26)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-21)
グルーブ内の最小・最大|Power Query(M言語)入門(2023-02-17)
2つのテーブルのマージ|Power Query(M言語)入門(2023-02-15)
「売上」が数値の行のみ取り込む|Power Query(M言語)入門(2023-02-13)
A列のヘッダー名を変更する|Power Query(M言語)入門(2023-02-11)
CSVのA列が日付の行だけを取り込む|Power Query(M言語)入門(2023-02-10)
列数不定のCSVの取り込み|Power Query(M言語)入門(2023-02-09)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- VBAにおける配列やコレクションの起点について
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。