- ベストアンサー
EXCEL(2003) VBA Option Baseについて
- VBAの宣言の中にOption Baseというのがあります。Option Base 1で配列の添字を1から始まるように出来るというやつです。
- Option Baseの指定も、ReDimも無しでセルA1~A10を対象にすると、配列の添字とセルの添字が一致します。しかし、なぜA(0,0)~A(9,0)ではないのでしょうか?
- VBの方ではOption Baseが廃止になったようで、VBAでもバージョン変わったら動作がおかしくなる可能性があります。これについて詳しい情報をお持ちの方いらっしゃいますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 私は、基本的には、Option Base 1は使わないようにしています。それは、旧VBの仕様だからです。人には使うなとはいいませんが、配列の初期値を1で使うと、最初のうちは、便利に感じますが、そのうち混乱してきます。 >VBの方ではOption Baseが廃止になったようで、VBAでもバージョンが違ったら動作がおかしくなるのではないか? VB.Net やC#とは、互換性はありません。VBAは、あくまでもVBAで、基本的には変わることはありません。一時期、VBAの廃止の噂も出ましたが、当分の間、続くことを、Microsoft Office チームのリーダからの発表がありました。しかし、実際に、VSTA(Visutal Studio Tools for Application)が加わると、Ver.4マクロと同じような扱いになると思います。ただ、VB.Net などへのコンバータは付けられるはずです。 ------------------------------------------- Option Base を言う前に、きちんとした書き方をしてください。 Dim A As Variant A=ThisWorkBook.Sheets("sheet1").Range(Cells(1, 1), Cells(10, 1)).Value Sheets("sheet1").Range まではつながっていますが、引数のCellsプロバティは、浮いてしまっていますから、きちんと、Sheet 側とつなげてください。(閉じ括弧は直したようですが。) ------------------------------------------- '例えば Dim A As Variant With ThisWorkBook.Worksheets("Sheet1") A = .Range(.Cells(1, 1), .Cells(10, 1)).Value End With としてください。 問題の配列ですが、これは、ジャグ配列(または他段階配列)という種類のものですが、Range をヘルプで調べると、Range コレクションとなっています。この初期値には、「0」はありません。「1」からです。コレクションは、すべて、「1」から始まっていると考えたほうがよいです。Sheets コレクションも、「1」からですし、Workbooks コレクションも、「1」からです。 >この場合は、配列の添字とセルの添字は当たりまえですが一致しません。 セルは配列ではありません。似てはいてもオブジェクトの集合体(コレクション)です。だから、添え字ではありません。 ただ、VBAなどでは、Option Base 1 を使われる可能性も考えて、LBound と Ubound を使って、このように書きます。私は、以下のサイトは、あまりお勧めしません。さしずめ、田中亨氏の実験場のようなものだと思います。 '------------------------------------------- 'http://officetanaka.net/excel/vba/speed/s11.htm Sub Test2() Dim i As Long, j As Long, buf As Long, C As Variant C = Range("A1:C10") For i = LBound(C, 1) To UBound(C, 1) For j = LBound(C, 2) To UBound(C, 2) buf = C(i, j) Next j Next i End Sub '------------------------------------------- なお、今、前の質問も読ませていただきました。
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >セルの一部の範囲を切って入れてもコレクションだから、1から必ず始まると考えれば良いのでしょうか。 逆に、コレクションで、0から始まるものが何かあるのかなって思うのです。これは、経験値ですから、はっきりと言えません。 コレクションと配列は良く似ていますし、コレクションから配列には、そのまま移行できますが、逆はできないはずです。ただ、コレクションというものは、同種のオブジェクトをまとめたものを言いますから、戻しても、その一部だけになってしまいます。 ところで、お話には、少し食い違いがあるようです。結果的には、確かに、Range はコレクションなのでが、現在の方法で、特にコレクションとして使っているわけではありません。最後に、サンプルコードを示します。 >一セルづつ場所を指定してセル内容を代入する作業と比較すれば、いきなり全部代入出来るこの方法は非常に魅力的です。 >コレクションの順番の規則性を理解すればそれも可能という事でしょうか。 こうしたものは、あまり決まったものではありませんが、Rangeを、配列に入れる目的は、第一には、処理スピードを速くするためだと思うのです。ワークシートでいうと、「形式を選択して貼り付け--->値」という方法です。どちらかというと、Excel VBAでは、裏技に近いものだと思います。 それ以外では、指定範囲の値を確保して、その部分を加工するためです。他には、このような配列は、ワークシート関数は使えませんし、使いようかありません。 結果的に、コレクションとなっていますが、あまりコレクションとしては、役には立っていないように思います。コレクションとして使うというのは、本来は、以下のような使い方が、コレクション・オブジェクトの使い方です。 実務では出会わないコードですが、以下のような方法がコレクションの使い方です。 '------------------------------------------- Sub Test1() Dim myRng As Range Dim myColl As Collection Dim i As Long Dim c As Variant Set myRng = Range("A1:C10") Set myColl = New Collection For Each c In myRng myColl.Add c Next c Set myRng = Nothing End Sub '-------------------------------------------
お礼
親切にお答え頂きありがとうございました。 最初の質問以上の事まで教えて頂けたと思います。 質問を締め切らせて頂きます。
お礼
非常に丁寧な解説ありがとうございました。 セルの一部の範囲を切って入れてもコレクションだから、1から必ず始まると考えれば良いのでしょうか。 コレクションは使ってみると便利なのですが、このやり方を目にするまで、入っている順番を考えて使用するものでは無いと思っていました。 予め配列の大きさを宣言しておいて、一セルづつ場所を指定してセル内容を代入する作業と比較すれば、いきなり全部代入出来るこの方法は非常に魅力的です。 コレクションの順番の規則性を理解すればそれも可能という事でしょうか。 それとも、私が無知なだけでこういう使い方は当たり前なんでしょうか。 そもそもセル範囲の内容を代入して使う場合は、各セル内容が入ってる場所がはっきりしないと使い物になりませんよね。