- ベストアンサー
Excel VBAで定義名ではなく値を渡す方法は?
- Excel VBAにおいて、定義名ではなく値を渡す方法について教えていただきたいです。手元で試したところ、定義名でも値でも正しく動作することを確認しましたが、正式な仕様上でどちらが正しい方法なのか知りたいです。
- Excel VBAで定義名ではなく値を渡す方法について教えてください。手元で試した結果、定義名でも値でも問題なく動作することを確認しましたが、公式の仕様や通説ではどちらが推奨されている方法なのでしょうか。
- Excel VBAにおいて、定義名ではなく値を渡す方法について質問です。手元で試したところ、定義名でも値でも正しく動作することを確認しましたが、Microsoftの公式な仕様に基づいて、正しい方法を知りたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
例えばxlGray75(=-4126)を、CellのInteriorオブジェクトのPatternプロパティーの引数として与える、という事で良いでしょうか?。 Excel.VBAは内部仕様として、Pattern列挙体を持っています。列挙体とは何かというと一種の辞書のようなもので、 Enum Pattern xlSolid 1 xlGray75 -4126 xlGray50 -4125 ・ ・ ・ End Enum のような形で定義されます。Enumは列挙体の意味でVBの予約語であり、Enumのメンバーは、DefaultでConst属性を持ちます。 列挙体の使い方ですが、正式には、 Dim Pattern_Index As Integer Pattern_Index = App.Pattern("xlGray75") とやると、整数型変数のPattern_Indexが、-4126という値を持つ訳です。 ここでAppはExcel本体を表すオブジェクトで、そのPattern列挙体のIndex名"xlGray75"のIndex値を、Pattern_Indexにセットせよが、上記の意味になります。 ところでAppがExcel本体を表すなら、最初からExcel.VBA内部での出来事なので、Appと書くのは無駄な作業です。またCellのInteriorオブジェクトのPatternプロパティーは最初から、ExcelのPattern列挙体のIndex値でしか正常に動作しないと決まっているので、Pattern("xlGray75")などと書くのも無駄な作業です。 それでExcel.VBAは、 App.Patternの部分を省略できるような内部仕様になっています。こういうのは他にもありますよね?。 Cells(*,*)と書いたら、現在前面にある、すなわち現在ActiveなWorksheetのCells(*,*)である、という決まり。それからSelectionオブジェクトなどが、その省略機能の代表です。 という訳で、 Cells(10, 列)).Interior.Pattern = xlGray75 も、 Cells(10, 列)).Interior.Pattern = -4126 も、Cells(10, 列)).Interior関数にとっては同じです(じつはプロパティーも、内部仕様としては関数なんです)。 ただしコードの可読性の容易さから、xlGray75を使用する事をMicrosoftは推奨しています。それはMicrosoftでなくたって、そうするのが常識です。「= -4126」と書いてあるよりは、後で見直した時に「= xlGray75」と書いてある方が、いちおうわかりやすいはずだからです(^^;)。 ちなみに、厳密に言うとCellsオブジェクトというのはありません。 Cellsオブジェクトのように扱えるものは、本当はRangeオブジェクトのプロパティーなんですよ。Range.Cells(*,*)がCells(*,*)の正体で、じつはこれは、 Range.Items(*,*) と同じです。さらに上記は、 Range(*,*) と略記できます。Rangeは本当のオブジェクトなので、Range(*,*)も本当のオブジェクトです。つまりCells(*,*)とは、行Indexと列Indexが特定されたRange.Items(*,*)の結果に、別名を付けただけものなんですよ。その方が、若干わかりいやすいからだと思われます(^^;)。 これもExcelの省略機能です。
お礼
有難うございます