【问题标题】:Excel headers/footers won't change via VBA unless blankExcel 页眉/页脚不会通过 VBA 更改,除非为空白
【发布时间】:2015-10-03 06:03:14
【问题描述】:

免责声明:自从我(很多)使用 VBA 以来已经有几年了,所以这可能是由于我对与我通常处理的语言本质上完全不同的语言感到困惑而引起的问题。

所以;我有一个包含多张工作表(20+)的工作簿(Excel 2010),其中大多数是多页的。为了使打印所有内容时更容易,我想添加一些特定于工作表的标题,其中包括工作表名称、页数等。

我已经编写了一个小函数,它应该(理论上)通过迭代设置标题的所有工作表来为我做到这一点。但是,由于某种原因,它仅在标题为空时才有效;如果它已经有一个值,它会出于某种未知原因拒绝覆盖。

Dim sheetIndex, numsheets As Integer
sheetIndex = 1
numsheets = Sheets.Count

' Loop through each sheet, but don't set any of them to active
While sheetIndex <= numsheets
    Dim sheetname, role, labeltext As String
    sheetname = Sheets(sheetIndex).name
    role = GetRole(mode) 
    labeltext = "Some text - " & sheetname & " - " & role

    With Sheets(sheetIndex).PageSetup
        .LeftHeader = labeltext
        .CenterHeader = ""
        .RightHeader = "Page &[Page] / &[Pages]"
        .LeftFooter = "&[Date] - &[Time]"
        .CenterFooter = ""
        .RightFooter = "Page &P / &N"
    End With

    sheetIndex = sheetIndex + 1
Wend

【问题讨论】:

  • 非常奇怪的行为。我可以在 Excel 2010 中复制您的问题。即使我在手动更改标题时录制宏,然后运行该宏,它也无法正常工作。关于添加部分标题文本的看似随机的行为。
  • 是的,在将页码添加到页眉的其他部分时,我也遇到了一些问题;出于某种原因,Excel 删除了部分魔法词(例如用 &[Pa 替换了 &[Pages]),从而使整个标题变得无用。这只发生在标题由宏编辑时,例如。如果它改变了 LeftHeader 它也会弄乱 RightHeader
  • 我怀疑这与您的问题有关,但请确保您在 role 文本上查找并替换需要在标题文本中转义的字符(与想到哪些需要加倍为 &&) 如果有任何机会它们在那里(比如“包装和分发”作为一个角色..)
  • pnuts,Cor_Blimey:没有区别,GetRole 返回一个没有特殊字符的简单字符串。不过感谢您的建议。

标签: vba excel excel-2010


【解决方案1】:

我找到了一个似乎适用于替换文本的解决方案。无论出于何种原因,您都需要在宏中包含 header/footer format character codes 才能使其正常工作。

此代码用于将现有标题文本替换为新信息:

Sub test()
    Dim sht As Worksheet
    Set sht = Worksheets(1)
    sht.PageSetup.LeftHeader = "&L left text"
    sht.PageSetup.CenterHeader = "&C center Text"
    sht.PageSetup.RightHeader = "&R right text"
End Sub

如果没有文本前的&amp;L&amp;C&amp;R 代码,我无法让它工作。

我发现一些有趣的行为是,如果您使用以下代码:

.CenterHeader = "&L some text"

它实际上会将some text 放在LeftHeader 位置。这让我相信格式化代码非常重要。

【讨论】:

    【解决方案2】:

    在执行 PageSetup 之前的行 Application.PrintCommunication = False(由宏记录器添加)通过 VBA 搞砸了格式化。

    如果您的代码中有此行,请尝试将其删除。这解决了我通过 VBA 设置页眉和页脚的问题。

    【讨论】:

    • 谢谢!这是正确的答案,因为我也保留了那条记录线。一旦我删除了该行,宏就开始按预期工作。
    【解决方案3】:

    我已经阅读 StackOverflow 多年,这是我第一次真正能够发布解决方案......希望它对某人有所帮助!另外,您需要记住,我是注册会计师而不是程序员;-)

    我正在从 ActiveSheet 中读取一些值来填充标题。该申请是一项税务选择,将与纳税申报表一起发送,因此其顶部必须包含纳税人的姓名和社会安全号码。

    Sub PrintElection()
    ' Print preview the MTM Election
        If Range("Tax_Year").Value = Range("First_MTM_year").Value Then
            ActiveSheet.PageSetup.LeftHeader = Format(Worksheets("Election").Range("Taxpayer_Name").Value)
            ActiveSheet.PageSetup.RightHeader = Format(Worksheets("Election").Range("Taxpayer_SSN").Value)
    
            ActiveWindow.SelectedSheets.PrintPreview
    
        Else
    
            MsgBox "The 'Effective For Tax Year' date must EQUAL the 'First MTM year' date", vbOKOnly, "Check Years"
            Sheets("Roadmap").Select
            Range("First_MTM_year").Select
       End If
    
    End Sub
    

    它会检查 Mark-to-Market 选举年份是否与选举表格相同,然后格式化选举页面。

    【讨论】:

      【解决方案4】:

      我将工作表打印设置分成 2 个循环。第一个循环 Application.PrintCommunication = False 我运行非页眉/页脚设置。然后我设置 Application.PrintCommunication = True 并在第二个循环中运行页眉/页脚设置。似乎比 XL2003 运行得更快,并正确应用页眉/页脚。在 MS 修复此错误之前,这对我来说很好。

      【讨论】: