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

我有一个Excel表格,其中列A到K被填满,第一行是标题行。

1-1000行被格式化(边界),A列包含一个公式,当列F中的数据被input时,自动对这些行进行编号。

工作表“CR”受到保护,以防止用户在列A(locking)中input数据。

使用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中具有数字的行。我在做什么错了?

更改:

 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行(在列A的A1000后面select一个单元格),然后按ctrl +向上以validation哪里它停止(以及为什么)。

编辑:
(关于你的评论)

""仍然导致“结束” .End(...)命令。 所以要么使用我的公式,将公式转换成vba或循环它获得最后一个值的单元格。 Find也是一个好工具(如果不是反复无数次的话)。

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