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

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」問題 への同意と反論
「Excel3ステップ理論」3階層システムの応用
「ポケモンを確実に見つける方法」をExcelで数学してみた
エクセルで「もういくつ寝るとお正月」
エクセルで連立方程式を解く(MINVERSE,MMULT)
VBAが消えてしまった!マクロが壊れて動かない!
スピらない スピル数式 スピらせる
難しい数式とは何か?
いくつかの数式の計算中にリソース不足になりました。
無効な前方参照か、コンパイルされていない種類への参照です。
エクセルが起動しない、Excelが立ち上がらない


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

第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方 |生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する! |生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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