确定打印页面中的列数

时间:2014-04-17 14:27:58

标签: excel vba excel-vba

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

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

  • 我无法使用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

2 个答案:

答案 0 :(得分:4)

我确信在分页符周围有一个工作表属性,所以我在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

答案 1 :(得分:1)

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