8

免责声明:自从我(很多)使用 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
4

4 回答 4

10

我找到了一个似乎适用于替换文本的解决方案。无论出于何种原因,在宏中,您需要包含页眉/页脚格式字符代码才能使其正常工作。

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

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

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

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

.CenterHeader = "&L some text"

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

于 2013-09-03T22:04:08.657 回答
6

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

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

于 2014-02-10T14:30:28.560 回答
2

我已经阅读 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 选举年份是否与选举表格相同,然后格式化选举页面。

于 2014-05-31T12:36:28.990 回答
1

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

于 2015-10-02T22:03:14.900 回答