Excel VBA Compiler lance un “type défini par l'Utilisateur non défini” erreur, mais ne goto ligne de code malveillant
Symptômes
C'est un problème spécifiquement lors de la compilation d'un Excel VBA projet. L'erreur suivante se produit:
User-defined type not defined
Cependant, le code qui génère cette erreur n'est pas mis en évidence par le compilateur et donc je ne peut pas identifier le problème.
Ce que je sais déjà et ont essayé de
C'est un "type défini par l'Utilisateur non défini" l'erreur que j'ai vu avant, avec des questions simples, telles que nommer quelque chose As Strig
au lieu de As String
. Cependant, cette erreur est seulement surgissent au cours de la Debug > Compile VBAProject
option de menu et lorsque le message d'erreur apparaît et il n'est pas en surbrillance la ligne de code que l'erreur est présente dans.
Après beaucoup de recherches, j'ai trouvé que ce bug peut être liée à l'absence de références et j'ai décrété ce que j'ai compris toutes les références nécessaires boîte à outils et les objets.
Pour s'assurer que je n'étais pas en manque un évident manque Dim
déclarations, j'ai ajouté Option Explicit
à toutes les pages de code (formulaires inclus) pour s'assurer que rien ne manquait. L'erreur s'affiche encore lors de l'exécution de la compilation.
Il y a aussi ce bug connu que les états de la question a été connu pour se produire en raison de la VB6 projets à l'aide de la compatibilité binaire:
Désactiver la Compatibilité Binaire et compiler le projet. Visual Basic
met en surbrillance la ligne de code qui contient le Type Défini par l'Utilisateur
qui n'est pas défini. Après la résolution du problème, la Compatibilité Binaire
peut-être tourné le dos.
J'ai trouvé cet article via ce La Question et la Réponse, cependant, je ne trouve pas cette option dans le standard d'Excel VBA éditeur.
Aider à sauver la mienne et celle des autres, la folie!
Je sais de recherches de Google et d'autres questions que je ne suis pas le seul qui a eu ce problème.
J'ai essayé d'aller dans le code manuellement mais il ya tout simplement trop beaucoup de lignes pour pouvoir le faire.
Est-il un moyen de désactiver la Compatibilité Binaire dans Excel VBA projets? Comment trouver cette ligne de code malveillant s'ils ne peuvent pas débogage pour ce qu'ils ont besoin de changer? Toute aide serait belle!
Vous en remercie d'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 la suppression de cette ligne - c'était un mispelt nom de contrôle sur un formulaire référencé dans son code. Ce n'est toujours pas résolu la question de la façon dont vous allez sur la recherche de ce code incriminé était la question. Sommes-nous en mesure de trouver un bon moyen de trouver le code fautif lorsque ce bug se produit tellement d'autres dans l'avenir pouvez éviter cette agonie?
Option Explicit
sur le dessus de chaque éditeur de code et ensuite essayer Debug > Compile VBAProject
de nouveau. De la ligne fautive?malheureusement non, j'ai
Option Explicit
sur chaque page de code (formulaires inclus) et résolu toutes les questions concrètes. Après l'achèvement de chaque Dim bla comme blah_Type j'ai toujours eu la même User-defined
erreur. (L'édition de ma Question pour montrer que j'ai fait.)Probablement la meilleure chose à faire est de commenter l'ensemble de votre code et de voir si ça compile. Ensuite, étape par étape, décommentez les sections de lui jusqu'à ce que vous tomber sur la ligne fautive. Un peu de travail dans un projet de grande envergure, mais au moins, ça va vous prendre pour le problème...
Aha! J'ai trouvé le code fautif - c'était un mal nommée le nom de contrôle dans l'une des formes cependant la comiler n'était pas toujours en mesure de trouver la ligne de code malveillant, même quand j'ai testé l'erreur - c'est quelque chose que nous devons trouver une solution viable...
vous pourriez avoir exporté vos modules sous forme de texte ou de le copier coller dans notepad++ et enregistrer en tant que TXT. Ensuite, à l'aide de VBA par exemple le processus de chaque module de TXT et de regarder pour
Dim <variableName>
. Retrouvez tous les Dim
lignes et ensuite l'imprimer sur feuille et passer à travers eux . Si ils ont la deuxième partie as <VariableType>
ensuite, vous pouvez parcourir tous ceux vérification de leur TYPES. Si le type existe ensuite passer à côté si ça ne marche pas, alors là vous allez!OriginalL'auteur Tom 'Blue' Piddock | 2013-10-30
Vous devez vous connecter pour publier un commentaire.
Ma solution n'est pas de bonnes nouvelles, mais au moins il devrait fonctionner.
Mon cas: j'ai un .xlsm par un collègue. 1) je l'ai ouvert et cliquez sur le bouton: il fonctionne très bien. 2) j'ai enregistrer le fichier, fermez excel, ouvrez de nouveau le fichier: maintenant il ne fonctionne plus. La conclusion est la suivante: le code est OK, mais excel ne peut pas gérer correctement des références. (J'ai essayé de l'enlever en le re-ajouter les références sans succès)
Donc la solution est de déclarer chaque objet référencé comme
Variant
et l'utilisationCreateObject("Foo.Bar")
au lieu deNew Foo.Bar
.Par exemple:
Remplacé par:
OriginalL'auteur jng
Puisqu'il semble que vous avez essayé beaucoup de différentes potentional solutions, vous aurez probablement à faire le long de la façon méthodique maintenant.
Créer un nouveau classeur vide. Ensuite, morceau par morceau copie de votre ancien classeur. 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 sub ou une fonction, encore une fois, écrire un test peu de sous pour l'exécuter, également de s'assurer qu'il compile. Répétez ce processus en ajoutant lentement et d'essai tout.
Vous pouvez accélérer les choses un peu en essayant d'abord de plus gros morceaux, puis quand vous vous en trouver un qui déclenche le problème, de le supprimer et de le briser 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. Cette dernière serait due à une sorte de caché de la corruption dans le fichier de classeur, probablement dans le binaire vbproject.
Bienvenue dans le monde de débogage sans débogueurs ou d'autres outils utiles pour faire le gros du travail pour vous!
OriginalL'auteur AndASM
J'ai eu exactement le même problème (qui semble toujours se produire lorsque j'essaie de mettre en œuvre une Interface sur un userform. Télécharger et installer Code de l'aspirateur de la ici. C'est un utilitaire freeware qui m'a sauvé à de nombreuses reprises. Avec votre projet VBA ouvrir, exécuter la
"Clean Code..."
option. Assurez-vous de cocher la case "projet de sauvegarde" et/ou "exporter tous les modules de code" à un endroit sûr avant de lancer le nettoyage. Aussi loin que je le comprends, cet utilitaire exportations et puis re-importations de tous les modules et les classes, ce qui élimine les erreurs de compilateur qui se sont glissées dans le code. A travaillé comme un charme pour moi! Bonne chance.OriginalL'auteur user3803315
Laisser vous le savez tous j'ai eu ce problème aussi. Plutôt que le code, la question laïque avec ce macro à un bouton d'appel. (Il avait été d'appeler la 'createroutes.createroutes' macro, mais j'avais renommé le "createroutes' module 'routes'.)
Par conséquent, le problème a été résolu en pointant le bouton à l'emplacement correct.
Ce n'est pas vraiment répondre à la question. Si vous avez une autre question, vous pouvez le demander en cliquant Poser une Question. Vous pouvez aussi ajouter une prime pour attirer plus d'attention à cette question une fois que vous avez assez de réputation. - Revue
Je crois que ce n'est répondre à la question - juste parce qu'il commence par "... j'ai eu ce problème aussi," ne signifie pas que la solution proposée n'est pas valide.
OriginalL'auteur Cameron Bradley
Eu une expérience similaire, mais c'était parce que j'avais renommé un enum dans une de mes classes. J'ai exporté et importé à nouveau les Classes qui avaient visé à l'ancienne enum et le message d'erreur a disparu. Cela suggère que c'est un problème de mise en cache dans l'environnement VBA.
OriginalL'auteur Rob Bishop
J'ai eu ce problème avec un simple programme VB6. Il s'est avéré que j'avais omis une définition de classe, pas un type défini par l'utilisateur. Apparemment VB vu quelque chose comme "Chose.nom de l'" et prend la Chose était un type défini par l'utilisateur. Oui, c'est un grave VB6 bug, mais on pouvait difficilement s'attendre à Microsoft à l'appui de quelque chose qu'ils ont vendu il y a seize ans. Alors, quelles sont les versions des différents produits utilisez-vous? Cela n'a d'intérêt que si elle se produit avec un produit MS prend en charge.
OriginalL'auteur user3818635
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 j'ai porté à partir d'Excel dans Access, dans une autre de l'UDF, j'étais variation "Que", mais les plages ne pas exister dans l'Accès. Vous avez peut-être l'aide d'un type de variable sans en avoir l'bibliothèque de référence en marche.
Si vous avez des non-standard s'assombrit de google et de voir si il vous manque la référence à la bibliothèque sous outils.
-E
OriginalL'auteur Schalton
Pour référence future -
J'ai eu ce problème avec ce bout de code dans Microsoft Access avec le débogueur en soulignant la ligne avec le commentaire:
J'ai dû sélectionner les références qui ont été précédemment désélectionné. Ils ont été
Microsoft Outlook 15.0 Bibliothèque D'Objets
Contrôle Affichage Outlook
OriginalL'auteur Mark
J'ai été en mesure de corriger l'erreur en
Un peu l'histoire de ce cas et d'observations:
OriginalL'auteur C Perkins
Pour le Script.Type de dictionnaire, vous pouvez soit utiliser la liaison tardive (comme l'a déjà souligné ) avec:
Qui fonctionne, mais vous n'obtenez pas le code de l'auto-complétion. Ou vous utilisez une liaison anticipée, mais vous devez vous assurer que VBA pouvez 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". Ensuite, vous pouvez utiliser:
... et l'auto-complétion fonctionne.
OriginalL'auteur RexBarker
Solution Possible, vous êtes en essayant de travailler avec Powerpoint via VBA Excel et vous n'activez pas Powerpoint Bibliothèque d'Objets de première.
Pour ce faire, dans l'éditeur VBA de menus supérieure, 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 de 12, chaque version a une autre bibliothèque. Pour info, j'ai connu quelques erreurs bizarres et de corruption de fichier, quand je activer le 2007 bibliothèque, mais quelqu'un essaie d'ouvrir et d'exécuter cette macro à l'aide d'Excel 2003. L'ancienne version d'Excel ne reconnaît pas la nouvelle bibliothèque, qui semble poser des problèmes.
OriginalL'auteur Nathalii.
La Liaison Tardive
Cette erreur peut se produire en raison d'un manque de référence. Par exemple lors de la modification de la liaison anticipée à la fin de la liaison, par la suppression de la mention, certains codes peuvent rester que les références des types de données spécifiques à la tombée de référence.
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 compilation, mais une erreur de l'éditeur de liens, de sorte que la ligne spécifique est inconnue. Honte à Microsoft!
OriginalL'auteur jas0501
Après des années, j'ai découvert une, si pas la, réponse à la Microsoft bug du "type défini par l'Utilisateur non défini" erreur dans Excel. Je suis sous Excel 2010 pour Windows.
Si vous avez un UDF nommé par exemple"
xyz()
', alors si vous appelez d'un inexistante entité début avec ce nom suivie par une période de suivi par d'autres caractères -- par exemple, si vous essayez d'appeler inexistante nom de la gamme 'xyz.abc
", le stupide application jette le mauvais msg., après quoi, il vous renvoie à votre feuille.Dans mon cas, c'était particulièrement énervant, parce que j'ai Udf nommé avec juste une lettre, par exemple
x()
,y()
, etc., et j'ai aussi des noms de plage qui comprennent les périodes--'x.a
', 'c.d
', etc. Chaque fois que j'ai, disons, mal orthographié un nom de plage (par exemple, 'x.h", le " défini par l'Utilisateur ...' erreur a été jeté tout simplement parce que l'UDF nommé "x()
' existait quelque part dans mon projet.Il a fallu plusieurs heures. à diagnostiquer. Les Suggestions ci-dessus à supprimer progressivement le code de votre projet, ou à l'inverse, la bande de l'ensemble du code et ne cessent de s'ajouter à nouveau, étaient sur la bonne voie, mais qu'ils ne suivent pas à travers. Il n'a rien à voir avec le code de soi; il n'y a qu'à voir avec le nom de la première ligne de code dans chaque proc, à savoir la
Sub MyProc
ouFunction MyProc
ligne de nommer le proc. Il était quand j'ai commenté un de mes 1-lettre-nommé Udf dans un complètement indépendant de la partie du projet que l'buggé msg d'erreur. il s'en alla, et à partir de là, après une autre heure. ou alors, j'ai été en mesure de généraliser la règle énoncée.Peut-être que le bug se produit également avec les caractères de ponctuation autres que la période de ('
.
') Mais il ne sont pas très nombreux non-alpha caractères autorisés dans un nom de plage; soulignement ( '_
" ) est autorisée, mais l'utiliser de la manière décrite ne semble pas jeter le bug.Jim Luedke
OriginalL'auteur Jim Luedke
J'ai eu la même erreur hier: j'ai eu deux classes, cProgress et cProgressEx, dans mon projet, un projet qui n'était plus utilisé, et quand j'ai enlevé cProgress de classe I a été donnée cette même erreur de compilation.
J'ai réussi à corriger l'erreur comme suit:
OriginalL'auteur Stanislav Okhvat
Un problème différent avec le même symptôme: j'ai eu une classe de mise en œuvre qui n'était pas défini. Il était enveloppé avec un #si que je pensais ne devrait pas avoir permis le compilateur pour le voir, mais pas tellement. Supprimer le commentaire de l'instruction Implements et tout est bien. Je suppose que l'importation de la définition serait également travailler...
OriginalL'auteur Ed Hoeffner
J'ai eu le même problème, si vous vous permettent de Microsoft Scripting Runtime vous devriez être bon. Vous pouvez le faire dans outils > références > et ensuite cocher la case pour Microsoft Scripting Runtime. Cela devrait résoudre votre problème.
OriginalL'auteur Vincent
Un peu en retard, et non pas une solution complète, soit, mais pour tout le monde qui est touché par cette erreur, sans raison évidente (le fait d'avoir toutes les références définies, etc.) Ce fil m'a mis sur la bonne piste. Le problème semble provenir de certains de la mise en cache liées bug dans MS Office, Éditeur VBA.
Après avoir fait quelques modifications au projet, dont environ 40 formes avec des modules de code, plus de 40 classes et quelques modules globaux dans MS Access 2016, la compilation a échoué.
Commenter le code n'est évidemment pas une option, ni fait de l'exportation et de réexportation, l'importation de tous les 80+ fichiers semblent raisonnables.
En se concentrant sur ce qui a été modifié récemment, mes soupçons porté sur la suppression d'un module de classe.
Ayant pas de meilleures idées, je re-cereated une classe vide module du même nom, qui avait déjà été enlevé. Et voliá l'erreur a disparu!
Il était même possible de supprimer le inutilisé module de classe à nouveau sans l'erreur réapparaît, jusqu'à ce que toutes les modifications ont été enregistrées à un module de formulaire qui, auparavant, avait contenu une déclaration WithEvents impliquant la désormais retiré de la classe.
Pas tout à fait sûr si WithEvents déclaration est vraiment ce qui déclenche l'erreur, même après la déclaration a été supprimé. 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:
OriginalL'auteur Kristian L