【2026年8月最新】VBAのSetステートメントとは?オブジェクト変数の作り方・使い方を徹底解説

【2026年8月最新】VBAのSetステートメントとは?オブジェクト変数の作り方・使い方を徹底解説

Excel VBAでマクロを書き始めると、必ずと言っていいほどぶつかる壁が「Setステートメント」です。「変数に代入するだけなのに、なぜ=だけじゃダメなの?」「Setを書き忘れたらエラーになった」——このような疑問・つまずきを持って検索している方が多いのではないでしょうか。

結論からいうと、Setは「オブジェクト」を変数に格納するときだけ必要になる特別な代入方法です。数値や文字列のような普通の値とは代入のルールが違うため、最初に仕組みを理解しておかないと、あとで原因不明のエラーに悩まされることになります。

この記事では、Setステートメントの基本文法から、Workbook・Worksheet・Rangeといった主要オブジェクトでの実践的な使い方、Nothingによる参照解放、よくあるエラーの原因と対処法まで、VBA初心者の方が迷わないように順を追って解説します。加えて、弊社(株式会社GENAI)が実際にExcel/VBA関連の業務をAIでどこまで効率化しているかという実データ、そしてVBAだけに頼らない次世代の業務自動化の考え方まで紹介します。

代表菅澤 代表菅澤
VBAのSetは、最初は誰でもつまずくポイントです。私も昔、この一文字を書き忘れて1時間デバッグした経験があります。今日はその「なぜ必要か」を根本から理解できるように整理していきます。
AI鬼管理山崎 AI鬼管理山崎
この記事を読めば、Setを「なんとなく書く」状態から「なぜここでSetが必要なのか自分で判断できる」状態になれます。後半では、VBAでの自動化がしんどくなってきたときの次の一手についてもお伝えします。

この記事を最後まで読むと、次のことが明確になります。

✔️Setステートメントが必要な理由と、普通の代入(=のみ)との違い
✔️Dim → Set → 操作 → Nothingという、オブジェクトを扱う際の基本の型
✔️Workbook・Worksheet・Rangeという3大オブジェクトの取得方法と使い分け
✔️「オブジェクトが必要です」「オブジェクト変数が設定されていません」といった典型エラーの原因と直し方
✔️弊社GENAIの実運用データに基づく、Excel/VBA業務のAIによる効率化事例
✔️VBAで消耗しないための、AIエージェントを使った次世代の自動化という選択肢
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年8月最新】VBAのSetステートメントとは?オブジェクト変数の作り方・使い方を徹底解説
VBAのSetステートメントの使い方を初心者向けに解説。Workbook・Worksheet・Rangeなどオブジェクト変数の作り方、Nothingでの解放、よくあるエラーの原因と対処法、弊社の実運用データまで徹底解説します。

01 Setステートメントとは何か オブジェクトと普通の値で、代入のルールが違う理由

VBAで変数を使うとき、多くの方は最初にDim x As Integerのような「数値」や「文字列」の変数から学びます。これらの変数への代入は、x = 10のようにイコール記号だけで完結します。ところが、Excelの「シート」や「セル範囲」のようなオブジェクトを変数に入れようとすると、同じ書き方ではエラーになってしまいます。

これは、VBAが「値そのものを代入する」処理と「オブジェクトへの参照(住所のようなもの)を代入する」処理を、意図的に区別しているためです。前者は普段どおりの=だけで済みますが、後者では先頭にSetキーワードを付けるという明示的なルールが定められています。

📚 用語解説

オブジェクト変数:Workbook(ブック)やWorksheet(シート)、Range(セル範囲)など、Excelの「モノ」そのものを参照するために使う変数。数値や文字列を直接格納する「値型の変数」とは異なり、実体そのものではなく実体への「参照」を保持する点が特徴です。

たとえば、以下の2行を比較してみてください。

代入したいもの正しい書き方間違えた場合に起きること
数値・文字列などの値x = 10
s = "テスト"
Setを付けると逆にエラーになる(値にはSetを使わない)
Worksheet・Range・WorkbookなどのオブジェクトSet ws = Worksheets("Sheet1")Setを省略すると実行時エラーになりやすい(詳細は第5章)

1-1. なぜSetが必要なのか:「実体」と「参照」の違い

数値変数にx = 10と書くとき、VBAは変数xが使うメモリ領域に「10」という値そのものをそのまま書き込みます。一方、Excelのシートやセル範囲は、VBAの世界の外側にある「Excelという巨大なアプリケーションの一部」であり、変数の中に実体をコピーして持ち込むことはできません。そこでVBAは、実体そのものではなく「どこにあるか」という参照情報だけを変数に持たせる仕組みを用意しました。これがオブジェクト変数の正体です。

この「参照を渡す」という特別な代入だからこそ、VBAは書き手に対してSetという目印を要求します。もし目印がなければ、VBAは「これは値の代入なのか、参照の代入なのか」を正しく判断できません。

1-2. 具体例で見るSetの基本形

もっとも基本的な形は次のとおりです。ワークシートを1つ変数に格納する例です。

Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
ws.Range("A1").Value = "こんにちは"

1行目のDimで「ws」という名前のWorksheet型の変数を宣言し、2行目のSetで実際のシート(Sheet1)への参照を代入しています。3行目からは、あたかも「Worksheets("Sheet1")」と直接書いたのと同じようにwsを使ってシートを操作できます。長いシート名やブック名を何度も書く必要がなくなり、コードが読みやすくなるのがオブジェクト変数を使う大きなメリットです。

1-3. Setを忘れるとどうなるか(先に結論)

先に結論だけ触れておくと、オブジェクトを代入する行でSetを書き忘れると、多くの場合は実行時エラーが発生します。既定のプロパティを持たないWorksheetのようなオブジェクトでは、その場で「オブジェクトが必要です」というエラーが表示されます。既定のプロパティを持つRangeのようなオブジェクトの場合は、変数の宣言方法によって挙動が変わります。ObjectやVariant型で受けている場合はエラーにならず「セルの値だけ」が代入されてしまうことがあり、Range型など具体的な型で宣言している場合はNothingへの代入とみなされ実行時エラー91になります。詳しい原因と対処法は第5章で扱います。

⚠️ 最初につまずきやすいポイント

Setを付けるべきかどうかは「代入する右辺がオブジェクトかどうか」で決まります。左辺の変数名や見た目では判断できないため、迷ったら「これはExcelの中の“モノ”(シート・セル・ブックなど)を指しているか?」を自問するのが確実です。

02 Setでオブジェクトを作成する基本手順 「宣言→代入→操作→解放」という一連の型を覚える

Setステートメントを正しく使うには、単発の書き方を覚えるだけでなく、オブジェクト変数を扱うときの一連の流れを型として身につけるのが近道です。実務で書かれるVBAコードのほとんどは、以下の4ステップの繰り返しでできています。

①Dim宣言
変数の型を
明示的に指定
②Setで代入
オブジェクトへの
参照を格納
③プロパティ/メソッド
変数経由で
実際に操作
④Nothingで解放
不要になった
参照を明示解放

2-1. ①Dim宣言:型を決めることで補完とエラーチェックが効く

オブジェクト変数を使う前に、まずDim文で変数の型を宣言します。型には、汎用のObject型と、WorksheetRangeWorkbookといった具体的な型の2種類があります。

宣言方法書き方の例特徴
具体的な型で宣言Dim ws As WorksheetVBEの入力支援(インテリセンス)が効き、誤ったプロパティ名を書くと早期にエラーで気づける。実務ではこちらが基本
Object型で宣言Dim obj As Objectあらゆるオブジェクトを格納できる万能型だが、入力支援が効きにくく、実行速度もわずかに遅くなる場合がある
💡 型宣言の基本方針

「何が入るか分かっている」場合は、できる限り具体的な型(Worksheet・Range・Workbookなど)で宣言するのがおすすめです。Object型は、実行時までどの種類のオブジェクトが入るか分からない場合や、複数の異なるアプリケーションのオブジェクト(例:Word・Outlookなど)を同じ変数で扱いたい場合に限定して使うと、コードの安全性が上がります。

2-2. ②Setで代入:Newキーワードと組み合わせるケースもある

通常はすでに存在するシートやセルを取得して代入しますが、Collectionやユーザー定義クラスのように、その場で新しいインスタンスを作るケースもあります。この場合はNewキーワードと組み合わせて使います。

Dim col As Collection
Set col = New Collection
col.Add "サンプル"

📚 用語解説

New キーワード:クラスの「新しいインスタンス(実体)」をその場で作成するためのキーワード。CollectionやDictionary、あるいは自作のクラスモジュールを使うときにSet obj = New クラス名という形で使います。既存のシートやセルのように「すでにExcel内に存在するもの」を取得する場合はNewは不要です。

2-3. ③プロパティ・メソッドで操作:変数経由で簡潔に書ける

Setで代入したあとは、変数を通じてプロパティ(値の取得・設定)やメソッド(処理の実行)を呼び出します。以下は、Setを使わない場合と使った場合を比較した例です。

書き方コード例コメント
Setを使わない(毎回フルパスで指定)Worksheets("集計").Range("A1").Value = 1
Worksheets("集計").Range("A2").Value = 2
同じシートを何度も指定するため冗長になりやすい
Setで変数化してから操作Set ws = Worksheets("集計")
ws.Range("A1").Value = 1
ws.Range("A2").Value = 2
2行目以降が簡潔になり、シート名変更時の修正箇所も1箇所で済む
✔️同じシート・ブック・セル範囲を複数回操作するときは、必ずオブジェクト変数に格納してから使う
✔️For Each文でセルやシートを1つずつ処理するときも、ループ変数はオブジェクト型として宣言しSetで受け取る仕組みになっている
✔️別ブック・別アプリケーション(Word・Outlookなど)を操作する場合ほど、変数化のメリットが大きい

2-4. ④Nothingで解放:後片付けを忘れない

一連の処理が終わったら、必要に応じてSet ws = Nothingのように参照を解放します。特に外部アプリケーションを操作するコードでは、この後片付けを忘れると意図しない不具合につながることがあります。詳しくは第4章で扱います。

AI鬼管理山崎 AI鬼管理山崎
「Dim→Set→操作→Nothing」という4ステップを一つの型として覚えてしまうと、どんなオブジェクトが出てきても迷わなくなります。まずはこの型を体に染み込ませることを優先してください。

03 Workbook・Worksheet・Rangeオブジェクトの使い方 実務で9割以上使う3つのオブジェクトを押さえる

VBAには非常に多くの種類のオブジェクトが存在しますが、実務のマクロで使う頻度が高いのはWorkbook(ブック)・Worksheet(シート)・Range(セル範囲)の3つです。まずはこの3つの取得方法と役割の違いを整理しておくと、応用が効くようになります。

オブジェクト何を表すか代表的な取得方法主なプロパティ/メソッド
Workbook開いているExcelブック(ファイル)そのものWorkbooks("ファイル名.xlsx")Worksheets、Save、Close、Name
Worksheetブック内の1枚のシートWorksheets("シート名")Sheets(インデックス)Range、Cells、Name、Rows、Columns
Rangeシート内のセルまたはセル範囲Range("A1:B10")Cells(1,1)Value、Value2、Formula、Font、Interior

3-1. Workbookオブジェクトの利用方法

複数のブックを同時に扱うマクロでは、どのブックを操作しているかを明示するためにWorkbookオブジェクトを変数化するのが定石です。

Dim wb As Workbook
Set wb = Workbooks.Open("C:\data\売上.xlsx")
MsgBox wb.Name
wb.Close SaveChanges:=False

📚 用語解説

Workbookオブジェクト:Excelで開いている1つのブック(ファイル)を表すオブジェクト。実行中のマクロが動いているブック自身はThisWorkbook、現在アクティブに表示されているブックはActiveWorkbookというキーワードで参照できます。複数ブックをまたぐ処理では、この2つを混同しないよう明示的にSetで変数化するのが安全です。

特に「マクロが書かれているブック」と「処理対象のブック」が別ファイルの場合、ThisWorkbookActiveWorkbookを混同すると、意図しないファイルにデータを書き込んでしまう事故につながります。処理対象を明示的にSetで変数化しておくことは、単なる書きやすさだけでなく事故防止の意味も大きい習慣です。

3-2. Worksheetオブジェクトの利用方法

シート名の変更やシートの追加・削除が発生するマクロでは、Worksheetオブジェクトの変数化がとくに効果を発揮します。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("集計")
ws.Cells(1, 1).Value = "見出し"
ws.Rows(1).Font.Bold = True

📚 用語解説

Worksheetオブジェクト:ブック内の1枚のシートを表すオブジェクト。シート名(文字列)やインデックス番号(左から何番目か)で取得できますが、シートの並び順は利用者の操作で簡単に変わってしまうため、実務ではシート名を指定した取得の方が事故が少なくおすすめです。

3-3. Rangeオブジェクトの利用方法:もっとも使用頻度が高い

セルの値を読み書きするRangeオブジェクトは、VBAの中でもっとも登場回数が多いオブジェクトです。Range("A1")のようにセル番地を文字列で指定する方法と、Cells(1, 1)のように行番号・列番号で指定する方法の2通りがあり、ループ処理で行番号を変数化したい場合はCellsの方が扱いやすくなります。

Dim rng As Range
Set rng = ws.Range("A1:A10")
Dim c As Range
For Each c In rng
  c.Value = c.Value * 2
Next c

📚 用語解説

既定プロパティ(デフォルトメンバー):オブジェクトに1つだけ設定されている「代表的なプロパティ」のこと。Rangeオブジェクトの既定プロパティはValue(セルの値)です。そのためSetを付け忘れてx = Range("A1")と書いてしまっても、既定プロパティ経由でエラーにならず値だけが代入されてしまうことがあり、これが第5章で紹介する「気づきにくいバグ」の原因になります。

💡 Range取得の実務上のコツ

固定セルの操作ならRange、行・列番号をループで動かしたい処理ならCellsという使い分けが基本です。さらに複数セルをまとめて扱うならRange(Cells(1,1), Cells(10,1))のように組み合わせることで、開始行・終了行を変数化した柔軟な範囲指定ができます。

代表菅澤 代表菅澤
Workbook・Worksheet・Rangeの3つを「ファイル・シート・セル」という日本語でまず覚えて、あとから正式名称とプロパティを紐付けていくと理解が早いです。焦らず一つずつ書いて動かして確認しましょう。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 Nothingで参照を解放する重要性 「作ったら片付ける」がバグと動作不安定を防ぐ

オブジェクト変数を使い終わったら、Set 変数名 = Nothingと書いて参照を明示的に解放する習慣を紹介します。これは必須の構文ではありませんが、特定の場面では意識しておくべき重要な作法です。

4-1. Nothingが必要になる典型的な場面

VBAのプロシージャ(Sub/Function)は、処理が終了すると内部の変数は基本的に自動的に解放されます。しかし、以下のようなケースでは、明示的なNothingでの解放が意味を持ちます。

✔️Word・Outlookなど別アプリケーションをCreateObjectで起動した場合 ── 起動したアプリケーションのプロセスが裏で残り続けることを防ぐ
✔️グローバル変数(モジュールレベル変数)としてオブジェクトを保持している場合 ── プロシージャが終わっても自動解放されないため、使い終わったタイミングで明示的に解放する
✔️大量のセル・シートを扱う長時間実行のマクロ ── 意図しない参照の残留による予期しない動作を防ぎたい場面
✔️エラー処理(On Error)の中でオブジェクトの状態をリセットしたい場合

Dim appWord As Object
Set appWord = CreateObject("Word.Application")
appWord.Visible = False
' ここでWordを操作する処理 appWord.Quit
Set appWord = Nothing

📚 用語解説

メモリ解放(参照の解放):プログラムが使い終わったデータ領域を「もう使いません」とVBAに伝えること。VBAには基本的なメモリ管理の仕組みが組み込まれていますが、外部アプリケーションのプロセスのようにVBAの管理範囲の外にあるリソースは、明示的にQuitやCloseで終了させ、Nothingで参照を切り離す作法が推奨されています。

⚠️ Nothingを忘れた場合に起きること

CreateObjectで起動した外部アプリケーション(Word・Outlookなど)でQuitとNothingを忘れると、画面上には見えないままそのアプリケーションのプロセスがバックグラウンドに残り続けることがあります。何度もマクロを実行するうちにプロセスが積み重なり、PCの動作が重くなる原因になるため、外部アプリケーション連携のマクロでは特に意識してください。

4-2. 通常のシート・セル操作ではそこまで神経質にならなくてよい

一方で、Worksheets("Sheet1")Range("A1")のようにExcelブック内部のオブジェクトを扱うだけであれば、プロシージャの終了とともに変数は自動的に解放されるため、毎回Nothingを書かなくても実務上大きな問題にはなりません。「外部アプリケーションを起動したときは必ずNothing」「通常のシート操作では過度に気にしすぎない」というメリハリをつけるのが、実務的なバランス感覚です。

AI鬼管理山崎 AI鬼管理山崎
Nothingは「何でもかんでも書けばいい」というものではありません。CreateObjectで外部アプリを起動したときだけは必ずセットで覚えておく、という運用が現実的です。

05 よくあるエラーと対処法 Setまわりで実際につまずく典型パターンを先回りで潰す

ここでは、Setステートメントに関連して実際によく発生するエラーと、その原因・対処法を一覧にまとめます。エラーメッセージで検索してこの記事にたどり着いた方は、まずこの表から該当するものを探してみてください。

よくあるエラーメッセージ主な原因対処法
オブジェクトが必要ですオブジェクトを代入する行でSetを書き忘れている代入している右辺がオブジェクトかどうかを確認し、Setを追加する
オブジェクト変数または With ブロック変数が設定されていません一度もSetされていない(Nothingのままの)オブジェクト変数を操作しようとしているSet文が実行される前にその変数を使っていないか、条件分岐の抜けを確認する
型が一致しません宣言した型(例:Worksheet)と、実際にSetしようとしているオブジェクトの種類が合っていないDimの型宣言をObject型に緩めるか、正しい型に修正する
実行時エラー9:インデックスが有効範囲にありません(Subscript out of range)存在しないシート名・ブック名を指定してSetしようとしているWorksheets("正しい名前")のようにシート名のスペルミス・全角半角の違いを確認する

5-1. 「セルの値だけが代入されて気づかない」パターンに注意

第3章で触れたとおり、Rangeオブジェクトには既定プロパティ(Value)があるため、Setを書き忘れてもエラーにならずに値だけが代入されてしまうケースがあります。これはエラーが出ない分、原因究明が難しい厄介なバグです。

Dim rng As Range
rng = Range("A1") ' Setを忘れている。rngはRange型で宣言済みかつまだNothingのため、既定プロパティ経由の代入を試みたこの行で実行時エラー91「オブジェクト変数またはWithブロック変数が設定されていません」が発生する
rng.Value = 100 ' 上の行でエラーが発生し処理が止まるため、実際にはこの行に到達しない

💡 見つけにくいバグへの対策

「Setを付けたつもりで忘れていないか」を疑うクセをつけるのが最善策です。特にコピー&ペーストでコードを量産しているときに起きがちなので、オブジェクトへの代入行は書いたあと一呼吸おいて見直す習慣をおすすめします。VBE(VBAエディタ)の構文チェックだけでは検出できないタイプのミスです。

5-2. Withブロックとの組み合わせで起きる勘違い

Withステートメントを使うと同じオブジェクトへの参照を何度も書かずに済みますが、Withの中で扱う対象自体はあらかじめSetで用意しておく必要があります。「Withを使えばSetが不要になる」という誤解をしている方も見かけますが、両者は役割が異なる別々の仕組みです。

✔️Setは「オブジェクトへの参照を変数に格納する」ための構文
✔️Withは「同じオブジェクトへの複数の操作をまとめて書く」ための構文
✔️両方を組み合わせる場合はWith wsのように、事前にSetした変数をWithの対象にする
代表菅澤 代表菅澤
エラーメッセージが出たら、まず「どの行で」「何を」Setし忘れていないかを見る。これだけでVBAのエラーの体感解決速度がかなり上がります。

06 【独自データ】GENAI社内でのExcel/VBA業務削減実績 VBAで自動化していた業務を、AIでどこまで効率化できているか

ここからは、弊社(株式会社GENAI)が実際にExcel・VBA関連の業務をどのように効率化しているかを、数値を交えて紹介します。VBAは強力なツールですが、「そもそもVBAを書く時間そのものを減らしたい」というニーズに対しては、AIの活用が大きな役割を果たしています。

6-1. 弊社の導入状況

弊社ではClaude Max 20xプラン(月額$200・約30,000円)を契約し、Claude Codeを経営・営業・広告・開発・経理・秘書業務まで社内のあらゆる業務に活用しています。Excel/VBAが絡む業務も例外ではなく、マクロの新規作成・既存マクロの修正・デバッグの多くをClaude Codeとの対話で進めています。

業務領域主な用途(Excel/VBA関連)概算削減時間
経理請求書チェック・経費仕訳・Freee連携のExcel集計処理月40時間 → 月5時間
秘書業務日報・レポートのExcel集計とスケジュール調整日2時間 → 日15分
開発VBAマクロ・Pythonスクリプトの書き捨て・不具合修正都度数時間の削減(作業ごとに変動)
⚠️ 数値の注意書き

上記は弊社の肌感ベースの数値であり、業種・業態・担当者のスキルによって削減時間は変動します。「完全自動化」ではなく、人間のレビュー・微調整を伴った上での実感値としてご覧ください。

6-2. 「VBAを書く」から「VBAを説明する」への変化

従来、Excelの集計処理を自動化するには、担当者自身がVBAの文法を学び、Dim・Set・Forループなどを一つずつ書いていく必要がありました。弊社では現在、この作業の多くを「やりたいこと」をClaude Codeに日本語で伝え、生成されたマクロを確認・微調整するという進め方に置き換えています。

Step 1
やりたい処理を
日本語で伝える
Step 2
Claude Codeが
VBA/スクリプトを生成
Step 3
テストデータで
動作を検証
Step 4
問題なければ
業務に組み込み

この流れの利点は、Setの書き忘れのような文法レベルのミスが起きにくいことです。Claude Codeは型宣言・オブジェクトの参照代入・Nothingでの解放といった作法を踏まえたコードを生成できるため、担当者は「出力されたコードが業務上正しく動くか」というレビューに集中できます。

AI鬼管理山崎 AI鬼管理山崎
VBAの文法を完璧に覚えていなくても、「このシートのA列とB列を突き合わせて重複だけ削除して」と伝えれば、たたき台のコードがすぐに出てきます。そこから微調整する方が、ゼロから文法を調べながら書くより圧倒的に速いです。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 VBAの限界とAIエージェントによる次世代の自動化 VBAを「卒業」するのではなく、「使いこなす相棒」を持つという発想

ここまでSetステートメントを中心にVBAの基本を解説してきましたが、実務でVBAを使い続けていると、いくつかの構造的な限界にぶつかります。ここでは、その限界と、AIエージェントを組み合わせることでどう乗り越えられるかを紹介します。

7-1. VBAが抱えがちな3つの課題

VBAは長年にわたってExcel業務の自動化を支えてきた優れたツールですが、実務で運用していく上ではいくつかの課題も見えてきます。

✔️属人化しやすい ── 書いた本人しか仕組みを理解しておらず、担当者が異動・退職すると誰も直せなくなる「野良マクロ」化のリスク
✔️デバッグに時間がかかる ── 「オブジェクトが必要です」のようなエラーメッセージだけでは原因箇所の特定に時間がかかることが多い
✔️Excel以外のデータ・システムとの連携が弱い ── メール・チャット・外部API・クラウドサービスとの連携は、VBA単体では実現が難しいか、かなりの追加実装が必要になる

これらの課題は、VBAという言語そのものの限界というより、「一人の担当者が独力でメンテナンスし続けなければならない」という運用体制の限界に近いものです。

7-2. Claude CodeがVBAの弱点を補う3つの使い方

弊社では、VBAを完全に置き換えるのではなく、Claude Codeを「VBAを書く・直す・説明する」ための相棒として使うという方向で活用しています。

使い方具体的な内容VBA単体との違い
コード生成「やりたいこと」を日本語で伝えてマクロのたたき台を作るゼロから文法を調べる時間が不要になる
デバッグ支援エラーメッセージとコードを渡して原因箇所を特定してもらう該当行を目で追う作業を大幅に短縮できる
引き継ぎ資料化既存の野良マクロの処理内容を日本語で説明してもらう属人化したマクロのブラックボックス化を防げる

📚 用語解説

AIエージェント:人間が細かく指示しなくても、目的を伝えるだけで複数の作業ステップを自ら計画・実行するAIのこと。Claude Codeは「このマクロのA列処理を直して」といった抽象的な指示から、原因の特定・修正案の作成までを一貫して行えるのが特徴です。

さらに一歩踏み込むと、Excelでの集計処理そのものを、VBAではなくPythonなどの別の言語で自動化するという選択肢も見えてきます。VBAはExcelというアプリケーションに縛られた言語ですが、AIエージェントを介せば「Excel前提の自動化」から「業務そのものの自動化」へと視野を広げやすくなります。

💡 VBAを学ぶ意味がなくなるわけではない

VBAの基本文法を理解していることは、AIが生成したコードを正しくレビューするための土台になります。この記事で紹介したSet・Dim・Nothingの仕組みを理解しておくことは、AIと協働する上でもむしろ価値が増しています。

代表菅澤 代表菅澤
VBAを覚えるだけの時代から、VBAの基本を理解した上でAIと一緒に書く時代に変わってきています。基礎を知っているからこそ、AIが出したコードの妥当性を判断できるという構図です。

08 まとめ Setは「参照を渡す」という一点だけ理解すれば怖くない

この記事では、VBAのSetステートメントについて、基本文法から主要オブジェクトでの実践的な使い方、Nothingによる解放、よくあるエラーの原因と対処法、そして弊社GENAIの実運用データとAIエージェントを組み合わせた次世代の自動化までを解説しました。最後にポイントを振り返ります。

✔️Setは「オブジェクトへの参照」を変数に代入するための専用構文で、値の代入とは別ルール
✔️基本の型は「Dim宣言 → Setで代入 → プロパティ/メソッドで操作 → 必要ならNothingで解放」
✔️Workbook・Worksheet・Rangeの3大オブジェクトの取得方法と役割を押さえれば、実務の9割は対応できる
✔️Rangeには既定プロパティがあるため、Setの書き忘れがエラーにならず気づきにくいバグになることがある
✔️外部アプリケーション(Word・Outlookなど)を扱う場合は、Quit+Nothingでの後片付けを忘れない
✔️エラーが出たら「どの行でSetを付け忘れていないか」をまず疑うと解決が早い
✔️VBAの基礎を理解した上でClaude CodeのようなAIエージェントと組み合わせると、属人化・デバッグ負荷・連携の弱さといった課題を補える

Setステートメントは、VBAを学ぶ人が最初にぶつかる壁の一つですが、「オブジェクトは実体ではなく参照を渡す」という原則さえ理解してしまえば、それほど難しいものではありません。まずは今回紹介した「Dim→Set→操作→Nothing」という型を、実際に手を動かしながら覚えていってください。

AI鬼管理山崎 AI鬼管理山崎
弊社では「AI鬼管理」というサービスで、Excel/VBA業務を含めた社内の業務自動化の設計から伴走まで支援しています。VBAのメンテナンスに疲れてきた、という方はお気軽にご相談ください。

VBAの属人化・保守負担、AIエージェントで解消しませんか

「野良マクロ」の引き継ぎ、エラー対応、Excel業務の自動化設計。
弊社の実運用ノウハウをベースに、個別に導入設計のご相談を承ります。

代表菅澤 代表菅澤
VBAで自動化してきた業務を、Claude Codeを使ってさらに省力化したい方に最適です。まずは無料相談で、今の業務の中で最もインパクトが大きい適用領域を一緒に見つけましょう。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

よくある質問

Q. Setステートメントを付けるべきかどうか、簡単に見分ける方法はありますか?

A. 右辺に書いているものが「Excelの中のモノ(シート・セル範囲・ブックなど)」であればSetが必要、「数値や文字列などの単純な値」であればSet不要と考えるのが基本です。迷ったときは、その対象がプロパティやメソッドを持つ「オブジェクト」かどうかを確認すると判断しやすくなります。

Q. SetとLetの違いは何ですか?

A. Letは値そのものを代入するための本来のキーワードで、現在のVBAでは省略するのが一般的なため、普段書いているx = 10は実質的にLetが省略された形です。一方Setはオブジェクトの参照を代入するための専用キーワードで、省略はできません。両者は代入の対象(値かオブジェクトか)によって明確に使い分けられています。

Q. Setを忘れるとどんなエラーが出ますか?

A. Worksheetのように既定プロパティを持たないオブジェクトでは「オブジェクトが必要です」という実行時エラーが発生します。Rangeのように既定プロパティ(Value)を持つオブジェクトでは、エラーにならずに値だけが代入されてしまうことがあり、こちらの方がむしろ原因究明に時間がかかる厄介なパターンです。

Q. Nothingは必ず書かないといけませんか?

A. 必須ではありません。通常のシート・セル操作であれば、プロシージャの終了とともに変数は自動的に解放されるため、毎回書かなくても大きな問題にはなりません。ただし、CreateObjectで外部アプリケーションを起動した場合や、モジュールレベルの変数として長期間オブジェクトを保持する場合は、明示的にNothingで解放することを推奨します。

Q. Object型で宣言するのと、Worksheet型のように具体的な型で宣言するのとでは、何が違いますか?

A. 具体的な型(Worksheet・Range・Workbookなど)で宣言すると、VBE(VBAエディタ)の入力支援が効き、誤ったプロパティ名を書いたときに早期にエラーとして気づけます。Object型は汎用性が高い一方で入力支援が効きにくく、実務では「何が入るか分かっている」場合は具体的な型を優先するのが基本です。

Q. For Each文でオブジェクトをループ処理するときも、Setは必要ですか?

A. For Each文自体は内部的にSetと同等の処理を自動で行っているため、ループ変数に対して明示的にSetを書く必要はありません。ただし、ループ変数自体はオブジェクト型(Range・Worksheetなど)として宣言しておく必要があります。

Q. VBAの文法を覚えるより、最初からAIにコードを書かせた方が早いのでは?

A. 短期的にはAIにコードを生成させる方が速いケースが多いですが、生成されたコードが業務上正しく動作しているかを判断するには、SetやDim、オブジェクトの基本概念を理解しておく必要があります。弊社でも、VBAの基礎を理解した担当者がAIの生成結果をレビューする体制を推奨しています。基礎理解とAI活用は対立するものではなく、両輪として組み合わせるのが実務的です。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
※法人・事業用のメールアドレスでお願いします(Gmail等の個人用フリーメールは受付できません)
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年8月2日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。