Excel VBA compiler lance une erreur "Type Défini par L'utilisateur non défini" mais ne va pas à la ligne de code incriminée

Symptômes

C'est un problème spécifiquement lors de la compilation d'un VBA Excel projet. L'erreur suivante se produit:

User-defined type not defined

cependant, le code qui produit cette erreur n'est pas mis en évidence par le compilateur et donc je ne peux pas identifier le problème.

Ce que je sais déjà et ont essayé de l'

il s'agit d'une erreur "Type Défini par L'utilisateur non défini" que j'ai déjà vu avec des problèmes simples tels que nommer quelque chose As Strig au lieu de As String. Cependant, cette erreur particulière n'apparaît que pendant le Debug > Compile VBAProject menu option et lorsque la boîte de message d'erreur apparaît, elle ne met pas en évidence la ligne de code dans laquelle l'erreur se produit.

après de nombreuses recherches, j'ai découvert que ce bogue peut être lié à des références manquantes et j'ai écarté cette possibilité car j'ai inclus toutes les références nécessaires et les objets de la boîte à outils.

Pour m'assurer que je n'étais pas en manque de toute évidence une absence de Dim états J'ai ajouté Option Explicit pour toutes les pages de code (formulaires inclus) pour s'assurer que rien ne manquait. L'erreur apparaît toujours lors de l'exécution d'une compilation.

Il y a aussi ce bug connu cela indique que le problème a été connu pour se produire à cause de VB6 projets utilisant la compatibilité binaire:

désactivez la compatibilité binaire et compilez le projet. Visual Basic mettra en évidence la ligne de code qui contient le Type défini par L'utilisateur que n'est pas définie. Après avoir résolu le problème, compatibilité binaire peut-être tourné le dos.

j'ai trouvé cet article par le biais de ce la Question et la Réponse cependant, je ne trouve pas cette option dans le standard d'Excel VBA éditeur.

aidez à sauver ma santé mentale et celle des autres!

Je sais à partir de recherches Google et d'autres questions que je ne suis pas le seul qui a eu ce problème.

j'ai essayé de passer en revue le code manuellement mais il y a tout simplement trop de lignes pour le faire.

Existe-t-il un moyen de désactiver la compatibilité binaire dans les projets Excel VBA? Comment les gens trouvent-ils cette ligne de code offensante s'ils ne peuvent pas déboguer ce qu'ils doivent changer? Toute aide serait belle!

je vous Remercie à l'avance.

Edit:j'ai trouvé la ligne de code malveillant et si mon problème est résolu le problème est toujours là après avoir enlevé cette ligne - c'était un mispelt nom de contrôle sur un formulaire référencé dans son code. Cela ne résout toujours pas la question particulière de savoir comment vous feriez pour trouver ce code offensant était le problème. Sommes-nous en mesure de trouver un bon moyen de trouver le code offensant lorsque ce bogue se produit afin que d'autres dans le futur peuvent éviter cette agonie?

16
demandé sur Community 2013-10-30 15:00:31

17 réponses

ma solution n'est pas une bonne nouvelle mais au moins ça devrait marcher.

Mon cas: j'ai un .xlsm par un collègue. 1) Je l'ouvre et je clique sur le bouton: il fonctionne très bien. 2) je sauve le fichier, ferme excel, ouvre le fichier à nouveau: maintenant il ne fonctionne plus. La conclusion est la suivante: le code est correct, mais excel ne peut pas gérer correctement les références. (J'ai essayé de supprimer le re-ajout des références sans aucun succès)

Donc la solution est de déclarer chaque objet référencé comme Variant et utilisez CreateObject("Foo.Bar") au lieu de New Foo.Bar.

Par exemple:

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

Remplacé par:

Dim objXML As Variant
Set objXML = CreateObject("MSXML2.DOMDocument")
5
répondu jng 2014-04-10 18:25:13

Puisqu'il semble que vous avez essayé de nombreuses solutions potentielles différentes, vous aurez probablement à faire cela la longue méthode maintenant.

créer un nouveau cahier vierge. Puis recopiez petit à petit votre vieux cahier d'exercices. Ajouter une référence, écrire un peu de code pour le tester. S'assurer qu'il compile, s'assurer qu'il fonctionne. Ajouter un sous ou une fonction, encore une fois, Écrire un petit sous test pour l'exécuter, aussi s'assurer qu'il compile. Répétez ce processus en ajoutant lentement et tests tout.

vous pouvez accélérer un peu cela en essayant d'abord de plus grands morceaux, puis quand vous trouvez un qui déclenche le problème, retirez-le et cassez-le en petits morceaux pour les tests.

Soit vous trouverez le délinquant, ou vous aurez un nouveau classeur que la magie n'a pas le problème. Ce dernier serait dû à une sorte de corruption cachée dans le fichier workbook, probablement dans la partie binaire du projet VB.

Bienvenue dans le monde de débogage sans débogueurs ou autres outils utiles pour faire le levage lourd pour vous!

4
répondu AndASM 2013-11-13 17:42:21

j'ai eu exactement le même problème (semble toujours se produire lorsque j'essaie d'implémenter une Interface sur une userform. Télécharger et installer le nettoyeur de Code de ici. C'est un utilitaire freeware qui m'a sauvé à de nombreuses reprises. Avec votre projet VBA ouvert, lancez le "Clean Code..." option. Assurez-vous de vérifier le "projet de sauvegarde" et/ou "exporter tous les modules de code" à des endroits sûrs avant d'exécuter le nettoyage. D'après ce que j'ai compris, cet utilitaire exporte et réimporte tous les modules et classes, ce qui élimine les erreurs de compilation qui se sont glissées dans le code. Ça a marché comme un charme pour moi! Bonne chance.

2
répondu user3803315 2014-07-03 21:31:05

juste pour vous faire savoir que j'ai eu ce problème aussi. Plutôt que le code, le problème résidait dans la macro qu'un bouton appelait. (Il avait appelé le 'createroutes.la macro createroutes, mais j'avais renommé le module 'createroutes' en 'routes'.) Par conséquent, le problème a été corrigé en pointant le bouton à la bonne position.

2
répondu Cameron Bradley 2016-01-31 22:51:07

Avait une expérience similaire, mais c'était parce que j'avais renommé un enum dans une de mes classes. J'ai exporté et réimporté les Classes qui se référaient à l'ancien enum et le message d'erreur a disparu. Ceci suggère qu'il s'agit d'un problème de mise en cache dans L'environnement VBA.

2
répondu Rob Bishop 2017-02-06 11:03:42

j'ai eu ce problème avec un programme VB6 ordinaire. Il s'est avéré que j'avais omis une définition de classe, pas un type défini par l'utilisateur. Apparemment VB a vu quelque chose comme " truc.nom" et supposé chose était un UDT. Oui, c'est un bug VB6 sérieux, mais vous ne pouvez pas vous attendre à ce que Microsoft supporte quelque chose qu'ils ont vendu il y a 16 ans. Alors, quelles versions des différents produits impliqués utilisez-vous? Cela n'est intéressant que si cela se produit avec un produit que MS supporte.

1
répondu user3818635 2014-08-19 03:24:08

je sais que c'est vieux, mais j'ai eu un problème similaire et a trouvé un correctif:

j'ai eu le même problème avec un module que J'ai porté D'Excel à Access, dans un UDF non relié, Je diminuais 'As Range' mais les gammes n'existent pas dans Access. Vous pouvez utiliser un type de variable sans avoir la bibliothèque de référence appropriée allumée.

si vous avez des dims non standard, cherchez-les sur google et voyez si vous manquez la référence à cette bibliothèque sous Outils.

- E

1
répondu Schalton 2015-12-03 20:37:25

Pour référence future -

j'ai eu ce problème avec ce morceau de code dans Microsoft Access avec le débogueur mettant en évidence la ligne avec le commentaire:

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"

j'ai dû sélectionner des références qui n'avaient pas été sélectionnées auparavant. Ils étaient

Microsoft Outlook 15.0 Bibliothèque D'Objets

Contrôle Affichage Outlook

1
répondu Mark 2016-07-27 16:12:10

j'ai pu corriger l'erreur par

  1. fermeture complète de L'accès
  2. renommer le fichier de la base de données
  3. ouvrir le fichier de base de données renommé dans Access.
  4. Accepté divers avertissements de sécurité et les instructions.
    • non seulement j'ai choisi D'activer les Macros, mais j'ai aussi accepté de faire de la base de données renommée un Document de confiance.
    • Le fichier précédent avait été marqué comme un de Confiance Document.
  5. compiler avec succès le projet VBA sans erreur, Aucun changement de code.
  6. après la compilation réussie, j'ai pu fermer L'accès à nouveau, le renommer à nouveau pour le nom de fichier original. J'ai dû répondre aux mêmes messages de sécurité, mais une fois que j'ai ouvert le projet VBA, il a quand même été compilé sans erreur.

Un peu d'histoire de ce cas et d'observations:

  • je poste cette réponse parce que mon observé les symptômes étaient un peu différents des autres et/ou ma solution semble unique.
  • au moins pendant une partie du temps où j'ai ressenti l'erreur, ma fenêtre de VBA montrait deux projets supplémentaires, "mystérieux". Malheureusement, je n'ai pas enregistré les noms avant d'avoir résolu l'erreur. L'une ressemblait à des ACXTOOLS. Les modules à l'intérieur n'ont pas pu être ouverts.
  • je pense que le problème original était en effet dû au mauvais code puisque j'avais fait des changements majeurs à un formulaire avant d'essayer de mettre à jour son code de module. Mais même après avoir corrigé le code de l'erreur persiste. Je savais que le code fonctionnait, parce que le formulaire se chargerait et pas d'erreurs. Comme l'indique le post original, l'erreur" Type Défini par L'utilisateur non défini " apparaîtrait, mais elle n'irait pas à une ligne de code fautive.
  • avant de trouver cette erreur, j'ai veillé à ce que toutes les références nécessaires soient ajoutées. J'ai compacté et réparé la base de données plus d'une fois. J'ai fermé L'accès et rouvert le dossier de nombreuses fois entre divers fixer les tentatives. J'ai enlevé le présumé fautif forme, mais encore l'erreur. J'ai essayé d'autres étapes suggérées ici et sur d'autres forums, mais rien ne règle le problème.
  • je suis tombé sur cette correction quand j'ai fait une copie de sauvegarde pour tenter des mesures drastiques, comme supprimer un formulaire/module à la fois. Mais en ouvrant la copie de sauvegarde, le problème ne s'est pas reproduit.
1
répondu C Perkins 2017-05-04 00:25:45

pour le script.Type de dictionnaire, vous pouvez soit utiliser la liaison tardive (comme l'a déjà souligné ) avec:

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

ce qui fonctionne, mais vous ne recevez pas le code de complétion automatique. Ou vous utilisez la liaison précoce, mais vous devez vous assurer que VBA peut trouver le script.Type de dictionnaire par l'ajout d'une référence à la Bibliothèque Microsoft Scripting via VBA-->Outils-->Références--> "Microsoft Scripting Runtime". Vous pouvez alors utiliser:

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

... et l'achèvement automatique travail.

1
répondu RexBarker 2017-06-02 06:45:52

solution Possible, vous essayez de travailler avec Powerpoint via Excel VBA et vous n'avez pas activé la bibliothèque D'objet Powerpoint en premier.

pour ce faire, dans le menu du haut de l'éditeur VBA, sélectionnez Outils, Références, puis faites défiler vers le bas pour cliquer sur la bibliothèque appelée Microsoft Powerpoint xx.X Object Library. Office 2007 est la bibliothèque 12, chaque version de bureau a une bibliothèque différente. POUR INFO, j'ai connu quelques erreurs étranges et la corruption de fichiers quand j'active la bibliothèque 2007 mais quelqu'un essaie d'ouvrir et exécutez cette macro en utilisant Excel 2003. L'ancienne version d'Excel ne reconnaît pas la nouvelle bibliothèque, qui semble poser des problèmes.

1
répondu Nathalii. 2017-10-17 14:21:44

Liaison Tardive

cette erreur peut se produire en raison d'une référence manquante. Par exemple, lorsque l'on passe de la liaison précoce à la liaison tardive, en éliminant la référence, il peut subsister un certain code qui renvoie à des types de données spécifiques à la référence abandonnée.

Essayez d'inclure la référence pour voir si le problème disparaît.

peut-être que l'erreur n'est pas une erreur de compilateur mais une erreur de linker, donc la ligne spécifique est inconnue. Honte à Microsoft!

0
répondu jas0501 2014-01-28 14:57:00

après des années, j'ai découvert une, sinon la, réponse au bogue de Microsoft de l'erreur 'Type Défini par L'utilisateur non défini' dans Excel. Je lance Excel 2010 Pour Windows.

si vous avez un UDF nommé par exemple'xyz()', alors si vous invoquez une entité inexistante commençant par ce nom suivie d'une période suivie d'autres caractères -- par exemple, si vous essayez d'appeler inexistante nom de la gamme 'xyz.abc', l'application stupide lance ce mauvais msg., après quoi, il vous renvoie à votre feuille.

dans mon cas, c'était particulièrement troublant, parce que J'ai des UDFs nommés avec une seule lettre, par exemple x(), y(), etc. et j'ai aussi les noms de plage qui comprennent les périodes--'x.a','c.d', etc. Chaque fois que je, disons, mal orthographié un nom de gamme--par exemple, ' X. h', l'erreur ' User-defined ...' a été lancée simplement parce qu'un UDF nommé'x()' existait quelque part dans mon projet.

Il a fallu plusieurs heures. diagnostiquer. Les Suggestions ci-dessus pour supprimer progressivement le code de votre projet, ou inversement supprimer tout le code et l'ajouter progressivement de nouveau, étaient sur la bonne voie, mais ils n'ont pas suivi à travers. Il n'a rien à voir avec le code en soi; il a seulement à voir avec le nom de la première ligne de code dans chaque proc, à savoir le Sub MyProc ou Function MyProc ligne nommant le proc. C'est quand j'ai commenté un de mes UDFs d'une lettre dans une partie complètement différente du projet que le buggé erreur msg. parti, et de là, après un autre hr. ou alors, j'ai pu généraliser la règle comme indiqué.

peut-être que le bug se produit aussi avec signes de ponctuation autre que la période de ('.') mais il n'y a pas beaucoup de caractères non alpha autorisés dans un nom de gamme; soulignement ('_') est autorisé, mais l'utiliser de la manière décrite ne semble pas jeter le bug.

Jim Luedke

0
répondu Jim Luedke 2014-09-11 06:16:14

j'ai eu la même erreur hier: j'avais deux classes, cProgress et cProgressEx, dans mon projet, dont l'une n'était plus utilisée, et quand j'ai supprimé la classe cProgress, j'ai eu cette même erreur de compilation.

j'ai réussi à résoudre l'erreur suivante:

  • exporté tous les modules, formulaires et classes sur le disque dur
  • supprimé tout du projet
  • sauvé le projet
  • Réimportée tous les modules, formulaires et classes, suppression de la classe cProgress, et Compilation.
  • L'erreur a disparu.
0
répondu Stanislav Okhvat 2014-10-08 04:58:20

un problème différent avec le même symptôme: j'ai fait mettre en place une classe qui n'était pas définie. Il était enveloppé d'un #si je pensais que je n'aurais pas dû permettre au compilateur de le voir, mais ce n'est pas le cas. Retirez le commentaire de L'énoncé Implements et tout va bien. Je suppose que l'importation de la définition fonctionnerait aussi...

0
répondu Ed Hoeffner 2015-02-04 20:45:15

j'avais le même problème, si vous activez Microsoft Scripting Runtime, vous devriez être bon. Vous pouvez le faire sous outils > références > puis cochez la case Microsoft Scripting Runtime. Cela devrait résoudre votre problème.

0
répondu Vincent 2016-07-12 12:26:01

un peu en retard, et pas une solution complète non plus, mais pour tous ceux qui sont touchés par cette erreur sans raison évidente (avoir toutes les références définies, etc.) Ce fil qui m'a mis sur la bonne piste. Le problème semble provenir d'un bug lié à la mise en cache dans MS Office VBA Editor.

après avoir apporté quelques modifications à un projet comprenant environ 40 formulaires avec des modules de code plus 40 classes et quelques modules globaux dans MS Access 2016, la compilation a échoué.

Commenter le code n'était évidemment pas une option, pas plus que l'exportation et la réimportation de tous les fichiers 80+ ne semblaient raisonnables. En me concentrant sur ce qui avait récemment été changé, mes soupçons se sont concentrés sur la suppression d'un module de classe.

N'ayant pas de meilleures idées, j'ai ré-ceré un module de classe vide avec le même nom qui avait été précédemment supprimé. Et voliá l'erreur avait disparu! Il était même possible de supprimer à nouveau le module de classe non utilisé sans que l'erreur ne réapparaisse, jusqu'à ce que tous les changements ont été enregistrés dans un module de formulaire qui contenait auparavant une déclaration WithEvents impliquant la classe maintenant supprimée.

pas complètement sûr si WithEvents declaration est vraiment ce qui déclenche l'erreur même après que la déclaration a été retirée. Et aucun indice, comment fait découvrir (sans avoir d'informations sur l'histoire du développement), qui pourrait être le coupable...

Mais ce qui a finalement résolu le problème était:

  1. en VBE - Copier tout le code du module de code de formulaire
  2. Dans Access, ouvrez le Formulaire en mode création et A Un Module propriété Aucun
  3. Enregistrer le projet (ce qui supprime tout le code associé avec le Formulaire)
  4. (je ne sais Pas si besoin de fermer et ré-ouvrir l'Accès, mais je l'ai fait)
  5. Ouvrir le Formulaire en mode création et A Un Module propriété Oui
  6. en VBE repasser le code du module copié
  7. Save
0
répondu Kristian L 2017-05-02 22:49:18