Я использую VBA для автоматизации mailmerge в трех случаях: пожалуйста, посмотрите мой код, как показано ниже:
(1) Мне нужно создать сертификаты на основе каждого рабочего листа.
(2) Название сертификата должно быть «Последний четверг» и «AAA» / «BBB» / «CCC» (на основе рабочего листа) соответственно. Например. 25062015AAA.docx (для листа1), 25062015BBB.docx (для листа2) и 25062015CCC.docx (для листа3) соответственно.
Однако в настоящее время мой код либо сохраняет 1-й сгенерированный mailmerge под разными именами.
Или он выдает Runtime Error: 438 - Object required error
, когда я кодирую его, как показано ниже. Может ли кто-нибудь любезно сказать мне, где я ошибаюсь?
Спасибо за помощь, как всегда!
Public Function LastThurs(pdat As Date) As Date
LastThurs = DateAdd("ww", -1, pdat - (Weekday(pdat, vbThursday) - 1))
End Function
Sub Generate_Certificate()
Dim wd As Object
Dim i As Integer
Dim wdoc As Object
Dim FName As String
Dim LDate As String
Dim strWbName As String
Const wdFormLetters = 0, wdOpenFormatAuto = 0
Const wdSendToNewDocument = 0, wdDefaultFirstRecord = 1, wdDefaultLastRecord = -16
LDate = Format(LastThurs(Date), "DDMMYYYY")
On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
Set wd = CreateObject("Word.Application")
End If
On Error GoTo 0
'Generate report using "Mailmerge" if any data available for Sheet1 to 3
For Each Sheet In ActiveWorkbook.Sheets
For i = 1 To 3
If Sheet.Name = "Sheet" & i And IsEmpty(ThisWorkbook.Sheets("Sheet" & i).Range("A2").Value) = False Then
Set wdoc = wd.documents.Open("C:\Temp" & i & ".docx")
strWbName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
wdoc.MailMerge.MainDocumentType = wdFormLetters
wdoc.MailMerge.OpenDataSource _
Name:=strWbName, _
AddToRecentFiles:=False, _
Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:="Data Source=" & strWbName & ";Mode=Read", _
SQLStatement:="SELECT * FROM `Sheet" & i & "$`"
With wdoc.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
wd.Visible = True
wdoc.Close SaveChanges:=False
Set wdoc = Nothing
'Saveas using Thursday Date & inside the folder (based on work sheet)
If i = 1 Then
wd.ThisDocument.SaveAs "C:\" & LDate & "AAA" & ".docx"
If i = 2 Then
wd.ThisDocument.SaveAs "C:\" & LDate & "BBB" & ".docx"
Else
wd.ThisDocument.SaveAs "C:\" & LDate & "CCC" & ".docx"
End If
End If
Next
Next
Set wd = Nothing
End Sub
LastThurs(Date)
? Почему бы просто неLDate = Format(Date, "DDMMYYYY")
- person Siddharth Rout   schedule 02.07.2015