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に用意されているコレクションは全て1オリジンで統一されています。
あくまで、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技術解説」の記事
VBAのマルチステートメント(複数のステートメントを同じ行に)
新着記事NEW ・・・新着記事一覧を見る
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- VBAにおける配列やコレクションの起点について
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。