Excel VBAプロジェクト**をコンパイルしたときに発生する症状です。以下のようなエラーが発生します。
ユーザー定義型が定義されていません
しかし、このエラーが発生するコードはコンパイラによってハイライトされないため、問題を特定することができません。
これは"User-defined type not defined"エラーで、以前にも何かをAs String
ではなくAs Strig
と命名するような単純な問題で見たことがあります。しかし、このエラーは、Debug > Compile VBAProject
メニューオプションでのみ表示され、エラーメッセージボックスが表示されても、エラーが発生しているコードの行がハイライトされません。
いろいろと調べた結果、このバグは参照の欠落に関連している可能性があることがわかり、必要な参照とツールボックスオブジェクトをすべて含んでいるので、これを除外しました。
念のため、すべてのコードページ(フォームを含む)に「Option Explicit」を追加して、明らかな「Dim」ステートメントの欠落がないことを確認しました。コンパイルしてもエラーが出ます。
既知のバグによると、この問題はVB6プロジェクトがバイナリ互換性を使用しているために発生することが知られています。
バイナリ互換性をオフにして、プロジェクトをコンパイルします。ビジュアルベーシック は、定義されていないユーザー定義の型を含むコード行を強調表示します。 が定義されていないことを示します。問題が解決したら、バイナリ互換性 を再びオンにすることができます。
この記事はこちらのQuestion and Answerで見つけたのですが、Excel標準の VBA エディタではこのオプションを見つけることができません。
Google検索や他の質問から、この問題を抱えているのは私だけではないことがわかりました。
手動でコードを確認しようとしましたが、行数が多すぎて実行できませんでした。
Excel VBAプロジェクトでバイナリ互換性をオフにする方法はありますか?また、変更すべき箇所をデバッグできない場合、どのようにして問題のあるコードを見つけるのでしょうか?よろしくお願いします。
よろしくお願いします。
編集: 問題のあるコードを見つけたので、私の特定の問題は解決しました その特定の行を削除しても、問題はまだ残っています - フォームのコードで参照されるコントロール名のスペルミスでした。これでは、問題となっているコードをどのようにして見つけるかという特定の問題は解決しません。このバグが発生したときに問題のあるコードを見つける良い方法を見つけることができたら、将来、他の人がこの苦しみを避けることができるでしょうか?
私の解決策は良いニュースではありませんが、少なくとも動作するはずです。
私のケースは同僚から.xlsmが送られてきました。1) ファイルを開いてボタンをクリックすると、うまくいきました。2) ファイルを保存し、エクセルを閉じ、再びファイルを開くと、今度はうまくいかなくなりました。結論としては、コードは問題ないが、エクセルが参照を正しく管理できない。(参照を削除したり、再度追加したりしてみましたが、うまくいきませんでした)
そこで解決策としては、参照されているすべてのオブジェクトを Variant
として宣言し、New Foo.Bar
の代わりに CreateObject("Foo.Bar")
を使用します。
例えば、以下のようになります。
Dim objXML As MSXML2.DOMDocument
Set objXML = New MSXML2.DOMDocument
に置き換えられます。
Dim objXML As Variant
Set objXML = CreateObject("MSXML2.DOMDocument")
これまで様々な方法を試してきたようなので、これからは長い目で見ていくしかないでしょう。
新しい白紙のワークブックを作ります。そこに古いワークブックを少しずつコピーしていきます。参考文献を追加し、ちょっとしたコードを書いてテストします。確実にコンパイルし、確実に実行します。サブや関数を追加します。ここでも、実行するためのテストサブを少し書き、コンパイルを確認します。このプロセスをゆっくりと繰り返し、すべてを追加してテストします。
最初に大きな塊を試してみて、問題の引き金となるものを見つけたら、それを削除して、テスト用の小さなピースに分割することで、この作業を少しスピードアップすることができます。
犯人が見つかるか、魔法のように問題のない新しいワークブックができあがるかのどちらかです。後者の場合は、ワークブックファイルに何らかの隠れた破損があることが考えられますが、おそらくバイナリのvbproject部分でしょう。
デバッガやその他の便利なツールがない状態でのデバッグの世界へようこそ。