我使用的是 Excel 2007。我有一张估算表,我将用它来跟踪客户信息。有些低级信息客户不应该在他们的文档版本上看到。我希望实现以下结果:
打印时只会显示 A 列中第一个单元格“任务编号”中包含数据的行。我认为可行的方法是使用 VBA 脚本在打印时隐藏第一个单元格中没有数据的所有行,然后取消隐藏它们。
如果可能的话,中间部分应该是可扩展的,以承担额外的任务等,尽管最简单的方法可能是在中间部分有 100 个遵守隐藏规则的单元格。
答案1
以下是您需要的代码。如果您知道如何操作,隐藏和取消隐藏行很容易。我打印了一份打开了宏记录器的工作表,这样您就可以看到如何根据需要定制打印。我会设置一个快捷键来运行这个宏。
Option Explicit
Sub PrintNonBlankColA()
Dim RowCrnt As Integer
Dim RowLast As Integer
' Note: This operates on the active worksheet
Application.ScreenUpdating = False
RowLast = Cells.SpecialCells(xlCellTypeLastCell).Row
' Hide all rows with a used cell and column "A" empty
For RowCrnt = 1 To RowLast
If IsEmpty(Cells(RowCrnt, "A")) Then
Range(RowCrnt & ":" & RowCrnt).EntireRow.Hidden = True
End If
Next
' For the following statements, I switched on the macro recorder,
' printed a sheet with all the headers and footers I wanted,
' switched off the macro recorder and copied the code out of the
' saved macro.
' Consider: .CenterHeader = "Activities for Acme Inc"
' If you name the worksheets for the client, the following would
' give you a heading for the appropriate client:
' .CenterHeader = "Activities for " & ActiveSheet.Name
With ActiveSheet.PageSetup
.PrintTitleRows = ""
.PrintTitleColumns = ""
End With
ActiveSheet.PageSetup.PrintArea = ""
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = "Activities for Acme Inc"
.RightHeader = ""
.LeftFooter = "&D"
.CenterFooter = "Page &P of &N"
.RightFooter = "Copyright Nadir Co."
.LeftMargin = Application.InchesToPoints(0.75)
.RightMargin = Application.InchesToPoints(0.75)
.TopMargin = Application.InchesToPoints(1)
.BottomMargin = Application.InchesToPoints(1)
.HeaderMargin = Application.InchesToPoints(0.5)
.FooterMargin = Application.InchesToPoints(0.5)
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.CenterHorizontally = False
.CenterVertically = False
.Orientation = xlPortrait
.Draft = False
.PaperSize = xlPaperA4
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.BlackAndWhite = False
.Zoom = 100
.PrintErrors = xlPrintErrorsDisplayed
End With
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
' Unhide all rows
Cells.EntireRow.Hidden = False
End Sub
将以上代码加载到模块中
在 Excel 中:
- 选择
Tools
然后Macro
然后Visual Basic Editor
。或者,单击Alt+F11
。您可能会看到左下方的项目资源管理器,底部的即时窗口,大部分屏幕为灰色。 Insert
然后选择Module
。灰色部分将变为白色。- 将我的代码复制并粘贴到现在白色的部分。现在可以针对任何工作表运行该宏。
使用宏
- 切换到 Excel。
- 选择
Tools
然后Macro
然后Macros...
。或者,单击Alt+F8
。将显示一个小的宏窗口。您将只有一个宏,因此它将被选中并且按钮Run
将处于活动状态。
Alt+F8
您可以通过单击来运行宏Enter
,但您可能会发现以下方法更方便。
- 在宏窗口中选择
Options
。您将看到一个小的宏选项窗口。 - 在小框中输入一个字母(我总是使用 q)并单击
OK
。 - 关闭宏窗口。
您现在可以切换到适当客户的工作表并单击Ctrl+q
以运行宏。
根据您的要求调整宏
我的代码中间是我对如何设置一份报告的想法,该报告顶部显示“Acme Inc 的活动”,底部显示日期、页码和版权。
替换此代码如下:
- 从 Excel 中选择
Tools
。您Macro
将Record New macro
看到一个小的“录制宏”窗口。 - 确保“将宏存储在:”下的文本框显示“此工作簿”。
- 单击
OK
。窗口消失。您可能看到一个很小的窗口,上面有一个方形按钮,标有“停止录制”。如果此窗口可见,请暂时忽略它。 - 打印客户报告并附加您需要的标题、页脚、边距等。
- 如果可以看到小窗口,请单击它。如果看不到,请选择 ,
Tools
然后Macro
选择Stop Recording
。 - 切换到 Visual Basic 编辑器。将会有一个新的模块。在项目资源管理器窗口中单击它。
- 您将看到
Sub Macro1()
所有可以按照您喜欢的方式打印客户报告的语句End Sub
。 - 复制这些语句(不是 sub 和 end sub)并将它们粘贴到我的宏中等效语句的顶部。
如果您未在报告页眉和页脚中包含任何内容(例如客户名称),则您的宏将可供使用。我在代码中给出了一个示例,其中我使用工作表名称作为报告页眉。由于不知道您的确切要求,我无法更精确地说明,但我希望这能为您提供一个开始。
答案2
那么问题是什么?如果“打印时如何隐藏单元格/行”那么答案是使用事件Workbook_BeforePrint
来设置打印工作表,执行打印,然后恢复之前的视图。
答案3
您可以尝试选择要隐藏的单元格,转到格式,然后是保护,然后是隐藏。然后选择审阅选项卡,保护工作表。将密码保留为空白,然后打印。
当您想要恢复单元格时,只需按取消保护表即可。
比使用宏执行操作稍微繁琐一些,但同时也更简单。