Compile throws a “User-defined type not defined” error but does not go to the offending line of code

前端 未结 21 1266
再見小時候
再見小時候 2020-12-14 08:00

Symptoms

This is a symptom specifically when compiling an Excel VBA project. The following error occurs:

User-defined type not defin

相关标签:
21条回答
  • 2020-12-14 08:31

    For future reference -

    I had this issue with this piece of code in Microsoft Access with the debugger highlighting the line with the comment:

    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"
    

    I had to select references that were previously unselected. They were

    Microsoft Outlook 15.0 Object Library
    Microsoft Outlook View Control

    0 讨论(0)
  • 2020-12-14 08:34

    After years I have discovered one, if not the, answer to the Microsoft bug of the 'User-defined type not defined' error in Excel. I'm running Excel 2010 for Windows.

    If you have a UDF named for example 'xyz()', then if you invoke a non-existent entity beginning with that name followed by a period followed by other chars -- e.g., if you try to invoke non-existent range name 'xyz.abc', the stupid app throws that wrong msg., after which it returns you to your sheet.

    In my case it was especially unnerving, because I have UDFs named with just one letter, e.g. x(), y(), etc., and I also have range names that include periods--'x.a', 'c.d', etc. Every time I, say, misspelled a range name--for example, 'x.h', the 'User-defined …' error was thrown simply because a UDF named 'x()' existed somewhere in my project.

    It took several hrs. to diagnose. Suggestions above to incrementally remove code from your project, or conversely strip all code and incrementally add it back in, were on the right track but they didn't follow thru. It has nothing to do with code per se; it has only to do with the name of the first line of code in each proc, namely the Sub MyProc or Function MyProc line naming the proc. It was when I commented out one of my 1-letter-named UDFs in a completely unrelated part of the project that the bugged error msg. went away, and from there, after another hr. or so, I was able to generalize the rule as stated.

    Perhaps the bug also occurs with punctuation characters other than period ('.') But there aren't very many non-alpha chars permitted in a range name; underline ('_') is allowed, but using it in the manner described doesn't seem to throw the bug.

    Jim Luedke

    0 讨论(0)
  • 2020-12-14 08:36

    Had a similiar experience, but it was because I had renamed an enum in one of my classes. I exported and re-imported the Classes that had referred to the old enum and the error message disappeared. This suggests it is a caching issue in the VBA environment.

    0 讨论(0)
  • 2020-12-14 08:36

    I've seen this error too when the code stopped at the line:

    Dim myNode As MSXML2.IXMLDOMNode

    I found out that I had to add "Microsoft XML, v6.0" via Tools > Preferences.

    Then it worked for me.

    0 讨论(0)
  • 2020-12-14 08:37

    My solution is not good news but at least it should work.

    My case is: I have a .xlsm from a coworker. 1) I open it and click the button: it works fine. 2) I save the file, close excel, open the file again: now it doesn't work anymore. The conclusion is: the code is OK but excel can't manage references correctly. (I've tried removing the re-adding the references without any success)

    So the solution is to declare every referenced object as Variant and use CreateObject("Foo.Bar") instead of New Foo.Bar.

    For example:

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

    Replaced by:

    Dim objXML As Variant
    Set objXML = CreateObject("MSXML2.DOMDocument")
    
    0 讨论(0)
  • 2020-12-14 08:38

    A bit late, and not a complete solution either, but for everyone who gets hit by this error without any obvious reason (having all the references defined, etc.) This thread put me on the correct track though. The issue seems to originate from some caching related bug in MS Office VBA Editor.

    After making some changes to a project including about 40 forms with code modules plus 40 classes and some global modules in MS Access 2016 the compilation failed.

    Commenting out code was obviously not an option, nor did exporting and re-importing all the 80+ files seem reasonable. Concentrating on what had recently been changed, my suspicions focused on removal of one class module.

    Having no better ideas I re-cereated an empty class module with the same name that had previously been removed. And voliá the error was gone! It was even possible to remove the unused class module again without the error reappearing, until any changes were saved to a form module which previously had contained a WithEvents declaration involving the now removed class.

    Not completely sure if WithEvents declaration really is what triggers the error even after the declaration has been removed. And no clues how to actually find out (without having information about the development history) which Form might be the culprit...

    But what finally solved the issue was:

    1. In VBE - Copy all code from Form code module
    2. In Access open Form in Design view and set Has Module property to No
    3. Save the project (this removes any code associated with Form)
    4. (Not sure if need to close and re-open Access, but I did it)
    5. Open Form in Design view and set Has Module property back to Yes
    6. In VBE paste back the copied out module code
    7. Save
    0 讨论(0)
提交回复
热议问题