Excel VBA将打印区域设置为包含数据的最后一行

时间:2016-11-13 16:42:14

标签: excel vba printing area

我有一张带有表格“CR”的Excel表格,其中填充了A到K列,第一行是标题行。

行1-1000格式化(边框),列A包含一个公式,用于在输入F列中的数据时自动调整行数。

工作表“CR”受到保护,以防止用户输入A列(已锁定)中的数据。

使用Workbook_BeforePrint功能,我正在尝试将打印区域设置为A到K列以及包含数字的A列的最后一行。

我的代码(在对象'ThisWorkbook'中)如下:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim ws As Worksheet
Dim lastRow As Long

Set ws = ThisWorkbook.Sheets("CR")

' find the last row with data in column A
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

ws.PageSetup.PrintArea = ws.Range("A1:K" & lastRow).Address
End Sub

然而,当我点击文件 - >打印,显示列A到K到行1000的范围,而不是仅显示在列A中有数字的行。我做错了什么?

2 个答案:

答案 0 :(得分:0)

变化:

lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

要:

lastRow = [LOOKUP(2,1/(A1:A65536<>""),ROW(A1:A65536))]

答案 1 :(得分:0)

.End(...)的行为类似于ctrl + arrow-key。如果单元格有一个公式(由于公式看起来是空的,那么它仍然会停在那里......另一种方法是使用evaluate(如果你不想循环),如下所示:

lastRow = .Evaluate("MAX(IFERROR(MATCH(1E+100,A:A,1),0),IFERROR(MATCH(""zzz"",A:A,1),0))")

这将给出最后一行(在A列中有一个值)。

同时检查是否有隐藏值(看起来是空的到期数字格式或有直接看不到的字符。尝试在A列的第1000行下方(在A列的A1000之后选择一个单元格)然后点击ctrl + up验证它停止的位置(及其原因)。

修改
(关于你的评论)

""仍导致.End(...) - 命令的“停止”。所以要么使用我的公式,将公式转换为vba,要么循环它获得最后一个值的单元格。 Find也是一个很好的工具(如果不是无数次地反复进行)。

lastRow = .Cells.Find("*", .Range("B1"), xlValues, , xlByColumns, xlPrevious).Row