オブジェクト(ワークブックやワークシート、セル・レンジなど)への参照を格納しておく変数のことをオブジェクト変数といいます。
オブジェクト変数を使用すると、もとのオブジェクトと同等のプロパティおよびメソッドを使用することが可能になります。オブジェクト変数はうまく使用することで、コードのメンテナンス性・可読性を向上させることができますので、積極的に使用していきましょう。
オブジェクト変数の利用場面
オブジェクト変数を使用する主な場面としては次のものが挙げられます。
- コード記述の長いオブジェクトを頻繁に使用する場合
頻繁に使用するコード記述の長いオブジェクトは、オブジェクト変数で別名を宣言して使用すると、コード記述が楽になり、また見やすくもなります。
例えば “集計データ.xlsx” にある “2013年10月” シートに対してある一連のまとまった処理を行いたい場合、次のようにオブジェクト変数 DataSheet を設定しておくと、後の処理が記述しやすくなります。
Dim DataSheet As Worksheet Set DataSheet = Workbooks("集計データ.xlsx").Worksheets("2013年10月") DataSheet.Range("A1") = "xxxx" ・ ・ ・
- ループ内でコレクション内のオブジェクトにアクセスする場合
コレクション内の個々のオブジェクトにアクセスするために、オブジェクト変数が必要になります。
詳細は後述の 制御構文 – For Each … Next を参照してください。 - もともと組み込まれていない外部オブジェクトを使用する場合
ファイルシステムオブジェクトやディクショナリオブジェクトなど、外部オブジェクトライブラリにより提供されるオブジェクトを使用する場合には、CreateObject 関数でオブジェクトを生成した後、オブジェクト変数へその参照を格納する必要があります。
オブジェクト変数の宣言
オブジェクト変数を使用するには通常の変数を使用するときと同じように、あらかじめ宣言しておく必要があります。宣言するときの型はオブジェクトの総称である Object 型の他、固有オブジェクトである Worksheet 型や Range 型などが使用できます。
Object 型で宣言するとどんなオブジェクトでもセットできて便利である反面、プログラムのパフォーマンスが落ちるというデメリットがあります。オブジェクト変数にセットするオブジェクトが決まっている場合は、その固有のオブジェクト型で宣言するようにしましょう。
- Object型を使用する例
'総称オブジェクト型で宣言。セル、シートなどすべてのオブジェクトをセットすることが可能。 Dim myObj As Object
- 固有オブジェクト型を使用する例
'ワークシート型で宣言。ワークシートオブジェクトのみセットすることが可能。 Dim mySheet As Worksheet 'レンジ型で宣言。レンジオブジェクト(セルオブジェクト)のみセットすることが可能。 Dim myRange As Range
Set ステートメント
オブジェクト変数へオブジェクトの参照を格納するには Set ステートメントを使用します。あくまで格納するのはオブジェクトへの”参照”であり、オブジェクトそのもののコピーではないことに注意してください。このため、もとのオブジェクトの値を変更すると、その参照先であるオブジェクト変数の値も変わります。
- Setステートメントの使用例
Dim mySheet As Worksheet 'ワークシート型で宣言 Set mySheet = Worksheets(1) 'ワークシート1(シート名:AAA)をセット Debug.Print "【前】" & mySheet.Name 'ワークシート名を表示 Worksheets(1).Name = "BBB" 'ワークシート1のシート名を変更 Debug.Print "【後】" & mySheet.Name 'ワークシート名を表示
- 実行結果
【前】AAA 【後】BBB
オブジェクト変数の解放
オブジェクト変数にはオブジェクトの参照以外に “Nothing” を代入することができます。この “Nothing” を代入すると、オブジェクト変数とその参照もとであるオブジェクトの関係が無効になり、オブジェクト変数に割り当てられているメモリが解放されます。
CreateObject 関数により新規作成したオブジェクトやそれに従属するオブジェクトについては、
使用後に Nothing を代入してメモリを解放するようにしましょう。
- Nothing の使用例
Dim fso As Object 'オブジェクト型で宣言 'ファイルシステムオブジェクト生成 Set fso = CreateObject("Scripting.FileSystemObject") (何かの処理) Set fso = Nothing 'オブジェクト変数のクリア