【问题标题】:Select Cells of one Page in a Print Area在打印区域中选择一页的单元格
【发布时间】:2014-05-04 11:56:19
【问题描述】:

我有一个工作簿,其中包含多个定义了打印区域的工作表。每个打印区域定义了 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

然后我必须编写更多代码来选择第二页和第三页(如果存在),从一个分页符到下一个或打印区域的末尾。

有没有更简单的方法可以只选择打印区域的一页?

我想做什么:

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

【问题讨论】:

    标签: vba excel page-break


    【解决方案1】:

    您需要使用您所意识到的Worksheet.VPageBreaks(垂直分页符)和Worksheet.HPageBreaks(水平分页符)集合属性。但是,我建议您使用类似于下面的方法,而不是假设打印区域始终为 1 页宽)。

    您可以分析它们以确定每个页面所涵盖的区域。

    下面的代码显示了一些使用它们并与之交互的方法。查看它们的方法和属性,尤其是 Location 属性。查看调试文本(确保您的即时窗口可见)以了解 .Locations 如何与您在页面上看到的分页符相对应。

    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
    

    请注意,总是通过查看 HPageBreaks(1) 和 VPageBreaks(1) 找到第一页。但是,根据工作表设置为打印后续页面的方式(向下然后向上与向上然后向下)会影响您应该如何找到第二页和以后的页面。您可以通过查看Worksheet.PageSetup.Order 属性(xlDownThenOverxlOverThenDown)来确定它的走向。

    【讨论】:

      【解决方案2】:

      这就是我最终想到的这个问题。这仅适用于水平分页符。它分为3个部分。首先是没有分页符,只有一页要打印。第二个是当有一个分页符和两页要打印时。然后第三部分是 2 个或更多分页符,这意味着有 3 个或更多页。如果您看到 *****Work on Selected Range,则表示 rng 包含打印区域的页面,这是您要在打印区域的页面上执行操作的位置。 p>

      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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这是这个问题的答案吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        相关资源
        最近更新 更多