Vba 在打印区域中选择一页的单元格

Vba 在打印区域中选择一页的单元格,vba,excel,page-break,Vba,Excel,Page Break,我有一个工作簿,其中包含多个已定义打印区域的工作表。每个打印区域定义了0个或多个分页符。如何选择打印区域中仅第1页的单元格或仅第2页的单元格。我已经编写了选择第1页的代码: Dim wksht As Worksheet Dim rng As Range Dim prntArea As Range Set wksht = ThisWorkbook.ActiveSheet Set prntArea = wksht.Range(wksht.PageSetup.printArea) 'Select Pa

我有一个工作簿,其中包含多个已定义打印区域的工作表。每个打印区域定义了0个或多个分页符。如何选择打印区域中仅第1页的单元格或仅第2页的单元格。我已经编写了选择第1页的代码:

Dim wksht As Worksheet
Dim rng As Range
Dim prntArea As Range
Set wksht = ThisWorkbook.ActiveSheet
Set prntArea = wksht.Range(wksht.PageSetup.printArea)
'Select Page 1 of print area
'First cell of print area
Set rng = prntArea.Cells(1, 1)
'extend to one row above page break
Set rng = wksht.Range(rng.Address, wksht.HPageBreaks(1).Location.Offset(-1).Address)
'extend to last column of Print Area
Set rng = wksht.Range(rng.Address, wksht.Cells(prntArea.Cells(1, 1).Row, prntArea.Cells(prntArea.Count).Column).Address)
rng.Copy
然后,我必须编写更多代码来选择第二页和第三页(如果存在),从一个分页符到下一页或打印区域的末尾

Dim wksht as Worksheet
For Each wksht In ThisWorkbook.Worksheets
    Dim prntArea As Range
    Set prntArea = wksht.Range(wksht.PageSetup.printArea)


    If wksht.HPageBreaks.Count = 0 Then 'No Page Breaks in Print Area
        Set rng = prntArea
        '*****Work on selected range
    End If


    If wksht.HPageBreaks.Count = 1 Then 'One Page Break = 2 Pages
        ' Page 1
        Set rng = prntArea.Cells(1, 1)
        Set rng = wksht.Range(rng.Address, wksht.HPageBreaks(1).Location.Offset(-1).Address)
        Set rng = Application.Intersect(rng.EntireRow, prntArea)
        '*****Work on Selected Range

        ' Page 2
        Set rng = wksht.Range(wksht.HPageBreaks(1).Location.Address, prntArea.Cells(prntArea.Rows.Count, 1))
        Set rng = Application.Intersect(rng.EntireRow, prntArea)
        '*****Work on selected Range
    End If


    If wksht.HPageBreaks.Count > 1 Then   '2 or more Page Breaks = 3 or more pages
        ' Page 1
        Set rng = prntArea.Cells(1, 1)
        Set rng = wksht.Range(rng.Address, wksht.HPageBreaks(1).Location.Offset(-1).Address)
        Set rng = wksht.Range(rng.Address, wksht.Cells(prntArea.Cells(1, 1).Row, prntArea.Cells(prntArea.Count).Column).Address)
        '*****Work on Selected Range

        ' Pages 2 through (pages - 1)
        Dim pgBreaks As Integer
        For pgBreaks = 1 To wksht.HPageBreaks.Count - 1
            Set rng = wksht.Range(wksht.HPageBreaks(pgBreaks).Location.Address, wksht.HPageBreaks(pgBreaks + 1).Location.Offset(-1).Address)
            If rng.Columns.Count < prntArea.Columns.Count Then
                Set rng = rng.Resize(rng.Rows.Count, prntArea.Columns.Count)
            End If
            '*****Work on Selected Range
        Next pgBreaks

        'Last Page
        Set rng = wksht.Range(wksht.HPageBreaks(wksht.HPageBreaks.Count).Location.Address, prntArea.Cells(prntArea.Rows.Count, 1))
        Set rng = Application.Intersect(rng.EntireRow, prntArea)
        '*****Work on Selected Range
    End If
Next wksht
是否有更简单的方法只选择打印区域的一页

我想做的是:

用户当前可以使用ExportToFixedFormat打印到PDF,这将使用打印区域。他们希望能够打印到PowerPoint和Word。因此,我正在创建一个新的PowerPoint演示文稿,并选择打印页面区域,然后复制并粘贴到新幻灯片中。除了试图找到一种更简单的方法来选择打印页面外,我的一切都正常工作。

您需要使用工作表.VPageBreaks垂直分页符和工作表.HPageBreaks horiz分页符集合属性。但是,我建议您使用类似于下面的方法,而不是假设打印区域总是1页宽

您可以对其进行分析,以确定每页所涵盖的区域

下面的代码显示了一些使用和交互它们的方法。请查看它们的方法和属性,特别是Location属性。查看调试文本,确保“立即”窗口可见,以查看.location如何与页面上可以看到的分页符相对应

Sub PageBreaksExample()
    Dim ws As Worksheet
    Dim hpb As HPageBreak
    Dim vpb As VPageBreak

    Set ws = ActiveSheet

    For Each hpb In ws.HPageBreaks
        Debug.Print "Horizontal pagebreak: " & hpb.Location.Address
    Next hpb

    For Each vpb In ws.VPageBreaks
        Debug.Print "Vertical pagebreak:" & vpb.Location.Address
    Next vpb

    'You can get the first page range like: (adjust for second page etc)
    Dim rng
    Set rng = ws.Range( _
        ws.HPageBreaks(1).Location.Offset(-1, 0), _
        ws.VPageBreaks(1).Location.Offset(0, -1))
    Debug.Print "Range of first page:" & rng.Address

End Sub

请注意,始终可以通过查看HPageBreaks1和VPageBreaks1找到第一页。但是,根据工作表设置为先下后上再下打印后续页面与先下后下打印后续页面的方式,会影响您查找第二页和后续页面的方式。您可以通过查看Worksheet.PageSetup.Order属性xlDownThenOver或xlOverThenDown来确定它的方向。

这就是我对这个问题的最终想法。这只适用于水平分页符。它分为三个部分。第一种情况是没有分页符,只打印一页。第二种情况是有一个分页符,需要打印两页。第三部分是2页或更多的分页符,这意味着有3页或更多页。当您看到******在选定范围内工作时,这意味着rng包含打印区域的页面,这是您希望在打印区域页面上执行操作的地方

Dim wksht as Worksheet
For Each wksht In ThisWorkbook.Worksheets
    Dim prntArea As Range
    Set prntArea = wksht.Range(wksht.PageSetup.printArea)


    If wksht.HPageBreaks.Count = 0 Then 'No Page Breaks in Print Area
        Set rng = prntArea
        '*****Work on selected range
    End If


    If wksht.HPageBreaks.Count = 1 Then 'One Page Break = 2 Pages
        ' Page 1
        Set rng = prntArea.Cells(1, 1)
        Set rng = wksht.Range(rng.Address, wksht.HPageBreaks(1).Location.Offset(-1).Address)
        Set rng = Application.Intersect(rng.EntireRow, prntArea)
        '*****Work on Selected Range

        ' Page 2
        Set rng = wksht.Range(wksht.HPageBreaks(1).Location.Address, prntArea.Cells(prntArea.Rows.Count, 1))
        Set rng = Application.Intersect(rng.EntireRow, prntArea)
        '*****Work on selected Range
    End If


    If wksht.HPageBreaks.Count > 1 Then   '2 or more Page Breaks = 3 or more pages
        ' Page 1
        Set rng = prntArea.Cells(1, 1)
        Set rng = wksht.Range(rng.Address, wksht.HPageBreaks(1).Location.Offset(-1).Address)
        Set rng = wksht.Range(rng.Address, wksht.Cells(prntArea.Cells(1, 1).Row, prntArea.Cells(prntArea.Count).Column).Address)
        '*****Work on Selected Range

        ' Pages 2 through (pages - 1)
        Dim pgBreaks As Integer
        For pgBreaks = 1 To wksht.HPageBreaks.Count - 1
            Set rng = wksht.Range(wksht.HPageBreaks(pgBreaks).Location.Address, wksht.HPageBreaks(pgBreaks + 1).Location.Offset(-1).Address)
            If rng.Columns.Count < prntArea.Columns.Count Then
                Set rng = rng.Resize(rng.Rows.Count, prntArea.Columns.Count)
            End If
            '*****Work on Selected Range
        Next pgBreaks

        'Last Page
        Set rng = wksht.Range(wksht.HPageBreaks(wksht.HPageBreaks.Count).Location.Address, prntArea.Cells(prntArea.Rows.Count, 1))
        Set rng = Application.Intersect(rng.EntireRow, prntArea)
        '*****Work on Selected Range
    End If
Next wksht

我需要一个基于分页符标题文本/页码的excel表格作为页面导航的链接

这是对这个问题的回答吗?