在保存事件时创建 header 和页脚。检查 header 或页脚是否存在

Create header and footer on save event. Check if header or footer exists

我创建了一个 macro-template (workbook.xltm) 并将其移动到 C:\Users\USER\AppData\Roaming\Microsoft\Excel\XLSTART。所以这个文件作为默认工作簿打开。 该工作簿包含一个小脚本,当用户单击保存按钮时会执行该脚本。该脚本将 header 和页脚添加到所有 sheet 中。

我的问题是工作流程,因为当打开新文件时,用户往往会通过更改公司名称等方式来更改 header。不幸的是,此时文件尚未保存,因此点击保存按钮,header 将被脚本中的默认公司名称覆盖。

  1. 最好有一个条件来检查 header 和页脚是否已经存在。那将是用户第一次保存文件的时间点。这将避免 header 被脚本的默认 header 文本覆盖的情况。
  2. 除此之外,如果第一个 sheet(左起)的 header 和页脚用于(复制到)所有新创建的 sheet s(如果用户创建它们)。现在,如果用户创建一个新的 sheet 并点击保存按钮,新 sheet 中的 header/footer 看起来像脚本中的默认 header/footer。

脚本:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ActiveSheet.PageSetup.LeftHeader = "Company: Company Ltd." & Chr(10) & "Cutoff date: 31.12.20XX"
    ActiveSheet.PageSetup.LeftFooter = "Filename: &F" & Chr(10) & "Sheet: &A"
    ActiveSheet.PageSetup.CenterFooter = "Page &P of &N"
    ActiveSheet.PageSetup.TopMargin = Application.CentimetersToPoints(3.91)
    ActiveSheet.PageSetup.HeaderMargin = Application.CentimetersToPoints(1.91)
End Sub

我会将默认模板的左侧、中间和右侧 header 留空,并在保存时检查它。然后我会保存这些值并将它们复制到所有其他工作表。如果您有很多工作表,则值得暂时关闭打印通信。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim ShActive as Worksheet, sh As Worksheet
    Dim sLH as String, sCH as String, sRH As String

    Application.Printcommunication = False
    Set shActive = ActiveSheet
    With Activesheet.PageSetup
         sLH = .LeftHeader
         sCH = .CenterHeader
         ...
         If lenb(sLH) = 0 And lenb(sCH) = 0 And lenb(sRH) = 0 Then ' all empty = set defaults
              sLH = "Company: Company Ltd." & Chr(10) & "Cutoff date: 31.12.20XX"
              ....
         End If
    End With

    For Each sh in ActiveWorkBook.Sheets
        With sh.PageSetup
            .LeftHeader = sLH
            ...
        End With
    Next
    shActive.Activate ' just for sure
    Application.Printcommunication = True

感谢您的投入和支持。我设法创建了一个 template-file 和一个名为 "Template" 的 sheet,它几乎已经包含了用户创建的所有 sheet 所需的几乎所有信息。我现在需要 re-add Workbook_BeforeSave 事件,因为我当前的脚本无法处理用户将 sheet 从另一个工作簿复制到此 sheet 的事件。所以复制的 sheet 缺少页眉和页脚。

为所有新创建的 sheet 添加页眉和页脚的当前脚本:
它将sheet "Template"的信息复制到新创建的sheet中。所以 "Template" sheet 是一个要求。

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    Application.ScreenUpdating = False
    With Sheets("Template").PageSetup
        strHeadLeft = .LeftHeader
        strHeadCenter = .CenterHeader
        strHeadRight = .RightHeader
        'strFootLeft = .LeftFooter
        'strFootCenter = .CenterFooter
        'strFootRight = .RightFooter
        bGotHeaders = True
    End With
    If bGotHeaders Then
        With ActiveSheet.PageSetup
            .LeftHeader = strHeadLeft
            .CenterHeader = strHeadCenter

            If IsEmpty(strHeadRight) Then
                strHeadRight = _
                 "&10Ref: &B&10&KFF0000 XXX-XXX" & _
                  Chr(10) & _
                  "&B&K000000File date created: " & _
                  Format(Date, "dd.mm.yyyy") & " " & Time & Chr(10) & _
                  "User: &B" & Application.UserName
            Else
                strHeadRight = strHeadRight & _
                 Chr(10) & _
                 "&B&K000000File date created: " & _
                 Format(Date, "dd.mm.yyyy") & " " & Time & Chr(10) & _
                 "User: &B" & Application.UserName
            End If

            .RightHeader = strHeadRight
            .LeftFooter = "&10Filename: &F" & Chr(10) & "Sheet: &A"
            '.CenterFooter = strFootCenter
            .RightFooter = _
              "&10Page &P of &N"
        End With
    Else
        MsgBox "Sheet Template does not exist." & vbCrLf & _
        "For this reason, the header and footer cannot be inserted into newly created spreadsheets.", _
        vbExclamation, "No Headers In Memory"
    End If
    Application.ScreenUpdating = True
End Sub