MS Access调用SendEmailWithOutlook函数提示‘Sub或Function未定义’问题
解决MS Access中调用公共函数提示“Sub or Function not Defined”的问题
我来帮你排查这个调用失败的问题,出现这个错误通常是几个常见原因导致的,咱们一步步拆解解决:
1. 先确认模块类型与命名
首先要保证存放SendEmailWithOutlook的是标准模块,而不是类模块:
- 在Access里新建模块时,要选「模块」而非「类模块」,类模块的公共函数需要实例化对象才能调用,标准模块的公共函数可以直接调用。
- 另外,模块名称不能和函数同名!比如如果模块也叫
SendEmailWithOutlook,Access会把它当成类对象,导致无法直接调用函数。建议把模块改成类似modEmailTools的通用名称。
2. 修复变量作用域的致命问题
你的SendEmailWithOutlook函数里直接使用了Email和Country变量,但这两个变量是在调用它的Sub过程里定义的局部变量,函数根本访问不到!这不仅会导致调用失败,就算调用成功,邮件的收件人和附件路径也会完全错误。
解决办法:给函数添加参数传递
修改函数定义,把需要的变量传进去:
Public Function SendEmailWithOutlook(toEmail As String, targetCountry As String) Dim sentfrom As String Dim subjectemail As String sentfrom = "An EMAIL" ' 晚期绑定写法(无需引用Outlook库,兼容性更好) Dim olApp As Object Dim MItem As Object Set olApp = CreateObject("Outlook.Application") Set MItem = olApp.CreateItem(0) ' olMailItem的常量值为0 With MItem .To = toEmail ' 使用传入的收件人参数 .Subject = "WeeklyUserBreakDown" .Body = "Automated Email. Please Find your weekly user Breakdown Spreadsheet attached" .Attachments.Add ("L:\WeeklyUserActivity\WeeklyUserBreakDown" & targetCountry & ".xlsx") ' 使用传入的国家参数 .Send End With email_error: If Err.Number <> 0 Then MsgBox "An Error was encountered. " & vbCrLf & "The error message is: " & Err.Description End If Error_out: Set MItem = Nothing Set olApp = Nothing End Function
然后在调用的地方改成:
Call SendEmailWithOutlook(Email, Country)
3. 检查Outlook引用(可选)
如果坚持用早期绑定(代码里写Dim olApp As New Outlook.Application),需要确保Access已经引用了Outlook库:
- 打开VBA编辑器(Alt+F11)
- 点击菜单「工具」→「引用」
- 在列表里找到「Microsoft Outlook XX.X Object Library」(XX.X对应你的Office版本,比如16.0是Office 365/2016),勾选后确定。
如果想避免版本兼容问题,用上面代码里的晚期绑定写法就不需要额外引用。
4. 最后检查拼写与语法
确认调用时的函数名拼写完全一致(VBA不区分大小写,但拼写错误肯定会报错),你的Call SendEmailWithOutlook语法本身没问题,加上参数后就可以正常调用了。
内容的提问来源于stack exchange,提问作者P.Harrison
相关产品推荐
相关产品推荐

