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
我有一个 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