所以昨天我烧了整整一天的时间,根据一个单元格的值,在一个不同的过程中跟踪和切换图像。有趣的是,这一切都是从我编写一小段VBA开始,在打印或保存之前自动更新页眉和页脚信息。
我目前在工作簿中有12个工作表。 Sheet1(HEADER和FOOTER)包含进入各种页眉/页脚位置的所有信息。
表2-7是作为一组打印并在页面上有页眉和页脚的页面。
表2-6是纵向字母页面,每张纸上有多页(由于布局,我不能在某些纸张上强行1页宽)。
第7页是横向信函页。
如果我在编写代码之前打印/另存为pdf并单独更改每个页面,一切都很好,所有分页打印都在各自的页面布局/设置中。
当我在beforeprint中实现VBA代码或在ThisWorkbook中实现之前保存时,事情进展不顺利。根据我尝试的VBA代码的变化,工作表7将采用纵向方向和缩放与其他工作表相同或者所有工作表都是横向的并且具有工作表7的缩放。
使用适当的页眉/页脚信息更新第2页至第7页,同时保留其原始分配的页面设置。这样,当我打印时,2-6页都是肖像,而纸张7在信纸上都是风景。
我录制了一个宏来获得基础结构。最初它将所有纸张放在一个区域并进行修改。我认为这些页面都是相同的,因为它们都是同时被选中的,所以不要一次选择所有页面,我想我会尝试一次修改一张。这导致只打印一个工作表,因此我必须添加重新选择所有工作表作为最后一行代码。这是我目前拥有的VBA代码:
Private Sub WorkbookBeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim ws As Worksheet
For Each ws In Worksheets
If ws.Name <> "HEADER AND FOOTER" And InStr(1, Left(ws.Name, 5), "Table", vbTextCompare) = 0 Then
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.CenterHeader = Sheets(1).Range("B1").Value & Chr(10) & "Load Evaluation"
.RightHeader = _
"Calculated by: " & Sheets(1).Range("B3").Value & " Date: " & Sheets(1).Range("B4").Value & Chr(10) & "Checked By: " & Sheets(1).Range("B5").Value & " Date: " & Sheets(1).Range("B6").Value
.LeftFooter = "Project Number: " & Sheets(1).Range("B2").Value
.CenterFooter = "Page &P/&N"
.RightFooter = "Print Date: " & Sheets(1).Range("B7").Value
End With
End If
Next ws
Sheets(Array("General", "Loads", "Capacity", "Analysis", "POSTING", "SUMMARY")).Select
Sheets("General").Activate
End Sub
我想也许我实施For Each的方式有问题,因为这不是我熟悉的形式。我原本想考虑使用For x = 2 to ws.count - UDF_worksheet_count_names_starting_with_tables
来遍历工作表。我想我先在这里办理登机手续,看看是否有更好的方法解决这个问题。
答案 0 :(得分:2)
首先感谢D.K.建议从activesheet.page设置更改为ws.pagesetup。然而,这并没有解决问题,但确实更有意义。然后我偶然发现了这个帖子:Excel headers/footers won't change via VBA unless blank。我想知道这行是什么
Application.PrintCommunication = False
实际上确实做到了。当我评论出最后一张纸的布局时,不再更新/更改以匹配其他页面,并且事情按预期工作。
这是最终代码的样子:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim ws As Worksheet
For Each ws In Worksheets
If ws.Name <> "HEADER AND FOOTER" And InStr(1, Left(ws.Name, 5), "Table", vbTextCompare) = 0 Then
With ws.PageSetup
.CenterHeader = Sheets(1).Range("B1").Value & Chr(10) & "Load Evaluation"
.RightHeader = _
"Calculated by: " & Sheets(1).Range("B3").Value & " Date: " & Sheets(1).Range("B4").Value & Chr(10) & "Checked By: " & Sheets(1).Range("B5").Value & " Date: " & Sheets(1).Range("B6").Value
.LeftFooter = "Project Number: " & Sheets(1).Range("B2").Value
.CenterFooter = "Page &P/&N"
.RightFooter = "Print Date: " & Sheets(1).Range("B7").Value
End With
End If
Next ws
End Sub