Vba 更新页眉会破坏我的页面方向和缩放

Vba 更新页眉会破坏我的页面方向和缩放,vba,excel,Vba,Excel,所以我昨天花了一整天的时间,在一个不同的过程中根据单元格值切换图像。有趣的是,这一切都是从我编写一点点VBA开始的,在打印或保存之前自动更新页眉和页脚信息 处境 我的工作簿中目前有12张工作表。 Sheet1(页眉和页脚)包含进入各个页眉/页脚位置的所有信息 第2-7页是作为一组打印的页面,上面有页眉和页脚 第2-6页为肖像信页,每张纸上有多页(由于布局原因,我无法强制某些纸宽1页) 第7页为横向字母页 如果我在编写代码和单独更改每个页面之前打印/另存为pdf,一切都很好,所有页面都在各自的页面

所以我昨天花了一整天的时间,在一个不同的过程中根据单元格值切换图像。有趣的是,这一切都是从我编写一点点VBA开始的,在打印或保存之前自动更新页眉和页脚信息

处境 我的工作簿中目前有12张工作表。 Sheet1(页眉和页脚)包含进入各个页眉/页脚位置的所有信息

第2-7页是作为一组打印的页面,上面有页眉和页脚

第2-6页为肖像信页,每张纸上有多页(由于布局原因,我无法强制某些纸宽1页)

第7页为横向字母页

如果我在编写代码和单独更改每个页面之前打印/另存为pdf,一切都很好,所有页面都在各自的页面布局/设置中打印

当我在beforeprint或beforesave中实现VBA代码时,事情进展得并不顺利。根据我尝试的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
Private-Sub-WorkbookBeforeSave(ByVal-SaveAsUI为布尔值,Cancel为布尔值)
将ws设置为工作表
对于工作表中的每个ws
如果ws.Name“HEADER AND FOOTER”和InStr(1,Left(ws.Name,5),“Table”,vbTextCompare)=0,则
Application.PrintCommunication=False
使用ActiveSheet.PageSetup
.CenterHeader=图纸(1).范围(“B1”).值和Chr(10)以及“荷载评估”
.RightHeader=_
“计算人:”&表(1).范围(“B3”).值和“日期:”&表(1).范围(“B4”).值和Chr(10)和“检查人:”&表(1).范围(“B5”).值和“日期:”&表(1).范围(“B6”).值
.LeftFooter=“项目编号:”&图纸(1).Range(“B2”).Value
.CenterFooter=“第&P/&N页”
.RightFooter=“打印日期:”&页(1).范围(“B7”).值
以
如果结束
下一个ws
表格(数组(“常规”、“负载”、“容量”、“分析”、“过账”、“摘要”)。选择
工作表(“一般”)。激活
端接头

我在想,我实现For Each的方式可能有问题,因为这不是我熟悉的表单。我最初考虑使用
For x=2 to ws.count-UDF\u工作表\u count\u names\u从\u表开始
在工作表中循环。我想我应该先在这里检查一下,看看是否有更好的方法来解决这个问题。

首先感谢D.K.建议将activesheet.page设置更改为ws.pagesetup。然而,这并没有解决问题,但确实更有意义。然后我偶然发现了这条线索:。我想知道电话线是什么

 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
Private子工作簿\u保存前(ByVal SaveAsUI为布尔值,Cancel为布尔值)
将ws设置为工作表
对于工作表中的每个ws
如果ws.Name“HEADER AND FOOTER”和InStr(1,Left(ws.Name,5),“Table”,vbTextCompare)=0,则
使用ws.PageSetup
.CenterHeader=图纸(1).范围(“B1”).值和Chr(10)以及“荷载评估”
.RightHeader=_
“计算人:”&表(1).范围(“B3”).值和“日期:”&表(1).范围(“B4”).值和Chr(10)和“检查人:”&表(1).范围(“B5”).值和“日期:”&表(1).范围(“B6”).值
.LeftFooter=“项目编号:”&图纸(1).Range(“B2”).Value
.CenterFooter=“第&P/&N页”
.RightFooter=“打印日期:”&页(1).范围(“B7”).值
以
如果结束
下一个ws
端接头

ws
是每个控制变量的
,但不在If块内使用。无论循环在何处,都可以对
ActiveSheet
执行操作。我认为你的问题是,只有一张表格得到更新,而不是太多。当您使用ActiveSheet.PageSetup将
更改为使用ws.PageSetup将
时会发生什么情况?我明白您的意思了…我将尝试一下。在下面的某一点上,我有ws.select…但当时我只得到一张要打印的工作表。但是,在最后构建选择之前,我可能已经删除了它。我会尽快返回结果。好的,我知道发生了什么…我删除了子例程名称中的u,因此它在保存时没有执行代码。现在,我又添加了这一点,尽管将
activesheet.pagesetup
更改为
ws.pagesetup
,但我的工作表(7)正在重新格式化为工作表2-5的纵向和比例。我怀疑所有页面的格式都相同。它只是2-5需要是相同的,所以我没有注意到他们的变化