Excel 如何根据用户输入过滤邮件合并源数据?
四天前,我问了一个邮件合并问题,得到了一个很好的答案,但我有人抱怨我得到了一个弹出窗口来确认SQL连接。他们只需点击“是”,所以在海事组织,这不是一个关键问题。我的问题是,通过从宏中连接到Excel源文件来消除SQL连接确认弹出窗口有多难?我试着让它正常工作,只要我拉整个范围。问题是,我不想要所有的源记录,我只想要一个,一个最终用户通过在Inputbox中键入LoginID来选择。LoginID是电子表格中的一列,Excel 如何根据用户输入过滤邮件合并源数据?,excel,vba,ms-word,mailmerge,Excel,Vba,Ms Word,Mailmerge,四天前,我问了一个邮件合并问题,得到了一个很好的答案,但我有人抱怨我得到了一个弹出窗口来确认SQL连接。他们只需点击“是”,所以在海事组织,这不是一个关键问题。我的问题是,通过从宏中连接到Excel源文件来消除SQL连接确认弹出窗口有多难?我试着让它正常工作,只要我拉整个范围。问题是,我不想要所有的源记录,我只想要一个,一个最终用户通过在Inputbox中键入LoginID来选择。LoginID是电子表格中的一列,All\u Users$tab。我一提出: WHERE LoginID = &qu
All\u Users$
tab。我一提出:
WHERE LoginID = "" + myKey + """ + ",
在SQLStatement中,我得到错误:发生错误:外部表不是预期的格式
我在这个论坛上查阅了几十篇关于邮件合并的文章,并一点一点地构建了我的代码。我错过了关于过滤器的最后一部分
这是我的密码:
Sub MergetoNewDoc()
Dim wrdObj As Object, wrdDoc As Object
Dim strFile As String, myKey As String
Dim mySource As String: mySource = "C:\Users\jtorres\desktop\LetterMemoDB.xlsx"
Set wrdObj = CreateObject("Word.Application")
myKey = InputBox("Enter LoginID:")
With wrdObj
.Visible = False
.DisplayAlerts = False
Set wrdDoc = .Documents.Open("C:\Users\jtorres\desktop\NewLetterTemplate.docx", False, True, False, , , , , , , , False)
With wrdDoc
With .MailMerge
.MainDocumentType = wdFormLetters
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
.OpenDataSource Name:=mySource, ReadOnly:=True, AddToRecentFiles:=False, _
LinkToSource:=False, Connection:="Provider=Microsoft.ACE.OLEDB.14.0;User ID=Admin;" & _
"Data Source=mySource;Mode=Read;Extended Properties=""HDR=YES;IMEX=1"";", _
SQLStatement:="SELECT * FROM `All_Users$` WHERE LoginID = "" + myKey + """ + ","
.Execute
End With
.Close 0
End With
End With
Set wrdDoc = Nothing: Set wrdObj = Nothing
End Sub
试一试
SQLStatement:=“从[所有用户$]中选择*,其中LoginID=”&myKey&“
«我有人抱怨得到一个弹出窗口来确认SQL连接»更改:
.DisplayAlerts = False
到
此后,只有当用户使用Word而不是宏打开mailmerge主文档时,才会出现SQL提示
总的来说,代码可以简化为:
Sub MergetoNewDoc()
Dim wrdObj As Object, wrdDoc As Object
Dim mySource As String: mySource = "C:\Users\jtorres\desktop\LetterMemoDB.xlsx"
Set wrdObj = CreateObject("Word.Application")
With wrdObj
.Visible = True
.DisplayAlerts = 0 'wdAlertsNone
Set wrdDoc = .Documents.Open("C:\Users\jtorres\desktop\NewLetterTemplate.docx", False, True, False)
With wrdDoc
With .MailMerge
.MainDocumentType = 0 'wdFormLetters
.Destination = 0 'wdSendToNewDocument
.SuppressBlankLines = True
.OpenDataSource Name:=mySource, ReadOnly:=True, AddToRecentFiles:=False, _
LinkToSource:=False, Connection:="Provider=Microsoft.ACE.OLEDB.14.0;User ID=Admin;" & _
"Data Source=mySource;Mode=Read;Extended Properties=""HDR=YES;IMEX=1"";", _
SQLStatement:="SELECT * FROM `All_Users$` WHERE LoginID = """ & InputBox("Enter LoginID:") & """"
.Execute
End With
.Close 0
End With
End With
Set wrdDoc = Nothing: Set wrdObj = Nothing
End Sub
PS:我看不出使用“.Visible=False”有什么意义,因为您没有任何代码来保存或处理输出文档。另外,你不需要结束Word会话。最后的结果是后台运行的孤立Word会话。我在网上找到了有关错误的信息,并将源文件格式从.xlsx更改为.xls。我不再获取“错误已发生:外部表不是预期的格式”。现在,我将获得一个弹出窗口来选择源表…请尝试
SQLStatement:=“从[All_Users$]中选择*,其中LoginID=”&myKey&“”
@CDP1802,是的!成功了!我怎么才能给你信用呢?
Sub MergetoNewDoc()
Dim wrdObj As Object, wrdDoc As Object
Dim mySource As String: mySource = "C:\Users\jtorres\desktop\LetterMemoDB.xlsx"
Set wrdObj = CreateObject("Word.Application")
With wrdObj
.Visible = True
.DisplayAlerts = 0 'wdAlertsNone
Set wrdDoc = .Documents.Open("C:\Users\jtorres\desktop\NewLetterTemplate.docx", False, True, False)
With wrdDoc
With .MailMerge
.MainDocumentType = 0 'wdFormLetters
.Destination = 0 'wdSendToNewDocument
.SuppressBlankLines = True
.OpenDataSource Name:=mySource, ReadOnly:=True, AddToRecentFiles:=False, _
LinkToSource:=False, Connection:="Provider=Microsoft.ACE.OLEDB.14.0;User ID=Admin;" & _
"Data Source=mySource;Mode=Read;Extended Properties=""HDR=YES;IMEX=1"";", _
SQLStatement:="SELECT * FROM `All_Users$` WHERE LoginID = """ & InputBox("Enter LoginID:") & """"
.Execute
End With
.Close 0
End With
End With
Set wrdDoc = Nothing: Set wrdObj = Nothing
End Sub