我正在使用Access 2016中的Access应用程序。该应用程序通过DoCmd.OutputTo方法输出到PDF文件。
我想将此PDF发送到我在代码中构建的电子邮件中,或者打开带有附件的新Outlook电子邮件。
当我单击表单中的按钮以触发包含我的子代码的代码(位于单独的模块中)时,将永远不会显示电子邮件窗口,也不会发送电子邮件(取决于{{ 1}}与.Display
)。我也没有收到任何错误。
我认为可能值得一提的是,对创建PDF的模块内的sub的调用可以按预期工作。
我正在运行Windows 7 64位计算机上作为Office 2016 Pro Plus一部分安装的Access 2016和Outlook 2016。 Office套件是32位的。
模块和子 (已删除电子邮件地址)
.Send
子通话
Dim objEmail As Outlook.MailItem
Dim objApp As Outlook.Application
Set objApp = CreateObject("Outlook.Application")
Set objEmail = oApp.CreateItem(olMailItem)
With objEmail
.Recipients.Add "email@domain.com"
.Subject = "Invoice"
.Body = "See Attached"
.Attachments.Add DestFile
.Display
End With
基于在模块文件的子文件中输出PDF的事实,我应该在创建PDF的子文件中创建电子邮件(或调用子文件)吗?
注意:我已经在this accepted answer上查看了Stack Overflow,以及其他很多内容。我的问题有所不同,原因是我在问为什么不显示或发送消息,而不是像其他消息一样如何构建和发送消息。
编辑: Outlook无法打开,如果Outlook已经打开,则什么也不会发生。
最终通知:
要添加到接受的答案中,在Access的VBA编辑器中,您可能必须转到MsgBox "Now saving the Invoice as a PDF"
strInvoiceNbr = Int(InvoiceNbr)
strWhere = "[InvoiceNbr]=" & Me!InvoiceNbr
strDocName = "Invoice Print One"
ScrFile = "Invoice Print One"
DestFile = "Inv" + strInvoiceNbr + " - " + Me.GetLastname + " - " + GetLocation
MsgBox DestFile, vbOKOnly
DoCmd.OpenForm strDocName, , , strWhere
Call ExportToPDF(SrcFile, DestFile, "INV")
Call EmailInvoice(DestFile)
并根据您的Office / Outlook版本启用Tools > References
或类似功能。
答案 0 :(得分:1)
您的问题可能与Outlook安全有关。通常,Outlook会显示一个弹出窗口,提示第三者应用程序正试图通过它发送电子邮件。您是否允许。但是,由于您以编程方式执行此操作,因此该弹出窗口永远不会出现。过去有一种绕过此方法的方法。
在用户登录并打开Outlook的同时测试您的程序。看看行为是否会有所不同。如果确实出现该弹出窗口,请在Google上搜索确切消息,您可能会找到一种绕过它的方法。
答案 1 :(得分:1)
要传递完整路径,请尝试使用Function EmailInvoice
示例
Option Explicit
#Const LateBind = True
Const olFolderInbox As Long = 6
Public Sub ExportToPDF( _
ByVal strSrcFileName As String, _
ByVal strNewFileName As String, _
ByVal strReportType As String _
)
Dim PathFile As String
Dim strEstFolder As String
strEstFolder = "c:\OneDrive\Estimates\"
Dim strInvFolder As String
strInvFolder = "c:\OneDrive\Invoices\"
' Export to Estimates or Invoices Folder based on passed parameter
If strReportType = "EST" Then
DoCmd.OutputTo acOutputForm, strSrcFileName, acFormatPDF, _
strEstFolder & strNewFileName & ".pdf", False, ""
PathFile = strEstFolder & strNewFileName & ".pdf"
ElseIf strReportType = "INV" Then
DoCmd.OutputTo acOutputForm, strSrcFileName, acFormatPDF, _
strInvFolder & strNewFileName & ".pdf", False, ""
PathFile = strEstFolder & strNewFileName & ".pdf"
End If
EmailInvoice PathFile ' call function
End Sub
Public Function EmailInvoice(FldrFilePath As String)
Dim objApp As Object
Set objApp = CreateObject("Outlook.Application")
Dim objNS As Object
Set objNS = olApp.GetNamespace("MAPI")
Dim olFolder As Object
Set olFolder = objNS.GetDefaultFolder(olFolderInbox)
'Open inbox to prevent errors with security prompts
olFolder.Display
Dim objEmail As Outlook.MailItem
Set objEmail = oApp.CreateItem(olMailItem)
With objEmail
.Recipients.Add "email@domain.com"
.Subject = "Invoice"
.Body = "See Attached"
.Attachments.Add FldrFilePath
.Display
End With
End Function
答案 2 :(得分:1)
为什么不使用sendOject?
sendobject的优点是,您不必受限于Outlook,并且任何电子邮件客户端都可以使用。
因此,可以使用以下代码:
Dim strTo As String
Dim strMessage As String
Dim strSubject As String
strTo = "abc@abc.com;def@def.com"
strSubject = "Your invoice"
strMessage = "Please find the invoice attached"
DoCmd.SendObject acSendReport, "rptInvoice", acFormatPDF, _
strTo, , , strSubject, strMessage
请注意,如果需要过滤报告,请在运行发送对象之前先将其打开。当然,您可以在之后关闭报告(仅在必须过滤时才需要,然后在之前打开报告-如果不提供过滤器,则上述代码就足够了,而不必先打开报告)。
不需要单独写出pdf文件,也不需要编写代码来附加生成的pdf。上面的内容一步一步完成,实际上是一行代码。