VBA'用户定义types未定义'与Outlook编译错误
我有一个很大的Excel文件,用命令button发送电子邮件给工作中的经理,然后他们可以按下button,并将文件发送到他们下面的经理。
由于每个经理都有自己的MS Office
版本,所以我有一个小组负责检查他/她的计算机上有哪些版本,并在References
标记为V
当我保存文件时,我将其保存为Outlook Object Library
未标记为V
,而且我拥有其他人编译的代码。 代码运行通过3个子。 第一个子有一个msgbox
,当你回答的时候, 是的 ,它会把你发送到下一个子。
Public Sub before_send_mail() answer = MsgBox("Send Email?", vbYesNo + vbQuestion, "Empty Sheet") If answer = vbYes Then Call excel_ver Call sendMail Call remove_ref Else 'do nothing End If End Sub
然后,我有“参考select按办公室版本”,它检查计算机上安装了哪个版本,并自动在Outlook
对象的Tools---->References
中标记V
这部分似乎也运作良好。
Sub excel_ver() On Error Resume Next ver = Application.Version If ver = 16 Then tmp_name = "C:\Program Files\Microsoft Office\Office16\MSOUTL.OLB" Application.VBE.ActiveVBProject.References.AddFromFile tmp_name Exit Sub End If If ver = 15 Then tmp_name = "C:\Program Files\Microsoft Office\Office15\MSOUTL.OLB" Application.VBE.ActiveVBProject.References.AddFromFile tmp_name Exit Sub End If If ver = 14 Then tmp_name = "C:\Program Files\Microsoft Office\Office14\MSOUTL.OLB" Application.VBE.ActiveVBProject.References.AddFromFile tmp_name Exit Sub End If End Sub
然后我们来解决这个问题。 当我到达子sendMail
它给我一个错误在线Dim applOL As Outlook.Application
Public Sub sendMail() Call ini_set If mail_msg.Cells(200, 200) = 1 Then lr = main_dist.Cells(main_dist.Rows.Count, "A").End(xlUp).Row On Error Resume Next For i = 2 To lr Application.DisplayAlerts = False Dim applOL As Outlook.Application 'Here is the error ---- that line Dim miOL As Outlook.MailItem Dim recptOL As Outlook.Recipient mail_msg.Visible = True mailSub = mail_msg.Range("B1") mailBody = mail_msg.Range("B2") mail_msg.Visible = False Set applOL = New Outlook.Application Set miOL = applOL.CreateItem(olMailItem) Set recptOL = miOL.Recipients.Add(main_dist.Cells(i, 5)) recptOL.Type = olTo tempPath = ActiveWorkbook.Path & "\" & main_dist.Cells(i, 4) & ".xlsm" With miOL .Subject = mailSub .Body = mailBody .Attachments.Add tempPath .send End With Set applOL = Nothing Set miOL = Nothing Set recptOL = Nothing Application.DisplayAlerts = True Next i End If End Sub
应该运行不需要参考:
Public Sub sendMail() Dim applOL As Object, miOL As Object, recptOL As Object Dim i As Long ini_set If mail_msg.Cells(200, 200) = 1 Then Set applOL = CreateObject("Outlook.Application") For i = 2 To main_dist.Cells(main_dist.Rows.Count, "A").End(xlUp).Row Set miOL = applOL.CreateItem(0) 'olMailItem=0 Set recptOL = miOL.Recipients.Add(main_dist.Cells(i, 5)) recptOL.Type = 1 ' olTo=1 With miOL .Subject = mail_msg.Range("B1") .Body = mail_msg.Range("B2") .Attachments.Add ActiveWorkbook.Path & "\" & _ main_dist.Cells(i, 4) & ".xlsm" .send End With Next i Set applOL = Nothing End If End Sub
编辑:在上面的代码中,我删除了一些“一次性”的variables,但这只是我的偏好…
在预编译过程中, Outlook.Application
无效,因为它没有在Tools\References...
。 如果你想保持你的代码工作,你需要先运行ini_set
,甚至在编译sendMail
之前。 尝试添加新的子程序来调用两个序列:
Sub MainSub() call ini_set call sendMail End Sub
为了清楚sendMail
,请从您的sendMail
移除Call ini_set
,并且每次调用时都要从单独的子例程中进行调用。
重要! 有了这个解决scheme,你可以保持outlook appilcation constants
(如olMailItem
),这是不可能的,当你切换到Late binding solution
。