• ベストアンサー

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

  • Excel VBA リストボックスについて

    現在エクセルのVBAを勉強中の 超初心者なのですが、 リストボックスを使うコードでエラーが出て どう直したらいいかわかりません。 下記コードをどのようになおしたらいいでしょうか? 回答、よろしくお願いいたします。 エラー内容は、実行時エラー381 Listプロパティを設定できません。プロパティの配列のインデックスが無効です。 Private Sub UserForm_Initialize() 'リストボックスの設定 With ListBox1 .Font.Size = 10 .ColumnCount = 7 .ColumnWidths = "50;100;80;80;100;30;70" .TextAlign = fmTextAlignLeft .Font.Name = "MSゴシック" End With Dim i As Integer Dim LastRow As Integer LastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 2 To LastRow With ListBox1 .AddItem Cells(i, 1).Value .List(ListCount - 1, 1) = Cells(i, 2).Value .List(ListCount - 1, 2) = Cells(i, 3).Value ←ここでエラー .List(ListCount - 1, 3) = Cells(i, 4).Value .List(ListCount - 1, 4) = Cells(i, 5).Value .List(ListCount - 1, 5) = Cells(i, 6).Value .List(ListCount - 1, 6) = Cells(i, 7).Value End With Next End Sub

  • EXCEL(2003) VBA Option Baseについて

    VBAの宣言の中にOption Base というのがあります。 Option Base 1で配列の添字を1から始まるように出来るというやつです。 ところが、 例えば、「Option Baseの指定も、ReDimも無しで」 セルA1~A10を対象に Dim A as Vriant A=ThisWorkBook.Sheets("sheet1").Range(Cells(1, 1), Cells(10, 1)).Value とやると何故か A(1,1)~A(10,1)にA1~A10の値が入るようです。 この方が、配列の添字とセルの添字が一致するので良いには良いのですが、なぜ、A(0,0)~A(9,0)ではないのでしょうか? また、 セルA2~A11を対象に A=ThisWorkBook.Sheets("sheet1").Range(Cells(2, 1), Cells(11, 1)).Value とやるとA(1,1)~A(10,1)にA2~A11の値が入るようです。 この場合は、配列の添字とセルの添字は当たりまえですが一致しません。 なんとなく、暗黙の設定で添字が1から始まるような気がしますが・・・ 有名な下記サイトでもそういうコードの書き方をしています。 ​http://officetanaka.net/excel/vba/speed/s11.htm​ しかし、Option Base 1や、ReDimの宣言をしているなら分かるんですが、こういう場合、暗黙に添字が1から始まるっぽい?のは信用していいのでしょうか? 試しに同じコードで頭にOption Base 1 の設定をしても動作は変わらないようです。 何故こんな事が気になるかというとVBの方ではOption Baseが廃止になったようで、VBAでもバージョン変わったら動作がおかしくなるのではないか?と思うからです。 この辺り、どういう事になっているのか、ご存知の方いらっしゃいますでしょうか?

  • エクセルVBAのTaBに関してです。

    エクセルVBAのTaBに関してです。 こないだからここで教えてもらいながらちょっとしたアプリ(検索(複数キーワード)、削除、更新、新規)ができました。教えて頂いた方ありがとうございます。 さて、完成の段階で、各オブジェクトにTabの設定を行おうとしました。 (このアプリはコンボ、テキスト、チェックなどで構成されています。)ところが何度Tabの番号の順番を設定しても元に戻り、順番どおりTabが機能しません。 特にチェックボックスは25くらい使用していますが、何度TabIndexの値を変えても1のままです。 オブジェクトが混合で使用されている場合、TabIndexの設定には何か別のプロパティも設定しないとだめなのでしょうか。 少し前に作ったチョー簡単アプリはテキストボックスだけだったので、TabIndexとTabbehavierをFalseにしてできましたが。 テキストボックスからチェックボックスにTabで移動するあたりから上手くいかないように思えます。 ご存知の方、原因の分る方教えt下さい、よろしくお願いします。

  • EXCEL コンボボックスのリスト設定

    リストインデックスが複数ある場合は動くのですが、 インデックスが0 もしくは1個しかない場合は、どのように処理を追加したらいいでしょうか。。 実行時エラー381 Lisプロパティを設定できません。プロパティの配列のインデックスが無効です、と メッセージが出ます。 いろいろ試してるのですがわかりません。 コンボボックスの値は別シートで参照先を指定しています。 ----------- Private Sub ComboBox3_DropButtonClick() Dim lRow As Long Dim i As Long, myCnt As Long Dim myData With Worksheets("部門名") lRow = .Range("O" & Rows.Count).End(xlUp).Row ’O列の最終行を確認 myData = .Range("O2:O" & lRow).Value ’コンボボックスのリストデータ End With With ComboBox3 .ColumnCount = 1 .ColumnWidths = "50" .List = myData End With End Sub

  • エクセルVBA Columnプロパティで・・・

    エクセル2002使用です。 FindメソッドでRangeオブジェクトを取得し、Columnプロパティでそのオブジェクトの列番号をを取得し、Columnsプロパティーでその列番号が最後になる複数行を取得して、その取得した範囲の空白セルを削除しようとしています。 Dim findcell as Range Dim cl as String Set findcell = Rows(1).Find(What:="賞") cl = findcell.Column Columns(3:cl).SpecialCell(xlCellTypeBlanks).Delete Columns(3:cl)でエラーとなってしまいます。 Columnsプロパティーで複数行を取得するときは、アルファベットの列番号を指定しなければならないと思うのですが、Columnプロパティーでは、数字で列番号を取得してしまうため困っています。 Columnプロパティーでアルファベットを取得する方法 または Columnsプロパティーで複数行を数字の列番号で取得する方法で何か良い方法はありますでしょうか? よろしくお願いします。

  • Excel VBA ListBoxについて

    お世話になります。 Excelで以下のようなフォーム画面を作成しております。 1.フォーム画面には、リストボックス、テキストボックス、登録ボタンを設定 2.リストボックスには、Sheet1のデータが表示される。 3.リストボックスのレコードを選択すると、選択した値がテキストボックスに表示される。 4.登録ボタンをクリックすると、テキストボックスのデータが、Sheet1に反映される。 今1~3まではできましたが、4で悩んでおります。 テキストボックスの値を取得してセルに反映させようと以下のコードを書きました。 'リストボックスで選択したレコード数 ListNo = Me.ListBox1.ListIndex 'TextBox1の値を、Sheet1のセルにセット Sheets("sheet1").Cells(ListNo, 1).Value = Me.TextBox1.Value  これを実行すると、何故かここから3のリストボックスのレコードをクリックしたイベントを呼びます。 Private Sub ListBox1_Click() クリックしてもいないのですが、Private Sub ListBox1_Click() を呼ばないようにしたいので、 ListBoxをEnableプロパティをfalseにしても、呼んでました。 呼びにいかない方法をご教授いただけますでしょうか。 よろしくお願いいたします。

  • Excel VBA データ型不一致?

    コンボボックスのリスト設定は以下のコードで可能と分かりました。  ComboBox1.List=array("aaa","bbb") そこで、リストをテーブル化するために以下のようなコードを書きましたがエラーとなってしまいます。なぜでしょうか?(Excel97) また、このような事は不可能なのでしょうか? ---- Dim StrTbl As Variant Sub Init()   StrTbl=array("aaa","bbb") end Sub ---- Sub ListSet()   ActiveSheet.ComboBox1.List = StrTbl end Sub ---- 実行すると.Listへ代入する際に「Listプロパティを設定できません。プロパティの配列のインデックスが不正です。」エラーが出ます。

  • リストボックスの使い方

    お世話になります。 VBAで下記コードを書き、リストボックスにカラムを2列 表示させたいのですが、"番号"しかリストボックスに 表示されません。 Me.lst入居者一覧.ColumnCount = 2 Me.lst入居者一覧.RowSource = "SELECT 氏名,番号 FROM 一覧" Me.lst入居者一覧.ColumnWidths = "2;2" リストボックスのプロパティー等はちゃんと設定して いるつもりなのですが、何が原因なのでしょう? どうかよろしくお願いいたします。

  • エクセルVBAについて質問です。

    エクセルVBAについて質問です。 シート1のユーザーフォームにコンボボックスとテキストボックスが各1つずつ、 シート2のA列には1行目から順に「あ」「い」「う」と文字が入っていて、B列には「1」「2」「3」と値が入っています。 コンボボックスのリストにはシート2のA列の文字が選択できる状態にあります。 この状態で、例えばコンボボックスで「い」を選んだら、テキストボックスに自動的に「2」と入る、というように、コンボボックスのリストの中から任意の文字を選択したときに、テキストボックスにB列の値が入るようにするにはどのようにすればいいのでしょうか?よろしくお願いします。

  • VBAでのオブジェクト名の付け方で困っています。

    私が知りたいのはユーザフォームを一度作成した後にオブジェクトを追加したときのオブジェクト名の処理の仕方です。 今、EXCEL VBAでアンケート入力フォームを作成しています。テキストボックスやチェックボックスが全部で70ほどあります。以下のようにControlsコレクションを用いてユーザフォームに入力した文字列などをワークシートに追加しています。 ……<略> For i = 1 To 10 Cells(Row, i).Value = Me.Controls("CheckBox" & i ).Value Next i ……<略> しかし、入力フォームの画面構成を変更して、新たにテキストボックスやチェックボックスを追加すると、例えば、ユーザフォーム上で隣り合ったTextBox1とTextBox2の間にTextBox35が入ってきて以下のようにコードを書き換えねばなりません。 ……<略> Cells(Row, 1).Value = Me.CheckBox1.Value Cells(Row, 2).Value = Me.CheckBox35.Value For i = 2 To 10 Cells(Row, i+1).Value = Me.Controls("CheckBox" & i ).Value Next i ……<略> プロパティからオブジェクト名のひとつひとつを編集してユーザフォームのテキストボックスの表示順にするのも手間ですし……まだ、設計の試行錯誤の段階なのでまだまだテキストボックスやチェックボックスを追加・削除をすると思いますし…… 何か効率のよいオブジェクト名の付け方はないでしょうか? みなさんはどのようにされていますか?

専門家に質問してみよう