この記事では VBA のオブジェクト型変数とSetステートメントについて解説します。
【VBA】オブジェクト型変数
VBA でデータ型変数として「オブジェクト型」を宣言すると、その変数はオブジェクト型変数となり、セル範囲やワークシートなどのオブジェクトを格納することができるようになります。実際にオブジェクトをオブジェクト型変数に入れるためには Set ステートメントを記述する必要があります。
固有オブジェクト型
データ型に WorkBook や WorkSheet, Range など、オブジェクトの種類を特定して宣言された変数を固有オブジェクト型変数とよびます。
'[VBA] セル範囲をRange型に格納するプロシージャ Sub Object_Test_1() Dim myRange As Range Set myRange = Range("B2:D4") myRange.Select End Sub
Object_Test_1() では
Dim myRange As Range
によって myRange を Rangeオブジェクト変数として宣言し、
Set myRange = Range("B2:D4")
によって B2:D4 範囲のセルを myRange に格納し、
myRange.Select
によって格納されたセル範囲を選択しています。マクロを実行すると下の図のように B2:D4 範囲のセルが選択されます。
固有オブジェクト型でブックを入れる変数を宣言するときは As Workbook, シートを入れる変数を宣言するときは As Worksheet です。オブジェクト型変数を使用することの最大の利点は、オブジェクトの煩雑な記述の代わりに簡単な変数名で代用できるようになることです。またマクロ全体がすっきりと読みやすくなります。
総称オブジェクト型
Workbook, Worksheet, Range のように種類を区別するのが面倒な場合は、代わりに Object という名称でオブジェクト型変数を宣言することができます。
'[VBA] 総称オブジェクト型変数にセル範囲を格納するプロシージャ Sub Object_Test_2() Dim myRange As Object Set myRange = Range("B2:D4") myRange.Select End Sub
Object_Test_2() の動作は Object_Test_1() と同じです。このようにオブジェクトの種類を特定せずに Object キーワードで宣言した変数を総称オブジェクト型変数とよびます。このような形でマクロを記述しても動作に支障はありませんが、 固有オブジェクト型で記述したほうが「どのようなオブジェクトを入れているのか」ということがひと目でわかるので、少しだけ読みやすくなると思います。
コメント
【AI解説】VBAのSetステートメント
[ChatGPT] VBAのSetステートメントは、オブジェクト変数にオブジェクトを参照するために使用されます。Setステートメントを使うことで、オブジェクト変数はオブジェクト自体を指し示すようになります。以下に、Setステートメントの使用方法といくつかの重要なポイントを説明します。
使用方法:Setステートメントは、オブジェクト変数を宣言し、そのオブジェクト変数にオブジェクトを参照させる際に使用されます。以下に、Setステートメントの基本的な構文を示します。
obj: オブジェクト変数の名前です。オブジェクトにアクセスするために使用されます。
ObjectType: オブジェクトの型を指定します。たとえば、Worksheet、Range、Workbookなどです。
以下は、Setステートメントを使用してWorksheetオブジェクトを参照する例です。
この例では、wsという名前のWorksheetオブジェクトを宣言し、Setステートメントを使用してThisWorkbook.Worksheets(“Sheet1”)を参照させています。これにより、wsオブジェクト変数はSheet1という名前のワークシートを指し示すようになります。
重要なポイント:
・Setステートメントを使用してオブジェクト変数にオブジェクトを参照させる場合、オブジェクト変数とオブジェクトの型は互換性がある必要があります。つまり、オブジェクト変数の型は、参照するオブジェクトの型と一致している必要があります。
・Setステートメントを使用せずにオブジェクト変数にオブジェクトを代入しようとすると、オブジェクトのコピーが作成されず、代わりにオブジェクトの参照が割り当てられます。これにより、同じオブジェクトを複数の変数で参照することができます。
・オブジェクト変数をNothingに設定することで、オブジェクトへの参照を解除できます。これにより、メモリの解放やオブジェクトの破棄が行われます。
以下は、Setステートメントを使用してオブジェクト変数に参照を設定し、Nothingを使用して参照を解除する例です。
この例では、rngという名前のRangeオブジェクトを宣言し、Setステートメントを使用してSheet1.Range(“A1:B2”)を参照させています。その後、rngオブジェクト変数をNothingに設定することで、オブジェクトへの参照を解除しています。
以上が、VBAのSetステートメントの基本的な解説です。Setステートメントを使用することで、オブジェクトにアクセスし、それらのプロパティやメソッドを操作することができます。