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

Excel VBA set print area to last row with data

我有一个 Excel table 和一个 sheet "CR",其中填充了 A 到 K 列,第一行是 header 行.

第 1-1000 行已设置格式(边框)并且 A 列包含一个公式,用于在输入 F 列中的数据时对行自动编号。

Sheet "CR" 受到保护以防止用户在 A 列中输入数据(锁定)。

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

我的代码(在object'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 列中有数字的行。我做错了什么?

变化:

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

收件人:

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

.End(...) 的作用类似于 ctrl + 箭头键。如果单元格有一个公式(由于公式而看起来是空的,那么它仍然会停在那里......另一种方法是使用评估(如果你不想循环)像这样:

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

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

同时检查是否存在隐藏值(查找空的到期数字格式或具有您无法直接看到的字符。尝试转到 A 列中第 1000 行下方(select A 列中 A1000 之后的单元格) 并按 ctrl+up 以验证它停止的位置(以及原因)。

编辑:
(关于您的评论)

"" 仍然导致 .End(...) 命令的 "stop"。因此,要么使用我的公式,将公式转换为 vba,要么循环单元格以获取最后一个值。 Find 也是一个很好的工具(如果不是一遍又一遍地重复无数次的话)。

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