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