【问题标题】:Determine number of columns in printed page确定打印页面中的列数
【发布时间】:2014-04-19 03:55:39
【问题描述】:

在 Excel 2007 中,我有一个工作表,其中仅包含几个单元格中的数据(正好在一页宽/高之内)。举例来说,假设工作表仅包含单元格 A1 中的数据。如何使用 VBA 确定适合单个打印页面的列数?换句话说,我如何确定最右边的列,我可以在其中添加数据而不导致打印额外的工作表。几个额外的 cmets:

  • 我没有设置打印区域。如果我是,那我就用同样的 范围...但我不是。

  • 我不能使用UsedRange,因为使用的范围比 实际适合打印页面的宽度/高度。

  • 我不能使用ActiveWindow.VisibleRange,因为它不限于 单页宽度/高度。

我已经搜索和搜索,但找不到完成这个看似简单的任务的解决方案。我主要发现涉及UsedRangeVisibleRange 和打印区域的场景,但这些对我没有帮助。

编辑

这是我正在使用的函数的最终版本,对所选答案稍作调整。

Public Function GetLastColumnBeforeVPageBreak( _
        ByRef ws As Worksheet, _
        ByVal aVPageBreakNum As Long) As Long
    Dim isMod As Boolean

    isMod = False

    On Error GoTo ErrorHandler

    GetLastColumnBeforeVPageBreak = ws.VPageBreaks(aVPageBreakNum).Location.Column - 1

    ' If necessary, delete the last column with dummy data and reset UsedRange.
    If isMod Then
        ws.Cells(ws.Rows.Count, ws.Columns.Count).EntireColumn.Delete
        r = ws.UsedRange.Rows.Count
    End If

    Exit Function
ErrorHandler:
    If Err.Number = 9 Then
        ' Subscript out of range.
        ' Ensure there is more than one page by putting something in last cell.
        isMod = True
        ws.Cells(ws.Rows.Count, ws.Columns.Count).Value = 1
        Err.Clear
        Resume
    Else
        Err.Raise Err.Number
    End If
End Function

【问题讨论】:

  • 嗨@neizan,你有没有找到更好的方法来做到这一点?我现在有一个非常相似的问题。请在此处查看我的问题:stackoverflow.com/questions/23824898/… 我需要找到打印区域减去所有边距。我可以使用您的方法成功获得最后一列并自己计算出边界。它只是看起来不是一个体面的解决方案。如果您设法找到更好的方法来做到这一点,请您也告诉我。提前致谢!

标签: vba excel


【解决方案1】:

我确定分页符周围有一个工作表属性,所以我在 IDE 中按 F2 打开对象浏览器并在 pagebreak 上搜索。一点点 F1 显示有一个 Worksheets(1).VPageBreaks(1).Location 属性返回一个范围对象。范围的左侧与第一个垂直分页符对齐,因此:

LastColOnP1 = Worksheets(1).VPageBreaks(1).Location.Column - 1

将为您提供一个变量,其中包含将在第一张纸的第 1 页上打印的最后一列的编号。

或者在一个过程中:

Sub FindFirstVPageBreak()
Dim LastColOnP1 As Long

With ActiveSheet
    'Ensure there is more than one page by puting something in last column
    .Cells(1, .Columns.Count) = 1
    LastColOnP1 = .VPageBreaks(1).Location.Column - 1
    'Delete the last column to allow UsedRange to be reset
    .Cells(1, .Columns.Count).EntireColumn.Delete
End With
'Save to workbook to commit the reset UsedRange
If Not ActiveWorkbook.ReadOnly Then
    ActiveWorkbook.Save 'assumes workbook has been saved previously.
End If
End Sub

【讨论】:

  • 这看起来正是我所需要的,但我收到了 subscript out of range 错误。所以我检查了ws.VPageBreaks.Count = 0。我没有设置任何分页符,所以我想这就是问题所在。有什么办法吗?
  • 我无法让它为我工作,我一直在尝试走另一条(更长的)路线。如果有某种方法可以使用它,我宁愿这样做。我使用了您的确切代码并得到了上述错误。有什么建议吗?
  • 见我上面的编辑。初始测试在一张跨越 30 列的工作表上,所以它已经有 VPageBreaks。在空白纸上进一步测试确实产生了Subscript out of range 错误,因为没有任何错误。事实上,在一张空白纸上,您甚至无法进行打印预览,因为没有可打印的内容。请注意,如果您没有在代码中的其他位置引用 UsedRange,则可以省去 Save 步骤。
  • 这很好用。唯一的问题是它有点慢。我尝试了一些修改来加快速度,但效果有限。我已经在我的问题的编辑中发布了最终功能。这就是我将使用的。非常感谢!
【解决方案2】:

您可以使用 Columns(x).ColumnWidth 来计算(如果列包含数据)。有关更详细的解决方案,请参阅 http://EzineArticles.com/7305778

【讨论】:

  • 大致如下: Dim i As Integer For i = 1 To 20 Columns(i).ColumnWidth = 2 c = c + Columns(i).ColumnWidth Next i
  • 我查看了链接。我想我也许可以使用类似的东西来做一些事情。如果我可以让 Mark Fitzgerald 的方式为我工作,那么我会使用它,因为它更直接。如果没有,我会尝试您建议的方法。
  • 一行代码(在 Ezine 文章中)是 pgWid = Application.InchesToPoints(ActiveSheet.PageSetup.PaperSize)。但是,.PaperSize 给出了 PaperSize 枚举的整数值,而不是以英寸为单位的宽度尺寸。我实现了一个辅助函数来解决这个问题,但是我收到了一些页面大小无法识别的错误。做了一些快速测试后,Excel 帮助文件中的 PageSize Enumeration 值似乎不准确。此外,对于正确识别的纸张尺寸,我得到的最终列值不正确。请参阅上面的新代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 2012-08-06
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
相关资源
最近更新 更多