简体   繁体   中英

'Compile Error: User-defined type not defined' error shown after adding word object library through code

I am a newbie at VBA programming and this is my first post on a forum so I would like to apologise beforehand in case i make any mistakes.

I am automating an Excel workbook which opens and works with a new Word file from a template. I am using 'WithEvents' to track application events in Word. I am also using code to remove word object library references when closing the workbook and then adding them again at 'Workbook_Open' to make sure this workbook will work on other machines with different versions of word.

Everything works as expected except for a 'Compile Error: User-defined type not defined' error every time I open the workbook but consequent compilations work fine without a hitch. I know what is causing it - there is no reference to word object library during the first compile trial hence the compiler does not know what 'Word.Application' is but from the second instance onwards it does and hence produces no errors.

I just cannot ge my head around how to fix this. I have looked into LateBinding but from research I found out WithEvents is not compatible with LateBinding. Any help will be greatly appreciated.

Thank you in advance for your time.

'ThisWorkbook'
'------------'

Option Explicit

Private Sub Workbook_Open()

    ThisWorkbook.VBProject.References.AddFromGuid GUID:="{00020905-0000-0000-C000-000000000046}", Major:=0, Minor:=0
    ThisWorkbook.VBProject.References.AddFromGuid GUID:="{00062FFF-0000-0000-C000-000000000046}", Major:=0, Minor:=0

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    If IsEmpty(ThisWorkbook.VBProject.References.Item("Word")) = False Then
        ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References.Item("Word")
    End If

    If IsEmpty(ThisWorkbook.VBProject.References.Item("Outlook")) = False Then
        ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References.Item("Outlook")
    End If

    ActiveWorkbook.Save

    Set wdAppClass = Nothing
    Set wdAppClass.wdApp = Nothing
    'Set wdApp = Nothing
    Set wdDoc = Nothing
    Set button = Nothing

End Sub

-

'Module1'
'-------'

Option Explicit

Public wdAppClass As New wdAppClass
Public wdDoc As Word.Document
Public button As Object
Public row As Integer
Public column As Integer

Public Sub AutoOpen()

    Set wdAppClass.wdApp = Word.Application

End Sub

Sub Button_Click()

    Set wdAppClass.wdApp = Word.Application
    Set button = ActiveSheet.Buttons(Application.Caller)

    With button.TopLeftCell
        row = .row
        column = .column
    End With

    Set wdAppClass.wdApp = CreateObject("Word.Application")
    Set wdDoc = wdAppClass.wdApp.Documents.Add(ThisWorkbook.Path & "\Sales Call Report.dotm")

    With wdDoc

        .Fields(3).Code.Text = " Quote " & """" & ActiveSheet.Range("A" & row & "").Text & """" & " "
        .Fields(4).Code.Text = " Quote " & """" & ActiveSheet.Range("B" & row & "").Text & """" & " "
        .Fields(5).Code.Text = " Quote " & """" & ActiveSheet.Range("C" & row & "").Text & """" & " "
        .Fields(6).Code.Text = " Quote " & """" & ActiveSheet.Range("D" & row & "").Text & """" & " "
        .Fields(7).Code.Text = " Quote " & """" & ActiveSheet.Range("E" & row & "").Text & """" & " "
        .Fields(8).Code.Text = " Quote " & """" & ActiveSheet.Range("H" & row & "").Text & """" & " "
        .Fields(9).Code.Text = " Quote " & """" & ActiveSheet.Range("J" & row & "").Text & """" & " "

        .Shapes(1).TextFrame.TextRange.Text = ActiveSheet.Range("F" & row & "").Text
        .Shapes(2).TextFrame.TextRange.Text = ActiveSheet.Range("K" & row & "").Text
        '.Shapes(3).TextFrame.TextRange.Text = ActiveSheet.Range("M" & row & "").Text

    End With

    wdAppClass.wdApp.Selection.WholeStory
    wdAppClass.wdApp.Selection.Fields.Update
    wdAppClass.wdApp.Selection.Collapse

    wdAppClass.wdApp.Visible = True
    wdAppClass.wdApp.ActiveWindow.WindowState = wdWindowStateMaximize
    wdAppClass.wdApp.ActiveWindow.SetFocus
    wdAppClass.wdApp.Activate

End Sub

Sub Set_Reminder()

    Dim olApp As Outlook.Application
    Dim olAppt As Outlook.AppointmentItem

    If button Is Nothing Then
        Set button = ActiveSheet.Buttons(Application.Caller)
    End If

    With button.TopLeftCell
        row = .row
        column = .column
    End With

    On Error Resume Next

    Set olApp = GetObject("", "Outlook.Application")
    On Error GoTo 0
    If olApp Is Nothing Then
        On Error Resume Next
        Set olApp = CreateObject("Outlook.Application")
        On Error GoTo 0
        If olApp Is Nothing Then
            MsgBox "Outlook is not available!"
            Exit Sub
        End If
    End If

    Set olAppt = olApp.CreateItem(olAppointmentItem)

    With olAppt
        .Start = ThisWorkbook.ActiveSheet.Range("M" & row & "").Value & Chr(32) & Time()
        .Duration = 15
        .Subject = "Call " & ThisWorkbook.ActiveSheet.Range("D" & row & "").Value
        .Location = ThisWorkbook.ActiveSheet.Range("A" & row & "").Value & Chr(44) & Chr(32) & ThisWorkbook.ActiveSheet.Range("C" & row & "").Value
        .Save
        .Display
    End With

    Set olApp = Nothing
    Set olAppt = Nothing
    Set button = Nothing

End Sub

-

'wdAppClass'
'----------'

Option Explicit

Public WithEvents wdApp As Word.Application

Private Sub wdApp_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)

    Dim datecheck As Boolean

    ThisWorkbook.ActiveSheet.Range("F" & row & "").Value = wdDoc.Shapes(1).TextFrame.TextRange.Text
    ThisWorkbook.ActiveSheet.Range("K" & row & "").Value = wdDoc.Shapes(2).TextFrame.TextRange.Text

    datecheck = IsDate(wdDoc.Shapes(3).TextFrame.TextRange.Text)

    If datecheck = True Then
        ThisWorkbook.ActiveSheet.Range("M" & row & "").Value = wdDoc.Shapes(3).TextFrame.TextRange.Text
        Set_Reminder
    End If

    wdAppClass.wdApp.Quit
    wdApp.Quit
    wdDoc.Close

    Set wdAppClass = Nothing
    Set wdAppClass.wdApp = Nothing
    Set wdApp = Nothing
    Set wdDoc = Nothing
    Set button = Nothing

End Sub

It seems like Modules and Class Modules are compiled first when the Workbook is opened. Try using Public WithEvents wdApp As Word.Application within a Worksheet so it gets compiled after Workbook_Open.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM