• ベストアンサー

EXCEL VBA で、0から?1から?

教えてください。 質問1:以下のような例で、0から始まったり、1から始まったり。 事例ごとの違いが分かりません。 なにか法則や捉え方はありますか? Worksheets(1)→1から。 cells(1,1)→1から。 配列変数(0)→0から。 myseazon=array("春","夏","秋","冬") だと、myseason(0)は、春→0から。 テキストボックスで、SelStartプロパティは、1文字目を0としてカウント→0から。 テキストボックスで、SelLengthプロパティは、1文字の設定なら1指定→1の時に1 複数行の入力が可能なテキストボックスで、CurLineプロパティは1行目を0としてカウント→0から。 複数行の入力が可能なテキストボックスで、LineCountプロパティは1行目を1としてカウント→1から。 リストボックスで、ListIndexプロパティ→0から。 リストボックスで、TopIndexプロパティ→0から。 ColumnCountが2以上のリストボックスで、BoundColumnプロパティで、1列目を設定する時は1。 ColumnCountが2以上のリストボックスで、オブジェクト名.List(row,column)→0から。 ColumnCountが2以上のリストボックスで、オブジェクト名.Column(column,row)→0から。 質問2:また、Option Baseステートメントはどの範囲で有効ですか? ヘルプには、「Option Base ステートメントの設定が有効になるのは、ステートメントが記述されているモジュール内の配列の添字の最小値のみです。」とありますが、 例えば上の例ではどれが配列の添字ですか?見分け方はありますか? EXCEL2003です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 基本的なことだと思います。 ・質問1:以下のような例で、0から始まったり、1から始まったり。 >事例ごとの違いが分かりません。 >なにか法則や捉え方はありますか? >Worksheets(1)→1から。 >cells(1,1)→1から。 Worksheeets もRange オブジェクトも、配列ではありません。Collection という種類のものです。 Collection の初期値は、1 です。 >リストボックスで、ListIndexプロパティ→0から。 >リストボックスで、TopIndexプロパティ→0から。 List のItem のデータは、配列になっています。 >(TextBoxの)CurLineプロパティは1行目を0 これは、位置であって、配列でも、Collection でもありません。(たぶん) ・質問2:また、Option Baseステートメントはどの範囲で有効ですか? モジュール(表示されているペイン)の範囲のみです。ステートメントは、モジュールのみです。 現在は、なるべくOption Base は、使わないようにしたほうがよいです。どうやら、VBAがなくなるというMSの内部の話は、MS のOffice のチームリーダからは否定はされましたが、それを使うのは、仮に簡単になるといっても、避けたほうがよいです。.Net への移植そのものは出来ませんが、移植性が落ちます。もとより、その都度、使ったり使わなかったりすると、コード作成上で、混乱するからです。 >例えば上の例ではどれが配列の添字ですか?見分け方はありますか? 配列の、Lbound(配列)の初期値が、0か1になるということです。たぶん、一通りVBAを覚えたものだと思いますが、こういうことは、あまり先の見通しを考えないほうがよいです。 '-------------------------------------------------- ''Option Base 1 '配列の初期値を換える 'コレクションテスト Sub CollectinTest() Dim myCollection As New Collection Dim v As Variant For Each v In Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)  myCollection.Add v Next v  MsgBox myCollection.Item(1) End Sub ' '配列テスト Sub ArrayTest() Dim myArray(10) As Variant Dim v As Variant Dim i As Integer i = 1 For Each v In Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)   myArray(i) = v i = i + 1 Next v  MsgBox myArray(LBound(myArray())) End Sub ---------------------------------------------

chihuma
質問者

お礼

こんにちは。 回答ありがとうございます! どうにも「配列」の概念がわかってないようです。 数字で番号が振られていれば、みんな配列に見えてきます。 Option Baseは使わないほうがよいのですね。なるほど。 いろいろありがとうございます。

その他の回答 (3)

  • test_
  • ベストアンサー率28% (15/52)
回答No.4

#2の投稿者ですが・・ chihumaさん ごめんなさい。 さんが抜けていて、非敬称な形になっていました。 読み直して焦りました。失礼しました。

chihuma
質問者

お礼

こんばんは! え、全然気にしてませんでした…; 律儀ですね~。 ありがとうございました。

  • test_
  • ベストアンサー率28% (15/52)
回答No.2

chihumaのいわれているとおり確かにそうですよね。 EXCEL VBAは初期バージョンのころから、見てましたが、 言語はすべて#1さんがおっしゃるように0からのカウントで 領域確保がおおいのに、EXCEL VBAだけは、当初のころから、 CEL Worksheetsなどエクセル固有なものはカウントが1からですね。 他のものは、VBから入ってきたもので、すべて0からなんではないでしょうか? 質問2は、 実際に使用したのをLBoundを使って確認できます。 有効な範囲とは、モジュール単位で、module1とかの1ファイル内を 意味します。XLSエクセルファイル一つはプロジェクト単位といいます。

chihuma
質問者

お礼

回答ありがとうございます! エクセル固有なものはカウントが1からなのですか。 なるほど。

回答No.1

質問2はよくわかりませんが、 プログラム言語は基本が0から始まります。 なので1から始まるのは例外というか、自分で指定しているものが多いと思います。なので簡単に覚えられます。

chihuma
質問者

お礼

回答ありがとうございます! “自分で指定しているもの”ですか? うーん、ちょっとよく分かりません…; もしよろしければ、 例えばどれのことか教えてください。

関連するQ&A

専門家に質問してみよう