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

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("...") ・・・

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

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




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

プログラミングとは

コンピューター(PC)は、こと計算については天才的な能力を持つが、その他の事については一般人の常識が通用しない子供のような存在です、人間で言うなら、サヴァン症候群でしょう、サヴァン症候群のPCに対して何かをしてもらいたい時に、それを文章で伝えるものがプログラムです。従って、プログラミングでは、あなたの常識は一切通用…
「ネ申Excel」問題 への同意と反論
「ネ申Excel」、私は流行に疎いので、ネ申の意味が最初分からなかった、どうやら、「神Excel」のことのようです、大学教授が書いた、Excelの問題点と解決策の提案がかかれた論文です、この論文に対する、私なりの同意と反論です。Excelを論ずるのに、なぜネ申などという言葉を使ったのか、私には少々理解しがたい部分も…
「Excel3ステップ理論」3階層システムの応用
エクセルでシステムを作成する時に、念頭に置くべき3階層の考え方になります、本来はExcelに限った事ではなく、システム作成では常に3階層を考えて設計しますが、さらに考えを推し進めて3ステップとして考えます、つまり、「Excel3ステップ理論」です。データを入力するシートで、さらに集計し、さらに印刷までやろうとしたら、
「ポケモンを確実に見つける方法」をExcelで数学してみた
ポケモンGO関連の記事をみていたら、【ポケモンGO】かくれているポケモンを確実に見つける方法、という記事を読んだ。普通にそうだなという感想なのですが、もっとまじめに数学したら、もっと良い方法があるのではないかと。元記事はあちこちで見た気がするが、多分これでしょ 「【ポケモンGO】かくれているポケモンを確実に見つける…
エクセルで「もういくつ寝るとお正月」
今日は2020年1月31日です。早いもので1月が終わろうとしています。つまり、2020年も12分の1がすでに終わろうとしています。この調子では、あっという間に今年(2020年)も終わってしまいそうです。
エクセルで連立方程式を解く(MINVERSE,MMULT)
とつぜん連立方程式を解くことになりました。なぜ連立方程式を解くことになったのか、そして、どうやって答えを導き出したのか… これらを自身の覚え書きの意味も含めて記事にしておきます。ただし、行列の難しい説明は抜かして、どうやって解決したかの経緯の説明が中心になります。
VBAが消えてしまった!マクロが壊れて動かない!
2020年4月15日に配信されたWindows10用セキュリティ更新プログラムの不具合で、なんと、VBAが全て消えてしまうという事が発生しています。今後もあり得る事なので、このような場合の対策について記しておきます。VBAが消えてしまうとはどんな状態なのか エクセルファイルを開くと、以下のようなメッセージが出力され…
スピらない スピル数式 スピらせる
タイトルというのはなかなか難しい。当初思ったお題は、・スピらぬなら壊してしまえスピル数式 ・スピらぬならスピらせてみようスピル数式 ・スピらぬならスピルまで待とうスピル数式 もちろん、壊してしまう訳には行かないし、待っていたってスピルする訳ないし… 当然「スピらぬならスピらせてみようスピル数式」と言う事になる。
難しい数式とは何か?
エクセルでは難しい数式は要らない、𝕏ではそんな話を良く目にします。同じことをするのなら、難しいより簡単な方が良い、それは当たり前ですね。では「難しい」とは何を指しているのでしょうか? 普段良く「数字で語る」みたいなことを言いますが、「難しい」の基準もなくそれを計る尺度も存在しない極めて曖昧な話…
いくつかの数式の計算中にリソース不足になりました。
365のエクセルで最近になって急に出始めたエラーメッセージです。「いくつかの数式の計算中にリソース不足になりました。そのため、これらの数式の値を求められません。」何が原因で出力されるメッセージなのでしょうか… どのような対処をしたら良いのでしょうか… エラーメッセージの詳細 かつて見た覚えのないメッセージです。
無効な前方参照か、コンパイルされていない種類への参照です。


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

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


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


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