23

症状

これは、特にExcel VBA プロジェクトをコンパイルするときに発生する症状です。次のエラーが発生します。

User-defined type not defined

ただし、このエラーを生成するコードはコンパイラによって強調表示されないため、問題を特定できません。

私がすでに知っていることと試したこと

これは「ユーザー定義型が定義されていません」というエラーでAs StrigAs String. ただし、この特定のエラーはDebug > Compile VBAProjectメニュー オプションの実行中にのみ表示され、エラー メッセージ ボックスが表示されても、エラーが発生しているコード行は強調表示されません。

多くの調査の結果、このバグは参照の欠落に関連している可能性があることがわかりました。必要なすべての参照と Toolbox オブジェクトを含めたので、これを除外しました。

明らかに欠落しているDimステートメントを見逃していないことを確認するためにOption Explicit、すべてのコード ページ (フォームを含む) に追加して、何も欠落していないことを確認しました。コンパイルを実行すると、エラーが引き続き表示されます。

バイナリ互換性を使用するVB6プロジェクトが原因で問題が発生することが知られていることを示す次の既知のバグもあります。

バイナリ互換性をオフにして、プロジェクトをコンパイルします。Visual Basic は、定義されていないユーザー定義型を含むコード行を強調表示します。問題を解決したら、バイナリ互換性を有効に戻すことができます。

この質問と回答でこの記事を見つけましたが、標準の Excel VBAエディターではこのオプションを見つけることができません。

私と他の人の正気を保つのを手伝ってください!

Google 検索やその他の質問から、この問題を抱えているのは私だけではないことがわかりました。

コードを手動で調べてみましたが、実行するには行が多すぎます。

Excel VBA プロジェクトでバイナリ互換性をオフにする方法はありますか? 変更する必要があるものをデバッグできない場合、この問題のあるコード行をどのように見つけるのでしょうか? どんな助けでも素敵です!

前もって感謝します。

編集: 問題のあるコード行を見つけたので、特定の問題は解決しましたその特定の行を削除した後も、問題はまだここにあります。コードで参照されているフォームのコントロール名のスペルミスでした。これは、この問題のあるコードが問題であったことをどのように見つけるかという特定の問題をまだ解決していません。このバグが発生したときに問題のあるコードを見つけて、将来他の人がこの苦痛を回避できるようにする良い方法を見つけることができますか?

4

21 に答える 21

7

私の解決策は良いニュースではありませんが、少なくともうまくいくはずです。

私の場合: 同僚からの .xlsm があります。1)それを開いてボタンをクリックします。正常に動作します。2) ファイルを保存し、Excel を閉じて、もう一度ファイルを開きます: もう機能しません。結論: コードは問題ありませんが、Excel は参照を正しく管理できません。(参照を再追加して削除しようとしましたが、成功しませんでした)

したがって、解決策は、参照されるすべてのオブジェクトを として宣言し、代わりにVariantを使用することです。CreateObject("Foo.Bar")New Foo.Bar

例えば:

Dim objXML As MSXML2.DOMDocument
Set objXML = New MSXML2.DOMDocument

と取り換える:

Dim objXML As Variant
Set objXML = CreateObject("MSXML2.DOMDocument")
于 2014-04-10T18:25:13.047 に答える
4

私もこの問題を抱えていたことを皆さんにお知らせします。問題はコードではなく、ボタンが呼び出していたマクロにありました。('createroutes.createroutes' マクロを呼び出していましたが、'createroutes' モジュールの名前を 'routes' に変更しました。) したがって、ボタンを正しい場所に向けることで問題が修正されました。

于 2016-01-31T22:51:07.007 に答える
1

今後の参考のために -

デバッガーがコメント付きの行を強調表示している Microsoft Access のこのコードで、この問題が発生しました。

Option Compare Database
Option Explicit

Dim strSQL As String
Dim rstrSQL As String
Dim strTempPass As String


Private Sub btnForgotPassword_Click()
On Error GoTo ErrorHandler

Dim oApp As Outlook.Application '<---------------------------------Offending line
Dim oMail As MailItem
Set oApp = CreateObject("Outlook.application") 'this is the "instance" of Outlook
Set oMail = oApp.CreateItem(olMailItem) 'this is the actual "email"

以前は選択されていなかった参照を選択する必要がありました。彼らはいた

Microsoft Outlook 15.0 オブジェクト ライブラリ
Microsoft Outlook ビュー コントロール

于 2016-07-27T16:12:10.297 に答える
1

考えられる解決策は、Excel VBA 経由で Powerpoint を操作しようとしていて、最初に Powerpoint Object Library をアクティブ化していないことです。

これを行うには、VBA エディターのトップ メニューで [ツール]、[参照] を選択し、下にスクロールして Microsoft Powerpoint xx.x Object Library という名前のライブラリをクリックします。Office 2007 はライブラリ 12 で、Office の各バージョンには異なるライブラリがあります。参考までに、2007 ライブラリをアクティブ化すると、いくつかの奇妙なエラーとファイルの破損が発生しましたが、誰かが Excel 2003 を使用してこのマクロを開いて実行しようとしました。古いバージョンの Excel は新しいライブラリを認識しないため、問題が発生するようです。

于 2017-10-17T14:21:44.837 に答える
1

これが古いことは知っていますが、同様の問題があり、修正を見つけました:

Excel から Access に移植したモジュールで同じ問題が発生しました。関連のない UDF で「範囲として」を淡色表示していましたが、範囲は Access に存在しません。適切な参照ライブラリを有効にせずに変数型を使用している可能性があります。

非標準の薄暗い場合は、それらをグーグルで検索し、ツールの下にそのライブラリへの参照がないかどうかを確認してください。

-E

于 2015-12-03T20:37:25.473 に答える
0

Microsoft Scripting Runtime を有効にすると、同じ問題が発生します。ツール > 参照 > でこれを行い、Microsoft Scripting Runtimeのボックスをオンにします。これで問題が解決するはずです。

于 2016-07-12T12:26:01.123 に答える
0

数年後、Excel の「ユーザー定義型が定義されていません」という Microsoft のバグに対する答えではないにしても、1 つの答えを発見しました。Excel 2010 for Windows を実行しています。

たとえば ' xyz()' という名前の UDF がある場合、その名前で始まり、その後にピリオドと他の文字が続く存在しないエンティティを呼び出すと、たとえば、存在しない範囲名 ' ' を呼び出そうとするとxyz.abc、愚かなアプリは間違ったメッセージをスローし、その後シートに戻ります。

x()私の場合は、たとえば,などの 1 文字だけで名前が付けられた UDF がありy()、ピリオドを含む範囲名もあるからです。' x.a'、' c.d' などです。範囲名 -- たとえば、'xh' の場合、' ' という名前の UDF がx()プロジェクトのどこかに存在するという理由だけで、'User-defined …' エラーがスローされました。

数時間かかりました。診断する。プロジェクトからコードを段階的に削除する、または逆にすべてのコードを削除して段階的に追加し直すという上記の提案は、正しい軌道に乗っていましたが、実行されませんでした。コード自体とは何の関係もありません。これは、各 proc のコードの最初の行の名前、つまり proc に名前を付けるSub MyProcorFunction MyProc行の名前のみに関係します。プロジェクトのまったく関係のない部分で、1 文字の名前の UDF の 1 つをコメントアウトしたときに、エラー メッセージがバグったのです。立ち去り、そこからさらに1時間後。またはそう、私は述べたようにルールを一般化することができました.

おそらくバグは、ピリオド (' ') 以外の句読点文字.でも発生しますが、範囲名で許可されている非アルファ文字はあまり多くありません。下線 (' _') は使用できますが、説明されている方法で使用してもバグは発生しないようです。

ジム・リュードケ

于 2014-09-11T05:02:20.393 に答える
0

遅延バインディング

このエラーは、参照がないために発生する可能性があります。たとえば、アーリー バインディングからレイト バインディングに変更する場合、参照を削除すると、削除された参照に固有のデータ型を参照するコードが残る場合があります。

参照を含めてみて、問題がなくなるかどうかを確認してください。

エラーはコンパイルエラーではなくリンカエラーである可能性があるため、特定の行は不明です。マイクロソフトの恥!

于 2014-01-28T14:57:00.340 に答える
0

同じ症状の別の問題: 定義されていないクラスを実装しました。#if でラップされていましたが、コンパイラがそれを認識できないようにするべきだと思っていましたが、そうではありませんでした。Implements ステートメントのコメントを削除すると、すべて問題ありません。定義のインポートも機能すると思います...

于 2015-02-04T20:45:15.333 に答える
0

コードが次の行で停止したときに、このエラーも見ました。

myNode を MSXML2.IXMLDOMNode として暗くする

[ツール] > [設定] から "Microsoft XML, v6.0" を追加する必要があることがわかりました。

それは私のために働いた。

于 2020-04-29T16:25:17.683 に答える
0

実際に何が間違っているのか、直接修正するのかについての答えはありません。

すべてのコードとフォームをエクスポートし、それらを新しいワークブックにインポートすると修正されたと報告できます。すべての作業が回復され、作業に戻るためにこれ以上何もする必要はありませんでした。それが機能するので、それが Excel のバグであるに違いないこと、またはそれが何であれ、新しいバージョンではまだ欠落していることは明らかです。

この Excel (2007) のバグがどのように機能するかについて、手がかりを得ることができます。クラスモジュール(または2つ)の削除に関連しているようです。(ただし、何らかの理由で毎回すべてのクラス モジュールではありません。) 削除されたモジュールのどの部分もコードで使用されていませんでした (または、新しくインポートされたバージョンも機能しませんでした)。1 つのモジュールは、いくつかのコメントだけに切り詰められ (後で「欠落している」可能性のあるものをすべて削除することを期待して)、プロジェクトの他の部分に視覚的に接続するコードはありませんでした。しかし、コード モジュールを完全に削除した直後にエラーが発生しました。削除された(ただし、念のためエクスポートされた)モジュールが返されたときにも、エラーは停止しました。したがって、便宜上、このプロジェクトでは、このエラーを回避するために 2 つの未使用のコード モジュールをパックしていました。

その場合、プロジェクト内のどこでもこれら (この場合は 2 つ) のクラス モジュールから何も使用されていない場合でも、一部の離脱したモジュールの一部の要素が VBA 環境に残っているように見えます。その結果、デバッグ/コンパイルによってその要素が検出され、何かが欠落していても不思議ではありません。不足しているものはプロジェクトのどこにもないため、強調表示するものは何もないため、メッセージのみが表示され、他には何も起こりません。それは観察された行動を説明するでしょう。

于 2020-05-28T03:09:18.990 に答える
0

昨日も同じエラーが発生しました。プロジェクトに cProgress と cProgressEx の 2 つのクラスがあり、そのうちの 1 つは使用されなくなりました。cProgress クラスを削除すると、同じコンパイル エラーが発生しました。

次のようにエラーを修正できました。

  • すべてのモジュール、フォーム、およびクラスをハード ドライブにエクスポートしました
  • プロジェクトからすべてを削除しました
  • プロジェクトを保存しました
  • すべてのモジュール、フォーム、およびクラスを再インポートし、cProgress クラスを削除してコンパイルしました。
  • エラーが消えました。
于 2014-10-08T04:52:06.650 に答える