首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将每个命名范围PDF到单个页面- VBA

将每个命名范围PDF到单个页面- VBA
EN

Stack Overflow用户
提问于 2019-01-04 12:07:38
回答 2查看 666关注 0票数 1

我有一个excel模型,可以根据用户的输入动态更改范围的数量和名称。然后,在引用选项卡上填充所有命名区域,它们在相应单元格中的位置。我需要写一个宏,PDF的每个命名范围在单独的网页上,但作为一个单一的PDF文件。

我已经尝试了我能找到的所有论坛,这些论坛展示了PDF范围的各种方法,但都不能解决两个特定的问题:

1)命名范围的数量将动态变化。我不能在我的VBA代码中静态地命名它们。2)命名区域位于10个单独的工作表上。3)一些工作表上有多个命名区域。这并不总是一对一的,这意味着我需要它来PDF来自同一张工作表的多个命名范围,但结果必须仍然是每个PDF页面一个命名范围。

有没有人能帮我看看下面的列表,帮我完成为每个命名范围创建一个单独页面的PDF文件的目标?作为参考,我的命名范围表如下所示:

代码语言:javascript
复制
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文件中有自己的页面。

EN

回答 2

Stack Overflow用户

发布于 2019-01-04 19:15:53

与所有应归功于@Tim Williams idea的,我只是提供基本的骨架代码作为简单的例子,可以根据需要进行修改。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-01-05 01:31:04

如果您将所需的每张工作表上的打印区域设置为命名范围,则应该能够使用如下内容输出所有所需的范围:

Save multiple sheets to .pdf

对于在一张工作表上有多个区域的情况,如果您将打印区域设置为联合的总范围,则每个区域看起来都进入单独的页面,所以这不是一个大问题。

下面是一个充实的示例,说明如何做到这一点:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54032990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档