2008-09-30 6 views
2

У меня возникла проблема с некоторым кодом слияния, который, как предполагается, создает буквы в нашем приложении. Я знаю, что этот код немного груб в данный момент, но мы находимся на этапе «Получить что-то работающее», прежде чем мы его уберем.Автоматизация Word Mailmerge не работает должным образом

Теперь, как это должно работать, и как это работает, когда мы делаем это вручную, есть ли у нас файл (переменная fileOut + ".template"), который является шаблоном для письма. Мы открываем этот шаблон, объединяем его и сохраняем его как имя файла в переменной fileOut.

Однако то, что он делает, это сохранение копии файла шаблона в файле filoutame вместо вывода слияния.

Я искал, и я, кажется, стучу головой о кирпичную стену.

datafile - это файл данных, содержащий данные о слиянии.

Используя те же файлы, все работает, если вы делаете это вручную.

Public Function processFile(ByVal datafile As String, ByVal fileOut As String) As String 
    Dim ans As String = String.Empty 

    errorLog = "C:\Temp\Template_error.log" 

    If (File.Exists(datafile)) Then 

     Try 

      ' Create an instance of Word and make it invisible.' 

      wrdApp = CreateObject("Word.Application") 
      wrdApp.Visible = False 

      ' Add a new document.' 

      wrdDoc = wrdApp.Documents.Add(fileOut & ".template") 
      wrdDoc.Select() 

      Dim wrdSelection As Word.Selection 
      Dim wrdMailMerge As Word.MailMerge 


      wrdDoc.MailMerge.OpenDataSource(datafile) 

      wrdSelection = wrdApp.Selection() 
      wrdMailMerge = wrdDoc.MailMerge() 
      With wrdMailMerge 
       .Execute() 
      End With 

      wrdDoc.SaveAs(fileOut) 

      wrdApp.Quit(False) 

      ' Release References.' 
      wrdSelection = Nothing 
      wrdMailMerge = Nothing 
      wrdDoc = Nothing 
      wrdApp = Nothing 


      ans = "Merged OK" 

      Call writeToLogFile(errorLog, "This worked, written to " & fileOut) 

     Catch ex As Exception 
      ans = "error : exception thrown " & ex.ToString 
      Call writeToLogFile(errorLog, ans) 
     End Try 

    Else 
     ans = "error ; unable to open Date File : " & datafile 
     If (logErrors) Then 
      Call writeToLogFile(errorLog, "The specified source csv file does not exist. Unable " & _ 
       "to process it. Filename provided: " & datafile) 
     End If 
    End If 

    Return ans 

End Function 

ответ

4

Я нашел решение. Когда вы объединяете документ, он создает новый документ с результатами слияния. Ниже приведен фрагмент кода.

wrdDoc = wrdApp.Documents.Add(TemplateFileName) 
wrdDoc.Select() 
Dim wrdSelection As Word.Selection 
Dim wrdMailMerge As Word.MailMerge 


wrdDoc.MailMerge.OpenDataSource(DataFileName) 

wrdSelection = wrdApp.Selection() 
wrdMailMerge = wrdDoc.MailMerge() 
With wrdMailMerge 
    .Execute() 
End With 

' This is the wrong thing to do. It just re-saves the template file you opened. ' 
'wrdDoc.SaveAs(OutputFileName) ' 

' The resulting merged document is actually stored ' 
' in the MailMerge object, so you have to save that ' 
wrdMailMerge.Application.ActiveDocument.SaveAs(OutputFileName) 

wrdApp.Quit(False) 
0

Я думаю, что проблема эта линия:

wrdDoc.MailMerge.OpenDataSource(templateName) 

Так TemplateName что-то вроде 'C: \ My Template.doc', верно?

Похоже, что вы поставляете путь к файлу самого документа Word вместо источника данных (файл Excel или CSV, таблицу доступа и т. Д.), Связанный с документом «.template».

Попробуйте:

data = "C:\My Data.xls" 
wrdDoc.MailMerge.OpenDataSource(data) 
+0

Я немного уточнил код. Переменная была неверно названа, а templateName на самом деле является источником данных. Я сказал, что код был грубым :) – hulver 2008-10-01 06:56:02

0

Один из способов обмануть, чтобы записать макрос, а вручную делать все шаги, вы упоминаете. Как только вы закончите, настройте макрос более гибким.

Вот что я сделал в прошлый раз, когда я не мог понять это во время написания мои макросов :)

 Смежные вопросы

  • Нет связанных вопросов^_^