本記事では、VBAのSetステートメントについて解説します。
Setステートメントは、オブジェクト変数にオブジェクトを格納する際に利用します。
このページでは、オブジェクト変数とは何か?Setステートメントの利用方法・注意事項を初心者向けに解説します。
本ページの内容を理解するには
① 変数とは何か?
② データ型とは何か?
について理解があることを前提とします。もし、上記2つの問いに答える自信がないという方は以下の記事をご覧ください。
VBAを用いた業務改善や自動化を行いたいという方や、VBAをマスターしたいという方であれば、絶対に知っておきたい重要知識ばかりですので是非最後までご覧ください。
オブジェクト型とは?
Setステートメントの解説に移る前に、データ型の1つ「オブジェクト型」について解説します。オブジェクト型は、これまで学習してきたような一般的なデータ型とは性質が異なります。
VBAでは、データ型が大きく2つに分類されます。1つが、値型。もう1つが、参照型です。
値型 ・・・ 変数に直接値が代入される
参照型 ・・・ 変数には「参照情報」が代入される
このうち、オブジェクト型は後者の「参照型」に分類されるデータ型です。
「参照型」のデータ型とはどういう意味か?あらためて「値型」のデータ型と比較しながら解説します。
値型・・・「Long」や「String」など
LongやStringなどの「型」は値型です。値型とは、その名の通り「値が入る」変数を定義します。
例えば、「Dim a As String」とした場合、変数"a"には文字列の値が直接格納されます。同様にLongを指定すれば、数字の値が格納されます。これまで解説してきた通りの「箱」のイメージが当てはまる変数です。
参照型・・・WorkbookやRangeなど
対して、参照型は「参照情報を格納する」変数です。
参照情報を格納する、とは「実態がどこに存在するのか?という情報を格納」するということです。
どういうことか?言葉だけではイメージができないかと思いますので、実際に以下のサンプルコードを確認しながら学習していきましょう。
Sub test001() Dim sWR As Range Set sWR = Range("A1") sWR.Value = "Hello World" End Sub
2行目
変数 "sWR" をRange型で宣言(Range型は先ほど解説した通りオブジェクト型です。)
3行目
Setステートメントで変数 "sWR" に参照情報「セルA1」を代入
4行目
セットした変数に ”Hello World” (文字列)を代入
上記のコードを実行した結果がこちらです。
A1セルに Hello World が書き込まれています。
これは、変数 "sWR" はセルA1という参照先を格納しているためです。すなわち、セルA1を参照する変数"sWR"を介して、Hello Worldが書き込まれるのです。
sWR = Range(A1)が成り立つ前提で、コーディングをしていけば問題ありません。
参照型とは、言い換えればあるオブジェクト(セルやシート)を変数のように扱うためのデータ型です。参照型をうまく利用することで、Excelのなかの「シート」や「セル」を操作することが可能になるのです。
オブジェクト変数
オブジェクト型の変数を「オブジェクト変数」と呼びます。オブジェクト変数で指定できるデータ型(オブジェクト)を記載します。
名称 | オブジェクト名 |
---|---|
アプリケーション | Application |
ワークブック | Workbook |
ワークシート | Worksheet |
セル | Range |
上記サンプルコードでは、Range(セル)を用いて解説しましたが、Workbook/Worksheetも利用頻度は高いです。
Setステートメント
オブジェクト型の変数に参照先を格納(代入)する場合は、Setステートメントを利用します。
※値型の場合は単純に「=」で結ぶだけで値を代入することができますが、オブジェクト型の場合はSetステートメントが必須です。
構文ルール:Setステートメント
Set オブジェクト変数 = 値
変数の前にSetステートメントを記述します。
再掲:サンプルコード
Sub test001() Dim sWR As Range Set sWR = Range("A1") sWR.Value = "Hello World" End Sub
参考:値型の変数への代入との比較
Dim a As String
a = "Hello World"
値型の場合はSetは不要です。
変数の初期化(参照先を解除)する方法:Nothing
オブジェクト変数を初期化(一度格納した参照先を解除)する場合は、「Nothing」を代入します。
Set オブジェクト変数 = Nothing
注意したいのは、変数の初期化(参照の解除)を行っても、参照先のオブジェクトは削除されないということです。
Sub test001() Dim sWR As Range Set sWR = Range("A1") sWR.Value = "Hello World" Set sWR = Nothing End Sub
つまり、上記サンプルコードでは、オブジェクト変数"sWR"を初期化していますが、セルA1が削除されるわけではないということに注意が必要です。
0からプログラミングを学びたい方は
プログラミングをより実践的に学びたい―。実際にコーディングをしながら学びたい―。独学に限界を感じている―。
そんな方には、無料体験/オンライン完結もあるプログラミングスクールで学ぶのがおすすめです。都度検索しながら知識を補完していくのではなく、1から体系立てて学ぶことで短時間・かつ効率的にスキルハックすることが可能です。