Я использую VBA для автоматизации MailMerge для 3-х случаях: Пожалуйста, смотрите мой код, как показано ниже:VBA - Runtime Error 438
(1) Мне нужно генерировать сертификаты, основанные на каждом листе.
(2) Сертификат должен быть «в прошлый четверг» & «AAA»/«BBB»/«CCC» (на основе рабочего листа) соответственно. Например. 25062015AAA.docx (для листа 1), 25062015BBB.docx (для листа 2) и 25062015CCC.docx (для листа 3) соответственно.
Однако в настоящее время мой код либо сохраняет 1-й сгенерированный почтовый ящик под разными именами.
Или он выбрасывает 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)' do? Почему бы просто не просто «LDate = Format (Date,« DDMMYYYY »)' –
@SiddharthRout Здравствуйте, я использовал LastThurs как функцию, чтобы найти дату последнего четверга. Затем я вызываю его снова, внутри субформата, чтобы отформатировать его так, как я этого хочу. Если я укажу его как «LDate = Format (Date,« DDMMYYYY »), он просто покажет сегодняшнюю дату? Если есть лучший способ найти последнюю дату в четверг, пожалуйста, дайте мне знать :) Спасибо, и ура :) –