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 e应该关闭模板而不保存它。您能一步一步地调试宏并查看它要求您保存文件的位置吗?这是在wordTemplate之间。关闭False和下一个idCounter。好的,我想就是它了;我刚刚把wordApp.Visible=True改成了wordApp.Visib_Excel_Vba - Fatal编程技术网

Excel e应该关闭模板而不保存它。您能一步一步地调试宏并查看它要求您保存文件的位置吗?这是在wordTemplate之间。关闭False和下一个idCounter。好的,我想就是它了;我刚刚把wordApp.Visible=True改成了wordApp.Visib

Excel e应该关闭模板而不保存它。您能一步一步地调试宏并查看它要求您保存文件的位置吗?这是在wordTemplate之间。关闭False和下一个idCounter。好的,我想就是它了;我刚刚把wordApp.Visible=True改成了wordApp.Visib,excel,vba,Excel,Vba,e应该关闭模板而不保存它。您能一步一步地调试宏并查看它要求您保存文件的位置吗?这是在wordTemplate之间。关闭False和下一个idCounter。好的,我想就是它了;我刚刚把wordApp.Visible=True改成了wordApp.Visible=False,现在它可以工作了!!哎呀!!非常感谢你!!! ' First you have to configure the settings in each template so the word template filters t


e应该关闭模板而不保存它。您能一步一步地调试宏并查看它要求您保存文件的位置吗?这是在wordTemplate之间。关闭False和下一个idCounter。好的,我想就是它了;我刚刚把wordApp.Visible=True改成了wordApp.Visible=False,现在它可以工作了!!哎呀!!非常感谢你!!!
' First you have to configure the settings in each template so the word template filters the data already
' Also add a reference in Excel / VBA IDE to: Microsoft Word [Version] Object Library
Public Sub RunMergeDifferentWordTemplates()

    ' Declare objects
    Dim wordApp As Word.Application
    Dim wordTemplate As Word.Document
    Dim wordMergedDoc As Word.MailMerge

    ' Declare other variables
    Dim sourceBookPath As String
    Dim sheetSourceName As String
    Dim excelColumnFilter As String
    Dim queryString As String
    Dim baseQueryString As String

    Dim wordTemplateDirectory As String
    Dim wordTemplateFileName As String
    Dim wordTemplateFullPath As String
    Dim wordOutputDirectory As String
    Dim wordOutputFileName As String
    Dim wordOutputFullPath As String

    Dim idListValues As Variant ' Array
    Dim idValue As Integer
    Dim idCounter As Integer
    Dim recordCounter As Integer
    Dim fileCounter As Integer

    ' >>>>> Customize this <<<<<<

    ' This would be better to hold it in an Excel structured table
    ' I'm not including 0 as it's not needed (these would correspon to the anz values).
    idListValues = Array(1, 2, 3, 4, 5, 6)

    ' Excel source settings:
    sourceBookPath = ThisWorkbook.FullName
    sheetSourceName = "Sheet1" ' The sheet where the data of the mail merge is located
    excelColumnFilter = "Anz" ' The column we use to filter the mail merge data
    baseQueryString = "SELECT * FROM `" & sheetSourceName & "$` where `" & excelColumnFilter & "` = [columFilterValue] order by `" & excelColumnFilter & "` ASC" ' Would be a better practice to use an Excel structured table: https://support.office.com/en-us/article/overview-of-excel-tables-7ab0bb7d-3a9e-4b56-a3c9-6c94334e492c

    ' Word settings:
    wordTemplateDirectory = ThisWorkbook.Path & "\" ' Include slash at the end
    wordTemplateFileName = "sb[columFilterValue].docx" ' Include in the string [columFilterValue] where you want it to be replaced (remember that you have one template for each number)
    wordOutputDirectory = ThisWorkbook.Path & "\" ' Include slash at the end
    wordOutputFileName = "MailMergeDifferent[columFilterValue]_[Record]" ' Leave the [columFilterValue] and [Record] tags inside the path to identify each document. We'll replace it ahead, dynamically

    ' Initialize word object
    Set wordApp = New Word.Application
    wordApp.Visible = True
    wordApp.DisplayAlerts = wdAlertsNone

    ' Loop through each idValue in idListValues
    For idCounter = 0 To UBound(idListValues)

        ' Process each word template
        idValue = idListValues(idCounter)
        queryString = Replace(baseQueryString, "[columFilterValue]", idValue)
        wordTemplateFullPath = wordTemplateDirectory & Replace(wordTemplateFileName, "[columFilterValue]", idValue)

        Set wordTemplate = wordApp.Documents.Open(wordTemplateFullPath)

        Set wordMergedDoc = wordTemplate.MailMerge

        ' Process the template's mail merge
        With wordMergedDoc

            .MainDocumentType = wdFormLetters

            .OpenDataSource _
                Name:=sourceBookPath, _
                ReadOnly:=True, _
                Format:=wdOpenFormatAuto, _
                Revert:=False, _
                AddToRecentFiles:=False, _
                LinkToSource:=False, _
                Connection:="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;" & _
                    "Data Source=" & sourceBookPath & ";Mode=Read;Extended Properties=""HDR=YES;IMEX=1"";", _
                SQLStatement:=queryString

            .Destination = wdSendToNewDocument

            .SuppressBlankLines = True

            ' Each anz have matching records inside the excel worksheet (generate a word file for each one)
            For recordCounter = 1 To .DataSource.RecordCount

                ' Select each record
                With .DataSource

                    .FirstRecord = wordMergedDoc.DataSource.ActiveRecord
                    .LastRecord = wordMergedDoc.DataSource.ActiveRecord

                End With
                .Execute Pause:=False

                ' Add the columnFilterValue and the record identifier to the word file name
                ' Replace the columnFilterValue and the Record tags
                wordOutputFullPath = wordOutputDirectory & Replace(Replace(wordOutputFileName, "[columFilterValue]", idValue), "[Record]", recordCounter)

                ' Save and close the resulting document
                wordApp.ActiveDocument.SaveAs2 Filename:=wordOutputFullPath, FileFormat:=wdFormatXMLDocument, AddToRecentFiles:=False
                wordApp.ActiveDocument.SaveAs2 Filename:=wordOutputFullPath, FileFormat:=wdFormatPDF, AddToRecentFiles:=False
                wordApp.ActiveDocument.Close SaveChanges:=False

                .DataSource.ActiveRecord = wdNextRecord

                ' Count files generated
                fileCounter = fileCounter + 1


            Next recordCounter

        End With


        ' Close word template without saving
        wordTemplate.Close False

    Next idCounter

    ' Clean up word objects
    wordApp.Visible = False
    Set wordApp = Nothing

    ' Alert process finished
    MsgBox fileCounter & " files generated"

End Sub