エクセル雑感
無効な前方参照か、コンパイルされていない種類への参照です。

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2024-02-17 最終更新日:2024-02-17

無効な前方参照か、コンパイルされていない種類への参照です。


365のエクセルで最近(2023年の後半くらい)になって急に出始めたエラーメッセージです。


いくつかのプログ等で対策が書かれているのを見かけましたが、これと言った決め手も無さそうに見受けられました。
つまり、書かれている方法で解決した人もいれば解決しない人もいるといった状況に見受けられます。

私の環境でも、このエラーが発生するファイルが1つ存在します。
ですが、個人趣味で使っているExcelファイルなのでそんなには困っていませんでした。
大抵はVBAの一部変更&再コンパイルで直ってしまうので、それで済ませていました。

このような状況で、私も決定的な対策を見つけられないままに月日が流れてしまっていたのです、、、
ですが、最近このエラーが出た時にVBAの記述をある書き方に変更したらこのエラーを回避できました。
ということで、そのVBA記述方法をここに記録しておきます。

ただし、あくまで解決方法の一例ということでお考え下さい。
これで「無効な前方参照か…」のエラーが必ず解決できるという事ではないと思います。
エラー発生している環境(バージョン等々)も様々だと思われますので、いろいろな環境で試してもらうしか確認することはできません。
他の方法で解決できない時などに、以下の方法も試してみてください。


エラーメッセージの詳細

無効な前方参照か、コンパイルされていない種類への参照です。

実行時エラー '-2147319767(80028029)

オートメーションエラーです。
無効な前方参照か、コンパイルされていない種類への参照です。


このメッセージが出る時の状況

私の手元で度々このエラーが出るファイルの処理内容です。

マクロの本体ブックで、ボタンからマクロ開始
・他のブックを開く
・WEBスクレイピング
・一部の情報をマクロブックのシートにも転記
・開いたブックを保存

※特にこのような処理だからエラーが出るという事ではありません。
あくまで、私の手元で良く発生するファイルの処理内容ということです。

上記の一連のVBAの中で、シート参照する時に発生しています。

Dim wb As Workbook
Set wb = ActiveWorkbook
If wb.Worksheets("Sheet1").Range("...") ・・・
※ここではVBA記述を簡略化して分かり易く書き直しています。

このIfステートメントで、先のエラーが発生します。
Ifステートメントを変数への代入に変更しても同じエラーになります。
さらに、オブジェクト変数にシートを入れるように、
Dim ws As Worksheet
Set ws = Wb.Worksheets("Sheet1")
このSetステートメントでさえもエラーが発生してしまいます。
簡単にVBAを書き直して回避できるものではないようです・・・
エラーがでた時点(デバッグで停止している時点)では、対処方法が見つからないのでマクロを停止させるしかありませんでした。


このメッセージが出る原因は何か

当初はエラー原因や解決方法が分からなかったので、
VBAで原因不明のエラー発生時の一般的な対処と同様に、

・適当にVBA記述を変更してコンパイルする。
・モジュールを再作成してコンパイルする。
・エクセルを再起動する。

多くの場合はこれらの対処で解決します。
ブログ等で見受けられる対処でも、これらの方法が書かれていたりするようでした。
私の場合も、これらの対処で回復していたので、それでよしとしていました。
ただし、しばらくして、忘れたころに再発するというのを繰り返していました。

今回ふと思い立ち、エラー時のVBAの状況を詳しく見てみることにしました。
エラーが発生するのは、あくまで「シート参照」で発生するようです。
エラー発生した時点で、イミディエイトでいろいろ調べてみました。

?wb.Worksheets.Count
これは正しく値を返します。
?wb.Worksheets(1).Name
これも正しく値を返します。
?wb.Worksheets(2).Name
これがエラーになります。もちろんシートは実在します。
?wb.Worksheets("Sheet1").Name
これがエラーになります。"Sheet1"は1番目のシートです。
ちょっと不思議な動作になっていますが、
?wb.Worksheets(1).Name
?wb.Worksheets("Sheet1").Name

この2つは同じシートを参照するはずなのですが、なぜか下の方だけがエラーになります。
ということで、とにかくエラーがでる記述を書き出してみると、

・シートを名前で参照できない。
・Indexが2以上のシートはIndex数値でも参照できない。

そこで、上記2つの書き方以外でシートを参照すれば良いのではないかと考えました。
For Each
ForEachは、コレクションの各要素に対して繰り返し処理を実行します。コレクションはオブジェクトの集まりですので、ForEachは、コレクションの中から、個々のオブジェクトを取り出して処理する場合に使用します。コレクションの全ての要素に対しての処理が終わるとループは終了します。
これではどうだろうか・・・
なんと、これなら全シートにアクセスできます。
つまり無効な前方参照のエラーがでた時点でも、
For Eachならシートにアクセスできました。

ということなら、直接シート名を指定するのではなく、
指定シート名のシートをFor Eachで取得して返すFunctionを作成し、そのFunctionを使うようにすれば良いという事になります。

Function getSheet(ByVal wb As Workbook, ByVal aName As String) As Worksheet
  Dim ws As Worksheet
  For Each ws In wb.Worksheets
    If ws.Name = aName Then
      Set getSheet = ws
      Exit Function
    End If
  Next
  Stop '指定のシート名のシートがない。適宜対応してください。
End Function
※Function名・引数・VBA記述は適宜書き直してください。

このFunctionを使って先のエラー発生する箇所を変更します。

Dim wb As Workbook
Set wb = ActiveWorkbook
If wb.Worksheets("Sheet1").Range("...") ・・・

Dim wb As Workbook
Set wb = ActiveWorkbook
If getSheet(wb,"Sheet1").Range("...") ・・・

その他代入等々が複数個所あるので同様に全て書き換えます。
これで対策完了です。

この対策を行ってからは、今のところは先のエラーは出なくなりました。
これで完全に解決したのかどうか、しばらく様子を見てみることにします。




同じテーマ「エクセル雑感」の記事

スピらない スピル数式 スピらせる
難しい数式とは何か?
いくつかの数式の計算中にリソース不足になりました。
無効な前方参照か、コンパイルされていない種類への参照です。
エクセルが起動しない、Excelが立ち上がらない
情報システムとは:業務ルールでデータを処理する仕組みです。
変数名に意味は本当に必要か? 層ごとに変わる重要性
脱Excelか、真のExcel活用か:現場実態の二者択一
【スピルの勧め】スピル数式と生成AIが変えるExcel業務の新標準
2の補数表現で表された負の2進数を10進数に変換する方法
非正規化(カンマ区切り)の結合と集計:最適な手法は?


新着記事NEW ・・・新着記事一覧を見る

シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ