エクセルがともだち

会社で一番のともだちがエクセル・・・のアラフィフパート事務員のつれづれ帳。備忘録もかねてエクセルのことやVBAのことを書いていくつもりです。

【Excel/VBA】配列を1から始める 0から始める

エクセルVBAにおいて、配列はとても便利でなくてはならないもの・・・と配列、ディクショナリ多用者のワタクシはそう思っています。

配列のイメージは変数が段ボール箱1つ、としたら、配列(一次元配列)はカラーボックスまたは長屋、二次元配列はロッカーまたはマンション、のようなイメージでとらえています。三次元以上の配列は使いません。私のアタマでは二次元までが理解の限界なので。

f:id:mwke:20211114133336p:plain

配列とは・・・はわかりやすい解説が世の中にたくさんあるので、そちらをご参照ください。。。

 

変数は1つしか値が入れられないけど、配列はたくさん値が入れられる。インデックス番号が振られ、インデックス番号は基本は0から始まります。

f:id:mwke:20211114134925p:plain

 

◆配列インデックスを1から始めるには

これが最初のうち、なれなくて1から始まってくれないとわかりにくい、と思いまして最初のうちは配列を1から始めるようにしていました。

配列を1から始めるには2通りあります。

①配列宣言時に Dim arr(1 to 5) As String などと、1から始めるぞ、と宣言する。

②Option Base 1 とモジュールの先頭に書いておく

 

①の場合、Dim arr(5) As String 等とすると、インデックス番号は0から始まり「0,1,2,3,4,5」となります。

Dim arr(1 to 5) As String とすると、インデックス番号は「1,2,3,4,5」となります。

二次元配列の場合は Dim arr (1 to3,1 to 5) のように要素数それぞれ1始まりだよ~とします。

 

②について

なにも指定しないと配列は0始まりですが、Option Base 1を書いておくと1始まりになります(※後述しますが例外あり)

Option Base 1 は標準モジュールの先頭に書きます。

f:id:mwke:20211114135829p:plain

プロシージャ内に書くとエラーになります。

f:id:mwke:20211114135839p:plain

Option Base 1 を書いておいて、配列インデックス0に値を入れようとするとエラーになります。

f:id:mwke:20211114140114p:plain

下図の例では、Option Base 1 を書いて、要素数を宣言したarr。

素数を宣言せずArray関数で配列に入れたarr2。

どちらも1始まりの配列になります。

f:id:mwke:20211114140422p:plain

 

ところがどっこい。Split関数はOption Base 1 を書いてあっても なんと! 0 始まりになります。

f:id:mwke:20211114140824p:plain

ちなみに私は配列1始まりにしたいときも、Option Base 1 は使いませんでした。いちいち宣言時にDim arr(1 to 5)とか,二次元配列の時はDim arr(1 to 2,1 to 5)とか、宣言時に書いてました。Option Base 1 はSplitの時みたいに効かないときもあるし、冒頭に書いたモジュールにしか効かないし。なんかわかりにくいかも、と思って。

 

◆セルから作成する配列はなにをしなくても1始まり

これがややこしいのですが、Option Base 1 を書いても書かなくても、逆にOption Base 0 としても、セルから作成される配列は1始まりになるんです。しかも1列分でも1行分でも二次元配列になるんです。

f:id:mwke:20211114142409p:plain

arrTateではセルA1~A3の1列分を配列に入れています。(1,1)(2,1)(3,1)と縦方向に要素数が増えています。

arrYokoではセルA1~C1の1行分を配列に入れています。(1,1)(1,2)(1,3)と2要素目が増えています。

arrSikakuはセルA1~C3の3行・3列分を配列に入れています。セルの配置そのまんまで配列に入っている感じでわかりやすいですね。

 

ちょっと支離滅裂何が言いたかったのかみたいになってしまいました。

ちなにみ最近では配列は1始まりでやるのはやめて、ゼロ始まりでやっています。配列は0始まりがジョーシキさ、みたいな感じがツウっぽいなと思って。ほかの言語でも配列(リストというのかしら)は0始まりだろうから慣れておいたほうがあとあといいかなと思いまして。

 

お読みいただきありがとうございました。