Предварительно заполните форму, затем сохраните в PDF - PullRequest
0 голосов
/ 03 декабря 2018

Я относительно новичок в VBA и учусь по ходу дела - был бы очень признателен, если бы кто-то мог пролить свет на дилемму, на которой я застрял в течение нескольких недель.

У меня есть несколько файлов Excel, каждый из которых содержит 2 листа («Форма» и «Детали»).Ячейки на листе «Форма» заполняются на основе списка значений в «Сведениях» (например, имя, фамилия, дата и т. Д.) Для автоматического предварительного заполнения (через vlookup и т. Д.).

До сих пор у меня был макрос, назначенный файлу для распечатки каждой новой "Формы" на другой странице, как показано ниже.

Sub PrintForm()
  Dim i As Long
  Dim ws1 As Worksheet, ws2 As Worksheet

    Set ws1 = Sheets("Details")
    Set ws2 = Sheets("Form")

    '   2 assumes a header row - use 1 if there isn't one
    For i = 2 To ws1.Cells(Rows.Count, "A").End(xlUp).Row
        With ws2
            '   Populate the Forms sheet with employee names
            .Range("B2").Value = ws1.Cells(i, "A").Value
            .PrintOut

        End With
    Next i
End Sub

Этот код работал нормальнооднако до сих пор, вместо того, чтобы печатать около 100 «форм» листов в неделю, я пытался выяснить, как сохранить каждую из этих «форм» в PDF и сохранить ее в папке (по сути, распечатав каждую форму, нокак цифровая копия).

Я на полпути (я думаю).При выполнении кода ниже, он отлично работает на одном файле (печать около 7 форм).Но в другом файле с большим листом «Подробности» он возвращает либо сообщение «400» с красным крестиком, либо запускает только первые 20 значений (только иногда).Не уверен, что это значит или как я могу это исправить.

Sub PrintForm()
  Dim i As Long
  Dim ws1 As Worksheet, ws2 As Worksheet

    Set ws1 = Sheets("Details")
    Set ws2 = Sheets("Form")

    '   2 assumes a header row - use 1 if there isn't one
    For i = 2 To ws1.Cells(Rows.Count, "A").End(xlUp).Row
        With ws2
            '   Populate the Forms sheet with employee names
            .Range("B2").Value = ws1.Cells(i, "A").Value

            .ExportAsFixedFormat _
                Type:=x1TypePDF, _
                Filename:="C:\Archive\Forms\" & .Range("B2") & ".pdf", _
                Quality:=x1QualityStandard, IncludeDocProperties:=True, _
                IgnorePrintAreas:=False, OpenAfterPublish:=False
        End With
    Next i

End Sub

Буду признателен за любой вклад.Дайте мне знать, если я могу что-нибудь сделать, чтобы объяснить проблему дальше.

1 Ответ

0 голосов
/ 03 декабря 2018

Я решил проблему путем перекрестных ссылок на рабочий лист, который уже работает (файл, который печатает 7 форм в PDF).

Изменили код на , начиная с Sub PrintForms () [множественное число, а не единственное Sub PrintForm () в исходном коде].

Выполнен тестовый запускуспешно для 7 форм, напечатанных в PDF, в мою назначенную папку.

Будем надеяться, что это проблема, которая выдержит более 40 файлов!:)

ОБНОВЛЕНИЕ:

Фактически это не продлилось для 40+ файлов - ошибка была в возвращаемом значении для "B2", который включал ограниченные символы- поэтому файл не может быть сохранен автоматически.

Я исправил его согласно приведенному ниже коду, заменив каждый ограниченный символ пробелом.Это в настоящее время работает хорошо для 40+ файлов.

Sub PrintForms()
Dim i As Long
Dim ws1 As Worksheet, ws2 As Worksheet

    Set ws1 = Sheets("Details")
    Set ws2 = Sheets("Form")

    '   2 assumes a header row - use 1 if there isn't one
    For i = 2 To ws1.Cells(Rows.Count, "A").End(xlUp).Row
        With ws2
            '   Populate the Forms sheet with employee names
            .Range("B2").Value = ws1.Cells(i, "A").Value
            .ExportAsFixedFormat _
                Type:=xlTypePDF, _
                Filename:="C:\Folder1\Subfolder1\" & Replace(Replace(Replace(.Range("B2").Value, "?", ""), "/", ""), "*", "").Value & ".pdf", _
                Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                IgnorePrintAreas:=False, OpenAfterPublish:=False
        End With

End Sub
...