VBAで変数に値を代入するときは「=」を使いますが、シートやセル範囲のようなオブジェクトを変数に代入する場合は「Set」というキーワードが必要です。この違いを知らずに「=」だけで書くと、実行時エラー91が発生します。この記事では、SetとDimの役割の違いと、なぜSetが必要になるのかを解説します。
Setを付けずに書くとどうなるか
Dim ws As Worksheet
ws = Sheets("台帳")
このコードを実行すると、「実行時エラー ’91’: オブジェクト変数、またはWithブロック変数が設定されていません」というエラーが発生します。文字列や数値を代入するコードでは問題なく動く「=」による代入が、シートを代入する場面ではエラーになるのが、このエラーの特徴です。
「値」と「オブジェクトへの参照」の違い
Dim dt As Stringのような変数に代入されるのは、文字や数値そのもの、つまり「値」です。一方、Sheets(“台帳”)が表しているのは、台帳シートという実体そのものではなく、そのシートへの参照です。
VBAでは、値を代入する場合と、オブジェクトへの参照を代入する場合とで、異なる構文を使うルールになっています。値の代入には「=」を、オブジェクトへの参照の代入には「Set」を使います。
Dim ws As Worksheet
Set ws = Sheets("台帳")
Setを付けることで、wsという変数が台帳シートへの参照を正しく受け取り、以降wsと書くだけでSheets(“台帳”)と同じ意味で扱えるようになります。
Setが必要になる型・不要な型
WorksheetやRange、Workbookのようなオブジェクト型の変数には、Setによる代入が必要です。一方、String、Long、Integer、Booleanのような値を扱う型には、これまで通り「=」による代入で問題ありません。
Dim rng As Range
Set rng = Range("A1:D10")
押さえておきたいこと
① 「値」を入れるなら=、「オブジェクト」を入れるならSet
String、Long、Integer、Booleanのような値を扱う型は「=」で代入します。Worksheet、Range、Workbookのようなオブジェクト型は、Setを使って代入します。
② 実行時エラー91が出たら、Setの付け忘れを疑う
「オブジェクト変数、またはWithブロック変数が設定されていません」というエラーは、多くの場合Setの書き忘れ、または書くべき箇所の誤りが原因です。
③ オブジェクト変数は、同じシートを繰り返し書く手間を減らす
Sheets(“台帳”)を複数回書く代わりに、Set ws = Sheets(“台帳”)としておけば、以降はwsと書くだけで済みます。シート名が変更になった場合も、Setの行だけを修正すれば対応できます。
まとめ
VBAでは、値を代入する場合は「=」、オブジェクトへの参照を代入する場合は「Set」を使うというルールがあります。この違いを理解しておくことで、実行時エラー91のようなつまずきを未然に防げます。体系的に学びたい方は、JIMOVEの動画講座もご活用ください。
よくある質問
Q. Setを付け忘れると、必ずエラーになりますか?
オブジェクト型の変数に対して「=」だけで代入しようとすると、実行時エラー91が発生します。値を扱う型(String、Longなど)であれば、Setがなくても問題なく動作します。
Q. Setが必要な型は、どうやって見分ければいいですか?
Dimで宣言する際の型名を確認してください。Worksheet、Range、Workbook、Chartなど、Excelの構成要素を表す型はオブジェクト型であり、Setが必要です。String、Long、Integer、Booleanなどの値を表す型には不要です。
Q. Setを使うと、処理速度に影響はありますか?
Setの有無自体が処理速度に大きく影響することはありません。むしろ、同じシートへの参照を繰り返し取得するコードよりも、一度Setで変数にまとめておく方が、コードの見通しも処理の効率も良くなる場合が多いです。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



