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.