it-swarm.com.de

Excel VBA-Kompilierung gibt den Fehler "Benutzerdefinierter Typ nicht definiert" aus, aber keine beleidigende Codezeile

Symptome

Dies ist insbesondere beim Kompilieren eines Excel-VBA-Projekts ein Symptom. Der folgende Fehler tritt auf:

User-defined type not defined

Der Code, der diesen Fehler erzeugt, wird jedoch vom Compiler nicht hervorgehoben, sodass ich das Problem nicht identifizieren kann.

Was ich schon weiß und ausprobiert habe

Dies ist ein Fehler "Benutzerdefinierter Typ nicht definiert", den ich zuvor mit einfachen Problemen wie dem Benennen von As Strig anstelle von As String gesehen habe. Dieser spezielle Fehler wird jedoch nur während der Menüoption Debug > Compile VBAProject angezeigt. Wenn das Fehlermeldungsfeld angezeigt wird, wird die Codezeile, in der der Fehler auftritt, nicht hervorgehoben.

Nach langer Recherche habe ich herausgefunden, dass dieser Fehler auf fehlende Referenzen zurückzuführen ist, und ich habe dies ausgeschlossen, da ich alle benötigten Referenzen und Toolbox-Objekte enthalten habe.

Um sicherzustellen, dass mir keine offensichtlichen fehlenden Dim-Anweisungen fehlen, habe ich allen Codepages (einschließlich Formulare) Option Explicit hinzugefügt, um sicherzustellen, dass nichts fehlt. Der Fehler wird immer noch angezeigt, wenn ein Compile ausgeführt wird.

Es gibt auch diesen bekannten Fehler , der besagt, dass das Problem aufgrund der VB6 -Projekte mit binärer Kompatibilität bekannt ist:

Deaktivieren Sie die binäre Kompatibilität und kompilieren Sie das Projekt. Visual Basic hebt die Codezeile hervor, die den benutzerdefinierten Typ enthält das ist nicht definiert. Nach der Behebung des Problems wird die binäre Kompatibilität kann wieder eingeschaltet werden.

Ich habe diesen Artikel über diese Frage und Antwort gefunden. Ich kann diese Option jedoch nicht im Standard-Editor für Excel VBA finden.

Helfen Sie mir und meinen Verstand zu retten!

Ich weiß aus Google-Suchen und anderen Fragen, dass ich nicht der einzige bin, der dieses Problem hatte.

Ich habe versucht, den Code manuell durchzugehen, aber es gibt einfach zu viele Zeilen, um dies machbar zu machen.

Gibt es eine Möglichkeit, die binäre Kompatibilität in Excel-VBA-Projekten zu deaktivieren? Wie finden Menschen diese fehlerhafte Codezeile, wenn sie nicht das debuggen können, was sie ändern müssen? Jede Hilfe wäre schön!

Danke im Voraus.

Bearbeiten: Ich habe die störende Codezeile gefunden und so ist mein spezielles Problem gelöst Das Problem ist immer noch vorhanden, nachdem die betreffende Zeile entfernt wurde. Es war der Name eines falschen Steuerelements in einem Formular, auf das im Code verwiesen wird. Dies löst immer noch nicht die Frage, wie Sie diesen fehlerhaften Code finden würden. Können wir einen geeigneten Weg finden, um den fehlerhaften Code zu finden, wenn dieser Fehler auftritt, damit andere in der Zukunft diese Agonie vermeiden können?

18

Meine Lösung ist keine gute Nachricht, aber zumindest sollte es funktionieren.

Mein Fall ist: Ich habe eine .xlsm von einem Kollegen. 1) Ich öffne es und klicke auf den Button: es funktioniert gut. 2) Ich speichere die Datei, schließe Excel und öffne die Datei erneut: Jetzt funktioniert sie nicht mehr. Die Schlussfolgerung lautet: Der Code ist in Ordnung, aber Excel kann Referenzen nicht korrekt verwalten. (Ich habe versucht, das erneute Hinzufügen der Referenzen ohne Erfolg zu entfernen.)

Die Lösung besteht also darin, jedes referenzierte Objekt als Variant zu deklarieren und CreateObject("Foo.Bar") anstelle von New Foo.Bar zu verwenden.

Zum Beispiel:

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

Ersetzt durch:

Dim objXML As Variant
Set objXML = CreateObject("MSXML2.DOMDocument")
5
jng

Da es sich anhört, als hätten Sie viele verschiedene potentielle Lösungen ausprobiert, müssen Sie dies jetzt auf die lange methodische Art tun.

Erstellen Sie eine neue leere Arbeitsmappe. Dann kopieren Sie Stück für Stück Ihre alte Arbeitsmappe hinein. Fügen Sie eine Referenz hinzu und schreiben Sie ein wenig Code, um es zu testen. Stellen Sie sicher, dass es kompiliert wird, dass es ausgeführt wird. Fügen Sie ein Sub oder eine Funktion hinzu, schreiben Sie ein kleines Test-Sub, um es auszuführen, und stellen Sie außerdem sicher, dass es kompiliert wird. Wiederholen Sie diesen Vorgang langsam, indem Sie alles hinzufügen und testen.

Sie können dies etwas beschleunigen, indem Sie zunächst größere Brocken ausprobieren. Wenn Sie eines gefunden haben, das das Problem auslöst, entfernen Sie es und zerlegen Sie es in kleinere Teile.

Entweder finden Sie den Täter oder Sie haben eine neue Arbeitsmappe, die das Problem magisch nicht hat. Letzteres wäre auf eine Art versteckter Beschädigung in der Arbeitsmappendatei zurückzuführen, wahrscheinlich im binären vbproject-Teil.

Willkommen in der Welt des Debugging ohne Debugger oder andere hilfreiche Tools, die Ihnen das schwere Heben erleichtern!

4
AndASM

Ich hatte eine ähnliche Erfahrung, aber es war, weil ich in einem meiner Kurse eine Aufzählung umbenannt hatte. Ich habe die Klassen exportiert und erneut importiert, die sich auf die alte Aufzählung bezogen hatten, und die Fehlermeldung verschwand. Dies legt nahe, dass es sich um ein Caching-Problem in der VBA-Umgebung handelt.

2
Rob Bishop

Ich hatte genau das gleiche Problem (scheint immer aufzutreten, wenn ich versuche, ein Interface auf einem Benutzerformular zu implementieren. Laden Sie Code Cleaner von here herunter und installieren Sie es. Dies ist ein Freeware-Dienstprogramm, das mich schon mehrfach gerettet hat. Mit Ihrer VBA Öffnen Sie das Projekt, und führen Sie die Option "Clean Code..." aus. Vergewissern Sie sich, dass Sie das "Sicherungsprojekt" und/oder "Alle Codemodule exportieren" an sicheren Speicherorten ausführen, bevor Sie die Bereinigung ausführen. Soweit ich weiß, exportiert dieses Dienstprogramm alles neu und importiert es anschließend neu Module und Klassen, die Compiler-Fehler beseitigen, die sich in den Code eingeschlichen haben. Funktioniert für mich wie ein Zauber! Viel Glück.

2
user3803315

Ich habe Sie alle wissen lassen, dass ich auch dieses Problem hatte. Anstelle des Codes lag das Problem bei dem Makro, das eine Schaltfläche aufruft. (Es hatte das Makro "createroutes.createroutes" aufgerufen, aber ich hatte das Modul "createroutes" in "routen" umbenannt.) Daher wurde das Problem dadurch behoben, dass die Schaltfläche auf die richtige Position zeigte.

2
Cameron Bradley

Ich konnte den Fehler durch beheben 

  1. Zugriff vollständig schließen 
  2. Umbenennen der Datenbankdatei
  3. Öffnen Sie die umbenannte Datenbankdatei in Access.
  4. Akzeptierte verschiedene Sicherheitswarnungen und Eingabeaufforderungen .
    • Ich habe mich nicht nur für die Aktivierung von Makros entschieden, sondern auch akzeptiert, die umbenannte Datenbank zu einem vertrauenswürdigen Dokument zu machen.
    • Die vorherige Datei wurde auch als vertrauenswürdiges Dokument markiert.
  5. Kompilieren Sie das VBA-Projekt erfolgreich ohne Fehler, keine Codeänderungen.
  6. Nach dem erfolgreichen Kompilieren konnte ich Access wieder schließen und wieder in den ursprünglichen Dateinamen umbenennen. Ich musste auf die gleichen Sicherheitsabfragen antworten, aber nachdem ich das VBA-Projekt geöffnet hatte, wurde es immer noch ohne Fehler kompiliert.

Eine kleine Geschichte dieses Falls und Beobachtungen:

  • Ich poste diese Antwort, weil meine beobachteten Symptome ein wenig anders waren als andere und/oder meine Lösung einzigartig erscheint.
  • Zumindest während eines Teils der Zeit, in der ich den Fehler erlebte, zeigte mein VBA-Fenster zwei zusätzliche, "mysteriöse" Projekte. Bedauerlicherweise habe ich die Namen nicht aufgezeichnet, bevor ich den Fehler behoben habe. Eines war so etwas wie ACXTOOLS. Die Module im Inneren konnten nicht geöffnet werden.
  • Ich denke, das ursprüngliche Problem war in der Tat auf fehlerhaften Code zurückzuführen, da ich vor dem Versuch, den Modulcode zu aktualisieren, wesentliche Änderungen an einem Formular vorgenommen hatte. Aber auch nach der Korrektur des Codes blieb der Fehler bestehen. Ich wusste, dass der Code funktioniert hat, weil das Formular geladen werden würde und keine Fehler. Wie in der ursprünglichen Version angegeben, wird der Fehler "Benutzerdefinierter Typ nicht definiert" angezeigt, aber es wird keine fehlerhafte Codezeile angezeigt.
  • Bevor ich diesen Fehler fand, stellte ich sicher, dass alle erforderlichen Referenzen hinzugefügt wurden. Ich habe die Datenbank mehrmals komprimiert und repariert. Ich habe Access geschlossen und die Datei zwischen verschiedenen Fixierungsversuchen mehrmals geöffnet. Ich habe das verdächtige Formular entfernt, bekam aber immer noch den Fehler. Ich habe verschiedene Schritte ausprobiert, die hier und in anderen Foren vorgeschlagen wurden, aber das Problem ist durch nichts gelöst.
  • Ich bin über dieses Update gestolpert, als ich eine Sicherungskopie für drastische Maßnahmen erstellte, beispielsweise das Löschen eines Formulars/Moduls. Beim Öffnen der Sicherungskopie trat das Problem jedoch nicht erneut auf.
1
C Perkins

Möglicherweise versuchen Sie, über Excel VBA mit PowerPoint zu arbeiten, und Sie haben die PowerPoint-Objektbibliothek nicht zuerst aktiviert.

Wählen Sie dazu im VBA-Editor-Hauptmenü Extras, Verweise und blättern Sie nach unten, um auf die Bibliothek mit dem Namen Microsoft PowerPoint xx.x Object Library zu klicken. Office 2007 ist Bibliothek 12, jede Office-Version hat eine andere Bibliothek. Zu Ihrer Information, bei der Aktivierung der 2007-Bibliothek sind einige ungewöhnliche Fehler und Dateibeschädigungen aufgetreten, aber jemand versucht, dieses Makro mit Excel 2003 zu öffnen und auszuführen. Die alte Version von Excel erkennt die neuere Bibliothek nicht, was Probleme zu verursachen scheint.

1
Nathalii.

Ich hatte dieses Problem mit einem normalen VB6-Programm. Es stellte sich heraus, dass ich auf eine Klassendefinition verzichtet hatte, nicht auf einen benutzerdefinierten Typ. Anscheinend sah VB etwas wie "Thing.name" und nahm an, dass Thing eine UDT war. Ja, es ist ein schwerwiegender VB6-Fehler, aber man kann kaum erwarten, dass Microsoft etwas unterstützt, das vor sechzehn Jahren verkauft wurde. Welche Versionen der verschiedenen Produkte verwenden Sie? Dies ist nur interessant, wenn es bei einem von MS unterstützten Produkt vorkommt. 

1
user3818635

Ich weiß, das ist alt, aber ich hatte ein ähnliches Problem und habe eine Lösung gefunden:

Ich hatte das gleiche Problem mit einem Modul, das ich von Excel in Access portiert hatte. In einer nicht zusammenhängenden UDF habe ich 'As Range' gedimmt, aber in Access gibt es keine Bereiche. Möglicherweise verwenden Sie einen Variablentyp, ohne dass die entsprechende Referenzbibliothek aktiviert ist.

Wenn Sie über nicht standardmäßige Dims verfügen, google sie und sehen Sie, ob der Verweis auf diese Bibliothek unter Tools fehlt.

-E

1
Schalton

Für zukünftige Referenz -

Ich hatte dieses Problem mit diesem Code in Microsoft Access, wobei der Debugger die Zeile mit dem Kommentar hervorhob:

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"

Ich musste Referenzen auswählen, die zuvor nicht ausgewählt waren. Sie sind

Microsoft Outlook 15.0-Objektbibliothek
Microsoft Outlook-Ansichtssteuerung

1
Mark

Für den Scripting.Dictionary-Typ können Sie die Late-Bindung (wie bereits erwähnt) verwenden, mit:

Dim Dict as Object
Set Dict = CreateObject("Scripting.Dictionary")

Was funktioniert, aber Sie erhalten den Code nicht automatisch abgeschlossen. Oder Sie verwenden die frühe Bindung. Sie müssen jedoch sicherstellen, dass VBA den Typ Scripting.Dictionary finden kann, indem Sie den Verweis zur Microsoft Scripting Library über VBA -> Tools -> References -> "Microsoft Scripting Runtime" hinzufügen. Dann können Sie verwenden:

Dim Dict as Scripting.Dictionary
Set Dict = New Scripting.Dictionary

... und die automatische Vervollständigung funktioniert.

1
RexBarker

Ich hatte das gleiche Problem. Wenn Sie Microsoft Scripting Runtime aktivieren, sollten Sie gut sein. Sie können dies unter Tools> Referenzen> tun und dann das Kontrollkästchen für Microsoft Scripting Runtime aktivieren. Dies sollte Ihr Problem lösen.

0
Vincent

Ein anderes Problem mit demselben Symptom: Ich habe eine Klasse implementiert, die nicht definiert wurde. Es wurde mit einem #if verpackt, von dem ich dachte, er hätte es dem Compiler nicht erlauben sollen, aber nicht so. Entfernen Sie den Kommentar aus der Implements-Anweisung und alles ist in Ordnung. Ich gehe davon aus, dass der Import der Definition auch funktionieren würde ...

0
Ed Hoeffner

Ich hatte gestern den gleichen Fehler: Ich hatte in meinem Projekt zwei Klassen, cProgress und cProgressEx, von denen eine nicht mehr verwendet wurde, und als ich die cProgress-Klasse entfernte, erhielt ich denselben Kompilierungsfehler.

Ich habe es geschafft, den Fehler wie folgt zu beheben:

  • Exportiert alle Module, Formulare und Klassen auf die Festplatte
  • Alles aus dem Projekt entfernt
  • Das Projekt wurde gespeichert
  • Importierte alle Module, Formulare und Klassen, entfernte die cProgress-Klasse und kompilierte sie. 
  • Der Fehler ist verschwunden.
0

Ich hatte das gleiche Problem, als ich die Arbeitsmappe eines anderen Analysten erbte. Er ordnete jeder Schaltfläche in seinem Arbeitsblatt Makros zu. Wenn ich den Namen des Moduls (nicht den Prozedurnamen) änderte, trat dieser Fehler auf. Die Lösung war einfach. Lassen Sie die Schaltfläche eine Ereignisprozedur _OnClick() im Arbeitsblatt ausführen, und führen Sie diese Prozedur explizit Call MyProcedureName() aus.

0
Mark Bauer

Als ich diesen Fehler in einer MS Access-Datenbank hatte, habe ich die Befehlszeilenoption/decompile zusammen mit der Option Compact/Repair verwendet. Hat für mich gearbeitet. Ich hatte einen Verweis entfernt, von dem ich sicher war, dass mein Code nicht mehr verwendet wurde, und fing an, diesen Fehler zu erhalten.

0
UtilizeIT

Nach Jahren habe ich eine, wenn nicht die, Antwort auf den Microsoft-Fehler des Fehlers "Benutzerdefinierter Typ nicht definiert" in Excel entdeckt. Ich führe Excel 2010 für Windows aus.

Wenn Sie eine UDF mit dem Namen 'xyz()' haben, dann rufen Sie eine nicht vorhandene Entität auf, die mit diesem Namen beginnt, gefolgt von einem Punkt gefolgt von anderen Zeichen - wenn Sie z. B. versuchen, einen nicht vorhandenen Bereich aufzurufen name 'xyz.abc', wirft die blöde app die falsche msg. aus, woraufhin sie zu ihrem blatt zurückkehrt.

In meinem Fall war es besonders irritierend, weil ich UDFs mit nur einem Buchstaben benennen lasse, z. x(), y() usw., und ich habe auch Bereichsnamen, die Perioden enthalten - 'x.a', 'c.d' usw. Jedes Mal, wenn ich beispielsweise einen Bereichsnamen falsch geschrieben habe, zum Beispiel , 'x.h', der Fehler 'Benutzerdefiniert ...' wurde einfach ausgelöst, weil irgendwo in meinem Projekt eine UDF mit dem Namen 'x()' vorhanden war.

Es dauerte mehrere Stunden. diagnostizieren. Die oben genannten Vorschläge, inkrementell Code aus Ihrem Projekt zu entfernen oder umgekehrt den gesamten Code zu entfernen und inkrementell wieder hinzuzufügen, waren auf dem richtigen Weg, folgten jedoch nicht. Es hat nichts mit Code an sich zu tun; es hat nur mit dem Namen der ersten Codezeile in jeder proc zu tun, nämlich der Sub MyProc- oder Function MyProc-Zeile, die die proc benennt. Als ich eine meiner UDFs mit nur einem Buchstaben in einem völlig nicht zusammenhängenden Teil des Projekts auskommentierte, kam es zu dem fehlerhaften Fehler msg. ging weg und von dort nach einer weiteren Stunde. oder so konnte ich die Regel wie gesagt verallgemeinern.

Möglicherweise tritt der Fehler auch mit Satzzeichen außer Punkt ('.') auf. In einem Bereichsnamen sind jedoch nicht sehr viele Nicht-Alpha-Zeichen zulässig. underline ('_') ist erlaubt, aber die Verwendung in der beschriebenen Weise scheint den Fehler nicht zu werfen.

Jim Luedke

0
Jim Luedke

Late Binding 

Dieser Fehler kann aufgrund einer fehlenden Referenz auftreten. Wenn Sie zum Beispiel von der frühen Bindung zur späten Bindung wechseln, kann durch das Entfernen der Referenz möglicherweise noch etwas Code vorhanden sein, der auf Datentypen verweist, die die gelöschte Referenz betreffen.

Fügen Sie die Referenz hinzu, um zu sehen, ob das Problem behoben ist.

Möglicherweise handelt es sich bei dem Fehler nicht um einen Compiler-Fehler, sondern um einen Linker-Fehler. Daher ist die betreffende Zeile unbekannt. Schade um Microsoft!

0
jas0501

Ein bisschen spät und keine vollständige Lösung, aber für alle, die von diesem Fehler ohne offensichtlichen Grund (mit allen definierten Referenzen usw.) betroffen werden, hat mich dieser Thread auf den richtigen Weg gebracht. Das Problem scheint auf einen Cache-bezogenen Fehler in MS Office VBA Editor zurückzuführen zu sein.

Nachdem einige Änderungen an einem Projekt vorgenommen wurden, darunter etwa 40 Formulare mit Codemodulen sowie 40 Klassen und einige globale Module in MS Access 2016, schlug die Kompilierung fehl. 

Das Auskommentieren von Code war offensichtlich keine Option. Auch das Exportieren und erneute Importieren aller 80+ -Dateien erschien mir als sinnvoll. Ich konzentrierte mich auf das, was kürzlich geändert wurde, und mein Verdacht konzentrierte sich auf das Entfernen eines Klassenmoduls. 

Da ich keine besseren Ideen hatte, habe ich ein leeres Klassenmodul mit demselben Namen, das zuvor entfernt worden war, erneut erstellt. Und voliá der Fehler war weg! ... Es war sogar möglich, das nicht verwendete Klassenmodul wieder zu entfernen, ohne dass der Fehler erneut angezeigt wurde, bis Änderungen in einem Formularmodul gespeichert wurden, das zuvor eine WithEvents-Deklaration enthielt, die die nun entfernte Klasse enthielt.

Nicht ganz sicher, ob die WithEvents-Deklaration tatsächlich den Fehler auslöst, auch nachdem die Deklaration entfernt wurde. Und keine Hinweise darauf, wie man tatsächlich herausfinden kann (ohne Informationen über die Entwicklungsgeschichte zu haben), welche Form der Täter sein könnte ...

Was das Problem schließlich gelöst hat, war:

  1. In VBE - Kopieren Sie den gesamten Code aus dem Formularcode-Modul
  2. Öffnen Sie in Access das Formular in der Entwurfsansicht und setzen SieHas Moduleproperty auf No .
  3. Speichern Sie das Projekt (dadurch wird jeglicher mit Formular verknüpfter Code entfernt)
  4. (Nicht sicher, ob Sie Access schließen und erneut öffnen müssen, aber ich habe es getan)
  5. Formular in Entwurfsansicht öffnen undHas Moduleproperty wieder auf Yes setzen
  6. Fügen Sie in VBE den kopierten Modulcode ein
  7. Sparen
0
Kristian L