VBAを使用する際に、Workbook や Worksheet を変数として扱いたい機会は多いと思います。
これらのデータはオブジェクトと呼ばれるデータ型で読み込まれるため、変数として扱うには Setステートメントを使用する必要があります。
そこで今回は、Setステートメントの具体的な使用方法と、代表的なオブジェクトの使用例をいくつか合わせて紹介していきたいと思います。
VBAのSetステートメントとは?
Setステートメントは、オブジェクト型の変数に参照を割り当てる際に使用するステートメントです。
このステートメントを使用することで、指定したオブジェクトの参照が変数に割り当てられ、オブジェクトを操作することが可能になります。
Workbook や Worksheet、セルの範囲を指定する際に使用する Range などは、VBAでよく使用される代表的なオブジェクトの一例です。
これらのオブジェクトを変数で扱いたい場合には、Setステートメントを使用する必要があります。
オブジェクト型とそれ以外のデータ型の違い
VBAにおけるオブジェクトは、ワークシートやセルなどといった Excelの操作対象のことを指します。
これらのオブジェクトを格納できるのがオブジェクト型です。
変数で型を指定する際は、「Object」 と記述することでオブジェクト型が指定できます。
また、特定のオブジェクト名を指定することで、他のデータ型と同様に扱うオブジェクトをより限定させることもできます。
数値型や真偽型など、その他のデータ型が単一の値を扱うのに対し、オブジェクト型は複数の情報を内包しています。
また、それぞれのデータ型は、変数へ格納する際の参照方法の違いにより 「値型」 と 「参照型」 の2つに分類されますが、オブジェクト型は参照型、それ以外のデータ型は一部の例外を除き値型であるという違いがあります。
Setステートメントでオブジェクトを変数に割り当てる
それでは、オブジェクトを変数に格納する具体的な方法について解説していきます。
先ほども説明したように、オブジェクト変数を扱うには Setステートメントで参照を割り当てる必要があります。
まずは、Setステートメントの使い方から見ていきましょう。
Setステートメントの基本的な使い方
Setステートメントは、Dimステートメントで変数を宣言した後に使用します。
以下のような構文で、宣言した変数に対して操作したいオブジェクトの参照を割り当てることで、変数を使って操作できるようになります。
【基本構文】
Set 変数名 = オブジェクト
サンプルコードで、具体的な使用例を見てみましょう。
【サンプルコード】
Sub sampleSet()
Dim sheet As Worksheet
Set sheet = Worksheets("Sheet1")
sheet.Cells(1, 1) = "test"
End Sub
【実行結果】

上記のサンプルコードでは、Worksheet型のオブジェクト変数を宣言し、その変数に操作対象であるワークシートの参照を割り当てています。
一連の処理を行うことで、変数 「sheet」 を使ってセルに値を代入することができるようになります。
Nothingでオブジェクトの参照を解除する
基本的には不要な処理ではありますが、場合によってはオブジェクト変数に Nothing を代入して参照をリセットする必要があります。
【基本構文】
Set オブジェクト名 = Nothing
先ほども解説しましたが、オブジェクト型の変数は参照型に分類されます。
値型の変数は、格納した値を直接参照してデータの操作を行いますが、参照型の場合、変数には値そのものではなくデータの保管場所を示すアドレスが格納されており、 そのアドレスを経由して値を参照しています。
変数ごとに値を別個で管理する値型とは異なり、同一のデータを複数の変数から参照する場合がある参照型では、各メソッドやプロシージャの実行が完了してもメモリが解放されずに残ってしまうケースがあります。
VBAではオブジェクトの管理方法に 「参照カウント方式」 が採用されており、このカウントが0になることでメモリが解放されますが、コード内容によってはカウントが自動で減らずに残ってしまうことがあるからです。
オブジェクト変数に Nothingを代入すると、割り当てた参照が解除され、参照カウントを減らすことができます。
メモリを解放したい場合や、オブジェクトの破棄タイミングを明示的に記しておきたい場合など、必要に応じて活用するといいでしょう。
よく使用されるオブジェクト
続いて、VBAでよく使用されるオブジェクトについて、簡単なサンプルコードと合わせていくつか紹介していきたいと思います。
Workbookオブジェクト
ワークブックを扱う際に使用するのが、Workbookオブジェクトです。
以下のプロパティの戻り値や、コレクションのメンバーの型に適用されています。
- ThisWorkbookプロパティ
- ActiveWorkbookプロパティ
- Workbooksコレクションのメンバー
【サンプルコード】
Sub sampleWorkbook()
Dim book1 As Workbook, book2 As Workbook
Set book1 = ThisWorkbook
Set book2 = ActiveWorkbook
MsgBox book1.Name & vbCrLf & book2.Name
End Sub
【実行結果】

Workbookオブジェクトには数多くのプロパティやメソッドが用意されていますが、中でもよく使用されるのは、ファイルパスが取得できる Pathプロパティや、ワークブックをアクティブ状態にする Activeメソッドなどです。
Worksheetオブジェクト
ブック内の各シートを操作する際に使用するのが、Worksheetオブジェクトです。
Sheetsコレクション、および Worksheetsコレクションのメンバーの型に適用されています。
【サンプルコード】
Sub sampleWorksheet()
Dim sheet1 As Worksheet, sheet2 As Worksheet
Set sheet1 = ThisWorkbook.Worksheets("Sheet1")
Set sheet2 = ActiveWorkbook.Worksheets("Sheet1")
MsgBox sheet1.Cells(1, 1).Value & vbCrLf & _
sheet2.Cells(1, 1).Value
End Sub
【実行結果】

Worksheetオブジェクトにも数多くのプロパティやメソッドが用意されていますが、基本的には Rangeプロパティや Cellsプロパティ、Activeメソッドなどのよく使うものだけ覚えておけば問題はありません。
Rangeオブジェクト
シート内の各セルを操作する際に使用するのが、Rangeオブジェクトです。
Rangeオブジェクトのプロパティである Rangeプロパティや Cellsプロパティを使用することで、任意のセル範囲を取得することができます。
【サンプルコード】
Sub sampleRange()
Dim cell As Range
Set cell = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Range("A2").Value = cell.Value + 10
Range("B1").Value = cell.Value * 10
Range("B2").Value = cell.Value / 10
End Sub
【実行結果】

Rangeオブジェクトでは、セルの値を取得したり書き換えたりする他にも、書式や背景色などの設定を変更することもできます。
まとめ
いかがでしたか?
今回は、Setステートメントの使い方について解説しました。
実際の業務において、それぞれのオブジェクトを変数で管理することは、安全かつ効率的にマクロを実行するための有用な手段になり得ますので、ぜひ活用してみてくださいね。
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。