我有一个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文件中有自己的页面。
发布于 2019-01-04 19:15:53
与所有应归功于@Tim Williams idea的,我只是提供基本的骨架代码作为简单的例子,可以根据需要进行修改。
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发布于 2019-01-05 01:31:04
如果您将所需的每张工作表上的打印区域设置为命名范围,则应该能够使用如下内容输出所有所需的范围:
对于在一张工作表上有多个区域的情况,如果您将打印区域设置为联合的总范围,则每个区域看起来都进入单独的页面,所以这不是一个大问题。
下面是一个充实的示例,说明如何做到这一点:
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 Subhttps://stackoverflow.com/questions/54032990
复制相似问题