Сохранить слияние Excel в PDF только в последней строке с данными

Я использовал код, который использует mailmerge из листа excel в мой шаблон слова, а затем продолжает сохранять все строки в моем листе excel в PDF (конечно, в шаблоне слова). - Код работает отлично.

Код взят с этого форума:

https://www.msofficeforums.com/mail-merge/21803-mailmerge-tips-tricks.html

Как выглядит мой лист Excel:

A1-E1 = заголовки
A2-E2 = данные
A3-E3 = данные
A4-E4 = данные
и так далее...

Как работает код в настоящее время:
Код сохраняет все строки данных из листа Excel в моем шаблоне Word (с почтовым слиянием), а затем в PDF-файлах.

Моя цель:
Я хочу изменить код, чтобы он сохранял только последнюю строку данных на листе Excel в мой шаблон Word (с почтовым слиянием), а затем в PDF.

Sub RunMerge()
' Sourced from: https://www.msofficeforums.com/mail-merge/21803-mailmerge-tips-tricks.html
' Note: this code requires a reference to the Word object model to be set, via Tools|References in the VBE.
Application.ScreenUpdating = False
Dim StrMMSrc As String, StrMMDoc As String, StrMMPath As String, StrName As String
Dim i As Long, j As Long
Const StrNoChr As String = """*./\:?|"
Dim wdApp As New Word.Application, wdDoc As Word.Document
wdApp.Visible = False
wdApp.DisplayAlerts = wdAlertsNone
StrMMSrc = ThisWorkbook.FullName
StrMMPath = ThisWorkbook.Path & "\"
StrMMDoc = StrMMPath & "MailMergeDocument.doc"
Set wdDoc = wdApp.Documents.Open(Filename:=StrMMDoc, AddToRecentFiles:=False, ReadOnly:=True, Visible:=False)
With wdDoc
  With .MailMerge
    .MainDocumentType = wdFormLetters
    .OpenDataSource Name:=StrMMSrc, ReadOnly:=True, AddToRecentFiles:=False, _
      LinkToSource:=False, Connection:="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;" & _
      "Data Source=StrMMSrc;Mode=Read;Extended Properties=""HDR=YES;IMEX=1"";", _
      SQLStatement:="SELECT * FROM `Sheet1$`"
    For i = 1 To .DataSource.RecordCount
      .Destination = wdSendToNewDocument
      .SuppressBlankLines = True
      With .DataSource
        .FirstRecord = i
        .LastRecord = i
        .ActiveRecord = i
        If Trim(.DataFields("Name")) = "" Then Exit For
        StrName = .DataFields("Name")
      End With
      .Execute Pause:=False
      For j = 1 To Len(StrNoChr)
        StrName = Replace(StrName, Mid(StrNoChr, j, 1), "_")
      Next
      StrName = Trim(StrName)
      With wdApp.ActiveDocument
        'Add the name to the footer
        '.Sections(1).Footers(wdHeaderFooterPrimary).Range.InsertBefore StrName
        '.SaveAs Filename:=StrMMPath & StrName & ".docx", FileFormat:=wdFormatXMLDocument, AddToRecentFiles:=False
        ' and/or:
        .SaveAs Filename:=StrMMPath & StrName & ".pdf", FileFormat:=wdFormatPDF, AddToRecentFiles:=False
        .Close SaveChanges:=False
      End With
    Next i
    .MainDocumentType = wdNotAMergeDocument
  End With
  .Close SaveChanges:=False
End With
wdApp.DisplayAlerts = wdAlertsAll
wdApp.Quit
Set wdDoc = Nothing: Set wdApp = Nothing
Application.ScreenUpdating = False
End Sub

Заранее спасибо.


person SlashxmE    schedule 01.03.2020    source источник


Ответы (1)


Заменять:

For i = 1 To .DataSource.RecordCount

с:

i = .DataSource.RecordCount

или, если есть используемые строки ниже, чем в других столбцах:

i = ActiveSheet.Range("A" & ActiveSheet.Rows.Count).End(xlUp).Row - 1

где «A» — любой столбец, не содержащий данных ниже последней записи, и удалите оба:

If Trim(.DataFields("Name")) = "" Then Exit For

а также:

Next i
person macropod    schedule 01.03.2020
comment
Спасибо за помощь, теперь он показывает мне ошибку: Exit For не внутри For...Next. когда я удаляю Exit For, он показывает следующую ошибку: End With без With. Что я должен делать? - person SlashxmE; 01.03.2020
comment
теперь он показывает мне новую ошибку: ошибка времени выполнения «4198» и выделяет следующую строку кода: - person SlashxmE; 01.03.2020
comment
Это говорит о том, что истинная последняя строка вашего рабочего листа пуста. Нажмите Ctrl-End и посмотрите, к какой строке вы перейдете. - person macropod; 01.03.2020
comment
моя последняя строка пуста, потому что в ней есть формула, есть ли способ игнорировать пустую строку, в которой нет фактических данных? когда я удалил все пустые строки, это сработало, но затем формулы больше не работают с новыми строками. - person SlashxmE; 01.03.2020
comment
ничего, у меня получилось, большое спасибо за помощь :D - person SlashxmE; 01.03.2020
comment
«моя последняя строка пуста, потому что в ней есть формула» Не меняйте параметры и не пропускайте детали. Смотрите обновленный ответ. - person macropod; 02.03.2020