🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の参照設定 — ツール > 参照設定、参照不可のライブラリ、そして Can't find project or library

|

Excel VBA の参照設定 — ツール > 参照設定、参照不可のライブラリ、そして Can't find project or library

TL;DR — VBA エディターの ツール > 参照設定(Tools > References)は、プロジェクトの 依存関係リスト です。チェックを付けた一行ごとに、一つのライブラリの名前をコードで使えるようになります:Word.Application、Dictionary、ppLayoutBlank。この一覧は ブックの中に保存 されますが、解決はファイルを開く PC ごとに改めて 行われます。その PC にライブラリがない、あるいは古いバージョンしかないと、その行には MISSING:(日本語版では「参照不可:」)と表示され、プロジェクト全体がコンパイルできなくなります。たいていは Left や Date のような無関係な行で Can't find project or library(「プロジェクトまたはライブラリが見つかりません。」)が出ます。直すには、その PC で参照不可の行のチェックを外すか、別のバージョンに置き換えます。防ぐには、参照設定は開発中の IntelliSense のためだけに使い、ファイルは遅延バインディング、つまり CreateObject を使い追加の参照設定を一切持たない形で出荷します。

' 「Microsoft Word 16.0 Object Library」への参照設定がある場合
Dim wd As Word.Application          ' 事前バインディング:IntelliSense と名前付き定数
Set wd = New Word.Application

' 参照設定がまったくない場合
Dim wd2 As Object                   ' 遅延バインディング:Word のある PC ならどこでも動く
Set wd2 = CreateObject("Word.Application")

この記事は、Excel から他の Office アプリを操作する シリーズの第三回です。PowerPoint と Word のガイドでは、相手のプログラムのオブジェクトモデルを扱いました。この記事では両者をつなぐもの、つまり VBA が Word.Range や ppLayoutBlank の意味をどう知るのか、そしてそのつながりが他人の PC で切れていたら何が起きるのかを扱います。シリーズ共通のルールはここでも同じです。どのオブジェクトもいずれか一つのアプリケーションに属している。だから、どのアプリのものかを明示する。

この記事で学べること

  • 考え方の軸:参照設定は依存関係リストであり、PC ごとに解決される
  • 既定の四つの参照と、参照を追加する方法
  • 二つのコンパイルエラー:チェック漏れによるものと、参照不可のライブラリによるもの
  • 壊れた参照設定のせいで Left、Date、Format が失敗する理由
  • 優先順位が、どのライブラリの Range になるかを決める仕組み
  • コードで参照設定を一覧する方法と、その方法で修復すべきでない理由
  • 条件付きコンパイルで、事前バインディングで開発し遅延バインディングで出荷する

考え方の軸:ファイルと一緒に旅をする依存関係リスト

コードに書いた名前は、どれもどこかで見つからなければなりません。MsgBox は VBA ライブラリから、Worksheets は Excel のライブラリから、Word.Document は Word のライブラリから来ます。ただし最後のものは、プロジェクトが Word のライブラリを参照設定に載せている場合に限ります。VBA エディター(Alt+F11)を開き、ツール > 参照設定 を選ぶと一覧が見られます。

チェックを付けた各行には、どの ライブラリかが記録されています。識別子とバージョン番号、そしてあなたの PC でそれが見つかったファイルです。ブックが保存するのは一覧であって、ライブラリそのものではありません。ですから、ファイルが開かれるたびに、VBA は各ライブラリを その PC で 改めて探します。

相手の PC の状態 VBA の動き
同じライブラリがあり、Office のバージョンが同じか新しい 見つける。Office のライブラリは新しいバージョンに自動で切り替わりもする
そのプログラムがインストールされていない その行に MISSING: の印を付ける
あなたより古いバージョンの Office その行に MISSING: の印を付ける。参照設定は新しい方向にしか切り替わらず、古い方向には戻らない
64 ビット版 Office 上の 32 ビット専用コントロール その行に MISSING: の印を付ける

この表がこのテーマのすべてです。参照設定とは、ライブラリがそこにあるという約束であり、その約束はあなたが見たこともない PC の上で確かめられるのです。

既定の四つの参照と、参照の追加

新しい Excel ブックには最初から四つの参照設定があり、普段それを意識する必要はほとんどありません。

  • Visual Basic For Applications:言語そのもの。Left、Date、MsgBox
  • Microsoft Excel 16.0 Object Library:Workbook、Range、Worksheet
  • OLE Automation:基本的な COM サポート
  • Microsoft Office 16.0 Object Library:FileDialog など、Office 共通のオブジェクト

ユーザーフォームを挿入すると Microsoft Forms 2.0 Object Library が加わります。最初の二つは外すことも移動することもできません。

追加するには、一覧でチェックを付けて OK をクリックします。たとえば Microsoft Word 16.0 Object Library や Microsoft Scripting Runtime です。一覧にないときは、参照...(Browse...)でライブラリのファイルを指定できます。マクロの実行中や中断中はメニューがグレー表示になるので、先にリセットボタンを押してください。

得られるものは、新しいオブジェクトに対する IntelliSense、wdReplaceAll のような名前付き定数、CreateObject の代わりに使える New、そしてコンパイル時の型チェックです。遅延バインディングとの詳しい比較は CreateObject のガイド にあります。この記事で扱うのは、ファイルがあなたの手を離れたあとに参照設定が払わせる代償です。

二つのコンパイルエラー、二つの別の問題

参照設定のトラブルの多くは、二つのコンパイルエラーのどちらかとして現れます。そしてこの二つは正反対のことを意味しています。

User-defined type not defined(「ユーザー定義型は定義されていません。」)。Dim doc As Word.Document や Dim d As Dictionary と書いたのに、このプロジェクトでは参照設定にチェックが付いていない状態です。コンパイラはその型を聞いたこともありません。ライブラリにチェックを付けるか、変数を Object に変えて CreateObject で作ります。

Can't find project or library(「プロジェクトまたはライブラリが見つかりません。」)。参照設定は一覧に ある のに、この PC では MISSING: と表示されている状態です。ライブラリのある環境で作られたファイルが、ライブラリのない環境で開かれたのです。作成者の PC ではすべて動いていたので、ユーザーのところまで届いてしまうのはこちらのほうです。

Word がないと Left や Date が失敗する理由

Can't find project or library の紛らわしいところは、エラーが指す場所です。Word の参照設定が参照不可になったブックは、こんな行で止まります。

customer = Left(Range("A2").Value, 10)     ' 強調表示されるのは Left

Left は Word とは何の関係もありません。しかし VBA はコンパイル時に、修飾されていない名前を参照設定の順に一つずつ探していき、参照不可のライブラリがあるとその探索が壊れます。コンパイラは位置づけられない最初の名前で諦めます。それはしばしば Left、Mid、Date、Format、Trim のようなよく使う組み込み関数です。強調表示された関数は、巻き込まれただけなのです。

直すのは、エラーが出ている PC の上です。

  1. VBA エディターを開き、マクロが中断中ならリセットボタンを押して、ツール > 参照設定 を選びます。
  2. MISSING: で始まる行を探します。
  3. コードがそのライブラリを必要としていなければチェックを外し、必要ならこの PC にあるバージョンにチェックを付けます。
  4. デバッグ > VBAProject のコンパイル(Debug > Compile VBAProject)を選び、プロジェクトが再びコンパイルできることを確認します。

Left の代わりに VBA.Left と書け、という助言を見かけることがあります。完全修飾した名前は探索を飛ばすので、その行はコンパイルできます。しかしそれは症状を隠すだけです。参照不可の参照設定はそのまま残っており、そのライブラリを実際に使うコードはやはり失敗します。

優先順位:どのライブラリの Range になるのか

二つのライブラリが同じ名前を定義しているときは、一覧の順番で決まります。Excel のライブラリは Word のライブラリより上にあるので、Excel のコードで修飾しない Range、Shape、Font、Selection は Excel の ものを意味します。Word のガイド で示したとおり、Dim r As Range に続けて Set r = doc.Content と書くと型の不一致で失敗するのはこのためです。

参照設定ダイアログの 優先順位 の矢印でライブラリを上に移動することはできます。しかし、裸の名前の意味を変えるためにライブラリを動かすのは罠です。次に誰かが参照設定を追加すれば、また変わってしまいます。代わりに修飾しましょう:Word.Range、Excel.Range、Scripting.Dictionary。修飾した名前は、順番がどうであっても同じものを意味します。

コードで参照設定を一覧する、そしてその方法で修復しない理由

VBProject.References を通して、VBA から一覧を調べられます。

Sub ListReferences()
    Dim ref As Object, desc As String
    For Each ref In ThisWorkbook.VBProject.References
        desc = "(unavailable)"
        On Error Resume Next
        desc = ref.Description              ' 壊れた参照設定では失敗することがある
        On Error GoTo 0
        Debug.Print IIf(ref.IsBroken, "MISSING  ", "ok       "); ref.GUID; "  "; desc
    Next ref
End Sub

これにはトラスト センター(Trust Center)の VBA プロジェクト オブジェクト モデルへのアクセスを信頼する が必要です。これがオフだと、最初の行がエラー 1004、Programmatic access to Visual Basic Project is not trusted(Visual Basic プロジェクトへのプログラムによるアクセスは信頼性に欠けます)で失敗します。出力は、Debug.Print のガイド と同じくイミディエイト ウィンドウに出ます。

同じオブジェクトには AddFromGuid、AddFromFile、Remove もあり、参照設定を修復する Workbook_Open を書きたくなります。これに頼ってはいけません。必要な設定は既定でオフで、IT 部門にロックされていることも多く、しかも参照不可の参照設定があるプロジェクトのコードは、修復処理を実行できるところまでコンパイルすら進まないかもしれません。こうしたコードは自分の PC での診断に使い、出荷する修正手段にはしないでください。

判断の分かれ目:参照設定で開発し、参照設定なしで出荷する

参照設定は依存関係であり、依存関係はどれもユーザーの PC についての約束です。私のルールは、手元を離れるファイルには既定の四つの参照設定だけを持たせる です。それ以外はすべて CreateObject と Object 型の変数を経由させます。そうすれば、そのプログラムがある PC ならどこでも動き、ない PC では分かりやすい実行時エラーで失敗します。

コードを書いている間まで IntelliSense を諦める必要はありません。条件付きコンパイルを使えば、一つのスイッチでモジュールを二つの書き方の間で切り替えられます。

#Const EARLY_WORD = False            ' 開発中は True にし、参照設定にもチェックを付ける

Sub MakeReport()
#If EARLY_WORD Then
    Dim wd As Word.Application
    Set wd = New Word.Application
#Else
    Dim wd As Object
    Set wd = CreateObject("Word.Application")
#End If
    wd.Visible = True
    ' ... 残りのコードはまったく同じ ...
End Sub

開発中は EARLY_WORD = True にし、Word の参照設定にチェックを付けておきます。出荷前に False に戻し、参照設定のチェックを外します。無効なほうの分岐の行はコンパイルされないので、ライブラリは必要ありません。名前付き定数は、Const wdExportFormatPDF As Long = 17 のように自分の Const 宣言に置き換えます。これについては Const のガイド で扱っています。こうしておけば、ファイルはどのバージョンの Office でも開け、探すべき参照不可の行も生まれません。

ExcelMaster の活用

参照設定の問題は他人の PC の上で、間違っていない行のエラーとして表面化します。あなたのところに届く頃には、手がかりは Left が見つからないと書かれたスクリーンショット一枚だけです。

ExcelMaster はブックの参照設定の一覧を読み、エラーの裏にある参照不可のライブラリを突き止め、ローカル定数を使った遅延バインディングにコードを書き換えることもできます。こうしてファイルは、ユーザーごとの PC に何がインストールされているかに左右されなくなります。

よくある質問

Excel VBA で参照設定を追加するには?

Alt+F11 で VBA エディターを開き、ツール > 参照設定 を選び、たとえば Microsoft Word 16.0 Object Library のようなライブラリにチェックを付けて OK をクリックします。メニューがグレー表示になっているときはマクロが実行中か中断中なので、先にリセットボタンを押してください。

Can't find project or library はどういう意味ですか?

プロジェクトの参照設定のどれかが、この PC では MISSING(参照不可)になっているという意味です。ライブラリがインストールされていないか、古いバージョンしかないためです。ツール > 参照設定 を開き、参照不可の行のチェックを外すか置き換えて、もう一度コンパイルします。エラーで強調表示される行は、たいてい原因ではありません。

VBA で Left や Date がコンパイルエラーになるのはなぜですか?

壊れた参照設定があると VBA は名前を解決できなくなり、Left、Mid、Date、Format のようなよく使う関数が真っ先に失敗します。強調表示された行ではなく、参照不可の参照設定を直してください。

参照設定と CreateObject の違いは何ですか?

参照設定はライブラリの型、定数、IntelliSense をコンパイラに与えますが、ファイルを開くすべての PC にそのライブラリが存在しなければなりません。CreateObject は参照設定なしで実行時にプログラムを見つけるので移植性は高くなりますが、IntelliSense と名前付き定数は手放すことになります。

新しい Excel ブックにはどの参照設定がありますか?

四つです。Visual Basic For Applications、Microsoft Excel 16.0 Object Library、OLE Automation、Microsoft Office 16.0 Object Library。ユーザーフォームのあるブックには、Microsoft Forms 2.0 Object Library も加わります。

検証環境

検証環境: Excel 365 (Windows 11)、VBA 7.1 — 最終確認 2026-10-02。

関連ガイド: VBA PowerPoint · VBA Word · VBA CreateObject · VBA Outlook · VBA Dictionary · VBA Const · VBA Option Explicit · VBA Debug.Print