Excel宏设置页面页眉后保存关闭丢失的问题求助
Excel宏设置页面页眉后保存关闭丢失的问题求助
问题描述
我最近碰到一个特别头疼的问题:写了个宏想实现「打开指定工作簿(没开就打开)→ 修改页面页眉 → 保存关闭」的操作,结果前面步骤都正常,保存前检查页眉明明存在,但关闭再打开后页眉就凭空消失了!
手动操作修改页眉再保存完全没问题,但用宏执行就出状况,我已经试过这些办法都没用:
- 把文件从网络驱动器移到本地C盘测试(怀疑是网络同步问题)
- 先保存工作簿、重新打开后再修改页眉保存
- 另存为新文件名保存
代码里我用了变量存页眉内容(这里简化成固定值"Saturday"测试),以下是我的完整代码:
Option Explicit Sub Header_Test() Dim WB As Workbook Dim wPathName, wBookName, wExt, wFullPathName As String Dim LHeader As String wPathName = "C:\Temp\" wBookName = "Header Test" wExt = ".xlsx" wFullPathName = wPathName & wBookName & wExt LHeader = "Saturday" 'Open workbook (if not open) and make it active. For Each WB In Workbooks If WB.Name = wBookName Then 'If Header Test workbook is open then make it active. WB.Activate Else Workbooks.Open (wFullPathName) 'Workbook isn't open so open it. End If Next WB 'Add left header. Application.PrintCommunication = False With Sheets("Sheet1").PageSetup .LeftHeader = "&24 " & LHeader .HeaderMargin = Application.InchesToPoints(0.3) .Orientation = xlPortrait .PaperSize = xlPaperLetter .FitToPagesWide = 1 .FitToPagesTall = 1 .PrintErrors = xlPrintErrorsDisplayed End With 'Save and close Workbooks(wBookName).Close savechanges:=True End Sub
问题原因&解决方案
问题的核心在于你设置了Application.PrintCommunication = False但没有恢复为True!
这个属性的作用是暂停Excel和打印机驱动的通信,用来加快批量修改PageSetup的速度,但如果一直保持关闭状态,你对PageSetup的修改不会被真正提交到工作簿里,自然保存后就丢失了。
只需要在修改完PageSetup之后,加上一行代码恢复打印通信即可:
'Add left header. Application.PrintCommunication = False With Sheets("Sheet1").PageSetup .LeftHeader = "&24 " & LHeader .HeaderMargin = Application.InchesToPoints(0.3) .Orientation = xlPortrait .PaperSize = xlPaperLetter .FitToPagesWide = 1 .FitToPagesTall = 1 .PrintErrors = xlPrintErrorsDisplayed End With Application.PrintCommunication = True ' 关键:恢复打印通信
另外,你的代码里还有个小漏洞:遍历Workbooks的时候,如果第一个工作簿不是目标文件,会重复打开多次(比如当前打开了3个工作簿,就会执行3次Workbooks.Open),可以优化一下打开逻辑,避免重复打开:
'Open workbook (if not open) and make it active. Dim targetWB As Workbook On Error Resume Next Set targetWB = Workbooks(wBookName) On Error GoTo 0 If targetWB Is Nothing Then Set targetWB = Workbooks.Open(wFullPathName) End If targetWB.Activate
这样可以更高效地判断目标工作簿是否已打开,避免不必要的重复操作。
备注:内容来源于stack exchange,提问作者MikeB
相关产品推荐
相关产品推荐

