Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何根据用户输入过滤邮件合并源数据?_Excel_Vba_Ms Word_Mailmerge - Fatal编程技术网

Excel 如何根据用户输入过滤邮件合并源数据?

Excel 如何根据用户输入过滤邮件合并源数据?,excel,vba,ms-word,mailmerge,Excel,Vba,Ms Word,Mailmerge,四天前,我问了一个邮件合并问题,得到了一个很好的答案,但我有人抱怨我得到了一个弹出窗口来确认SQL连接。他们只需点击“是”,所以在海事组织,这不是一个关键问题。我的问题是,通过从宏中连接到Excel源文件来消除SQL连接确认弹出窗口有多难?我试着让它正常工作,只要我拉整个范围。问题是,我不想要所有的源记录,我只想要一个,一个最终用户通过在Inputbox中键入LoginID来选择。LoginID是电子表格中的一列,All\u Users$tab。我一提出: WHERE LoginID = &qu

四天前,我问了一个邮件合并问题,得到了一个很好的答案,但我有人抱怨我得到了一个弹出窗口来确认SQL连接。他们只需点击“是”,所以在海事组织,这不是一个关键问题。我的问题是,通过从宏中连接到Excel源文件来消除SQL连接确认弹出窗口有多难?我试着让它正常工作,只要我拉整个范围。问题是,我不想要所有的源记录,我只想要一个,一个最终用户通过在Inputbox中键入LoginID来选择。LoginID是电子表格中的一列,
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