個々の記述はマクロの記録でよく出てきますね。
「オブジェクト」「メソッド」「プロパティ」などというと何やら難しいことを覚えなければならないのか、と構えてしまうかも知れません。
ですが、これらはマクロの記録で記録されるコードに既に頻繁に使われているもので、知らずに使っているのです。記録されたままで済んでいるならそれでも良いかも知れませんが、
コードに手を入れるようなことがあるなら、ある程度は頭にいれておいた方が良いと思います。
Excelの場合「オブジェクト」は、Excel自身や、ワークブック、ワークシート、セルやセル範囲、さらには貼り付けたテキストボックスや画像など、単純な変数以外の全てに近いものを指します。「オブジェクト」は広義であって、実際に使用する場合は「オブジェクト」の中の「何」かを明示して宣言します。
- オブジェクト型変数
- Excel95までは、これらは「Object型」1種類でまとめられていましたが、Excel97以降ではこのように何の「オブジェクト」かを明示できるようになりました。しかも、そのオブジェクト変数をVBE上で利用する場合に、ピリオドを打った瞬間から使用されるプロパティやメソッドがプルダウンリストに表示されますので、記述が楽になり、かつ正確になる利点があります。
'*******************************************************************************
' オブジェクト型変数
'
' 作成者:井上治 URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'*******************************************************************************
Option Explicit
' ※プロシージャレベルで説明しますが、モジュールレベルでも同じです。
' これはExcel特有のオブジェクトデータ型です。
Sub TEST2()
Dim A As Application ' Excel.Application自身
Dim B As Workbook ' ワークブック
Dim C As Worksheet ' ワークシート
Dim D As Window ' ウィンドウ
Dim E As Range ' セル及びセル範囲
' 各Object変数に実体をセットする
Set A = Excel.Application
Set B = ThisWorkbook
Set C = ActiveSheet
Set D = ActiveWindow
' Set E = Selection.Range
' 実体をセットしてからプロパティやメソッドを扱う
A.Cursor = xlWait ' マウスカーソルが「砂時計」になる
A.StatusBar = "あああああ" ' ステータスバーに文字を表示する
' TEST2を動かした場合は砂時計にままになるので、一旦Excelを終了して下さい。
End Sub
一般の変数は、「変数 = 値」で値をセットしますが、オブジェクト変数は、値をセットするのではないので、必ず「Set」ステートメントでオブジェクトの実体(の参照)を掴ませてからでないと利用できません。ここで、宣言しているのが「オブジェクト」です。下の2行が「プロパティ」のサンプルです。
「オブジェクト」は処理のターゲットとなる目的物です。ここでは登場しませんが、「メソッド」は「オブジェクト」が持つ関数であり、「プロパティ」は「オブジェクト」の設定項目になります。
実際問題、「メソッド」と「プロパティ」は区別がしにくい点もあります。VBEでは「オブジェクト」が明確に宣言されているとピリオドを打った瞬間に「メソッド」や「プロパティ」がリスト表示されるようになっていて、区別をきちんと知らなくても使えてしまいます。
- 「オブジェクト」自体は、変数を宣言しないと参照できないわけではありません。
- オブジェクト変数に取得しようとする「オブジェクト」自体は、いちいち宣言しなければ利用できないわけではありません。
'*******************************************************************************
' オブジェクト操作のサンプル
'
' 作成者:井上治 URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'*******************************************************************************
Option Explicit
' これはオブジェクト変数を宣言せず直接利用する例です。
Sub TEST3()
Application.Cursor = xlWait ' マウスカーソルが「砂時計」になる
Application.StatusBar = "あああああ" ' ステータスバーに文字を表示する
' このブックのシート数を表示
MsgBox ThisWorkbook.Worksheets.Count
Application.Cursor = xlDefault ' マウスカーソルをデフォルトに戻す
Application.StatusBar = False ' ステータスバーを元に戻す
End Sub
このように、その場で実際のオブジェクトを直接書いてしまえば済みます。ですが、これは例の「自動記憶マクロ」と同じような状況となります。実際の動作はExcelがその都度オブジェクトを生成するとのことで、事前に1回「Set」ステートメントでオブジェクトの実体を掴ませるより効率が悪いことや、構文が長くなる等の問題があります。
また、マクロの記述自身でワークシートを切り替えたりする処理では、ある時から「ActiveSheet」は違うものに変わってしまうなどの問題も発生します。
一度きりしか利用しないオブジェクト変数であれば、わざわざ変数に格納するのは無駄かもしれません。しかし、そうでなければ宣言して利用すべきでしょう。
- Withステートメントの利用
- もうひとつ、オブジェクトの記述を1回にまとめてしまう方法もあります。頻度が一番多いもの1つに限られますが、この方法も良いでしょう。
'*******************************************************************************
' オブジェクト操作のサンプルA
'
' 作成者:井上治 URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'*******************************************************************************
Option Explicit
' これはオブジェクト変数を宣言せず直接利用する例Aです。
Sub TEST3()
' Excel.Applicationのオブジェクトを1つにまとめる
With Application
.Cursor = xlWait ' マウスカーソルが「砂時計」になる
.StatusBar = "あああああ" ' ステータスバーに文字を表示する
' このブックのシート数を表示
MsgBox ThisWorkbook.Worksheets.Count
.Cursor = xlDefault ' マウスカーソルをデフォルトに戻す
.StatusBar = False ' ステータスバーを元に戻す
End With
End Sub
これで、「Application」の記述が1つにまとまりました。こうすると、いきなりピリオドから始まる場合は、「With」でくくられた「Application」が前につくものとして処理されます。
- プロパティ・メソッドの操作
- プロパティは「設定情報」なので「=」で受け取ったり設定したりします。(取得のみで設定できないプロパティもあります)
これに対してメソッドの場合は、記述方法が違います。メソッドは昔のBASICで呼んでいた「コマンド」と同様の「命令」です。オブジェクトごとに違ったメソッドを持っています。メソッドには命令の内容を示す「引数」を付け加えられます。「引数」はないこともあり、複数個あることもあります。
'*******************************************************************************
' ワークシートを追加するサンプル
'
' 作成者:井上治 URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'*******************************************************************************
Option Explicit
' ワークシートを追加する例@
Sub TEST4()
Dim cntSH As Long ' シートカウント
With ThisWorkbook
' 本ブックのシート数を取得
cntSH = .Worksheets.Count
' 新しいシートを最後に追加する@
.Worksheets.Add After:=.Worksheets(cntSH)
End With
End Sub
' ワークシートを追加する例A
Sub TEST5()
Dim objSH As Worksheet ' ワークシート
Dim cntSH As Long ' シートカウント
With ThisWorkbook
' 本ブックのシート数を取得
cntSH = .Worksheets.Count
' 新しいシートを最後に追加するA
Set objSH = .Worksheets.Add(After:=.Worksheets(cntSH))
' シート名を設定する
objSH.Name = "新シート(" & cntSH & ")"
End With
End Sub
これはどちらもワークシートの「Addメソッド」のサンプルです。@の方はシート名を特定しないので追加されたシートのオブジェクト取得を行ないません。この場合は「Addメソッド」の後ろにカッコを付けずに「引数」を書きます。「引数」は通常、名前の後ろに「:=」を付けて値を指定します。複数の「引数」がある場合は「,」で区分けをします。
メソッドが使いこなれていおり「引数」の発生順位が判っている場合、「引数」の名前と「:=」を省略してしまうことがありますが、後でソースを見たときに明確になるように通常は省略せずに書くようにします。
一方、Aのサンプルは「Addメソッド」で追加されたシートの名前を変えるためにワークシートオブジェクトを取得する例です。「Addメソッド」の行にそのままこのように「Setステートメント」を書いてやれば、追加されたシートがオブジェクト変数に格納されます。
この場合は、「Addメソッド」の後ろは「引数」の全てをカッコで囲みます。
このマクロを実際に動かすと、@(TEST4)の方はExcelが認知しているシート名が割り符られます。サンプルは「Sheet1」しかありませんが、動作後にそのシートを削除したりすると、次は飛んだ番号が付いた名前になったりします。
A(TEST5)では、シート名は自分で編集してしまいますので、自在な名前が可能です。