PDF каждый именованный диапазон на отдельной странице - VBA - PullRequest
0 голосов
/ 04 января 2019

У меня есть модель Excel, которая динамически изменяет количество и имена диапазонов на основе ввода от пользователя.Все именованные диапазоны затем помещаются на справочную вкладку с указанием их местоположения в соответствующей ячейке.Мне нужно написать макрос, который PDF-файлы каждого из названных диапазонов на отдельных страницах, но в виде отдельного файла PDF.

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

1) Количество именованных диапазонов будет динамически изменяться,Я не могу статически назвать их в своем коде VBA.2) Названные диапазоны находятся на 10 отдельных листах.3) На некоторых листах есть несколько именованных диапазонов.Это не всегда один-к-одному, то есть он мне нужен для PDF нескольких именованных диапазонов на одном листе, но результат все равно должен быть один именованный диапазон на страницу PDF.

Может кто-нибудь помочь мне взятьперечислите ниже и выполните мою цель создания одного файла PDF с отдельной страницей для каждого именованного диапазона?Для справки моя таблица именованных диапазонов выглядит следующим образом:

Named Range, Location

Range1, =Sheet1!$K$2:$R$21
Range2, =Sheet2!$K$2:$R$21
Range3, =Sheet3!$K$2:$R$21
Range4, =Sheet4!$K$2:$R$21
Range5, =Sheet5!$K$2:$R$21
Range6, =Sheet6!$K$2:$R$21
Range7, =Sheet7!$K$2:$R$21
Range8, =Sheet8!$K$2:$R$21
Range9, =Sheet9!$K$2:$R$21
Range10, =Sheet10!$B$2:$I$21
Range10, =Sheet10!$K$2:$R$21 

Я пытался использовать несколько углов в этой проблеме.Я попытался переместить все именованные диапазоны на одну вкладку, но это очень сложно, потому что именованные диапазоны имеют различное форматирование, то есть это не так просто, как копирование и вставка.Я не решаюсь показать какой-либо код здесь, потому что 20 итераций, которые я пробовал, не приблизились к достижению моей цели.Любое структурное руководство о том, как это сделать, ОЧЕНЬ ОЧЕНЬ приветствуется.

Конечным результатом, на который я надеюсь, является макрос, который PDF-файлы всех именованных диапазонов из книги Excel, каждый из которых получает свою страницу в файле PDF.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

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

Сохранить несколько листов в формате .pdf

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

Вот конкретный пример того, как вы могли бы сделать это:

Sub PrintIt()

    Dim dict As Object, rngName As Range, wb As Workbook, nm As String
    Dim shtName As String, rng As Range, prevRange, k, first As Boolean
    Set dict = CreateObject("scripting.dictionary")

    Set wb = ThisWorkbook

    'Start by collecting all of the required ranges, organized by worksheet
    Set rngName = wb.Sheets("Reference").Range("A2") 'first range name
    Do While rngName <> ""
        nm = Trim(rngName.Value)
        Set rng = wb.Names(nm).RefersToRange   'get the range
        shtName = rng.Parent.Name              'sheet name for this range

        If Not dict.exists(shtName) Then   'new sheet?
            dict.Add shtName, rng          'create an entry for this sheet
        Else
            'add this range to the sheet's dictionary entry
            Set prevRange = dict(shtName)
            Set dict(shtName) = Application.Union(prevRange, rng)
        End If
        Set rngName = rngName.Offset(1, 0) 'next name
    Loop

    If dict.Count = 0 Then Exit Sub 'no names

    'set up the printing for each sheet
    first = True
    For Each k In dict.keys
        'set print area (can be multiple areas on one sheet)
        wb.Sheets(k).PageSetup.PrintArea = dict(k).Address
        'select for printing "first" controls whether sheet selection is cumulative
        wb.Sheets(k).Select first
        first = False '<< later sheets now get added to the already-selected sheet
    Next k

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:="C:\tempo.pdf", Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True

End Sub
0 голосов
/ 04 января 2019

С должным уважением к идее @Tim Williams , я просто предлагаю базовый код скелета в качестве простого примера для изменения в соответствии с требованием.

Sub test()
Dim Rng As Range
Dim Ws As Worksheet, Wb As Workbook
Dim Nm As Name
Set Wb = Application.Workbooks.Add

    For Each Nm In ThisWorkbook.Names
    Set Rng = Nm.RefersToRange
    Set Ws = Rng.Worksheet
    With Ws.PageSetup
        .PrintArea = Rng.Address
        ' may set other pagesetup properties according to requirement
    End With
    Ws.Copy After:=Wb.Sheets(Wb.Sheets.Count)
    Next Nm

Wb.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "C:\Users\user\Documents\Range to PDF.pdf", Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        True
Wb.Close False
Set Wb = Nothing
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...