excel - 当单元格内容更改时,将单元格内容放入 Excel 工作表页眉或页脚
问题描述
我在 Windows 中使用 Excel 365,并尝试在单元格内容更改时将某些单元格的内容复制到工作表页眉(或页脚)。例如,我正在创建一系列数据表,在第一页我有一个单元格,用户在其中键入客户使用的采购订单 (PO)。我想让用户输入一次采购订单号,然后将采购订单号放在所有后续页脚中。打印数据表堆栈时,采购订单(和其他关键信息)将出现在所有页面上。我知道 Excel 不会自然而然地做到这一点,我发现一些相当丑陋的宏和 VB 代码可以通过 Google 以编程方式做到这一点,但我无法让它工作。所以....我希望有一些更简单的魔法。
Private HeaderSave() As Variant
Private HeaderChanged() As Variant
Public Sub SaveAndSetHeaders()
Dim Index As Long
' Save and set header and footer text Application.ScreenUpdating = False
ReDim HeaderSave(1 To ThisWorkbook.Sheets.Count) ReDim HeaderChanged(1 To
ThisWorkbook.Sheets.Count, 0 To 5)'
For Index = 1 To ThisWorkbook.Sheets.Count
With ThisWorkbook.Sheets(Index).PageSetup
HeaderSave(Index) = Array(.LeftHeader, .CenterHeader, .RightHeader,
.LeftFooter, .CenterFooter, .RightFooter)
If InStr(HeaderSave(Index)(0), "^[Cell:") > 0 Then
.LeftHeader = SubstituteCellValues(ThisWorkbook.Sheets(Index),
HeaderSave(Index)(0))
HeaderChanged(Index, 0) = True
End If
If InStr(HeaderSave(Index)(1), "^[Cell:") > 0 Then
.CenterHeader = SubstituteCellValues(ThisWorkbook.Sheets(Index),
HeaderSave(Index)(1))
HeaderChanged(Index, 1) = True
End If
If InStr(HeaderSave(Index)(2), "^[Cell:") > 0 Then
.RightHeader = SubstituteCellValues(ThisWorkbook.Sheets(Index),
HeaderSave(Index)(2))
HeaderChanged(Index, 2) = True
End If
If InStr(HeaderSave(Index)(3), "^[Cell:") > 0 Then
.LeftFooter = SubstituteCellValues(ThisWorkbook.Sheets(Index),
HeaderSave(Index)(3))
HeaderChanged(Index, 3) = True
End If
If InStr(HeaderSave(Index)(4), "^[Cell:") > 0 Then
.CenterFooter = SubstituteCellValues(ThisWorkbook.Sheets(Index),
HeaderSave(Index)(4))
HeaderChanged(Index, 4) = True
End If
If InStr(HeaderSave(Index)(5), "^[Cell:") > 0 Then
.RightFooter = SubstituteCellValues(ThisWorkbook.Sheets(Index),
HeaderSave(Index)(5))
HeaderChanged(Index, 5) = True
End If
End With
Next Index
Application.ScreenUpdating = True
End Sub
Public Sub RestoreHeaders()
Dim Index As Long
' Restore header and footer text'
Application.ScreenUpdating = False
For Index = 1 To ThisWorkbook.Sheets.Count
With ThisWorkbook.Sheets(Index).PageSetup
If HeaderChanged(Index, 0) Then .LeftHeader = HeaderSave(Index)(0)
If HeaderChanged(Index, 1) Then .CenterHeader = HeaderSave(Index)(1)
If HeaderChanged(Index, 2) Then .RightHeader = HeaderSave(Index)(2)
If HeaderChanged(Index, 3) Then .LeftFooter = HeaderSave(Index)(3)
If HeaderChanged(Index, 4) Then .CenterFooter = HeaderSave(Index)(4)
If HeaderChanged(Index, 5) Then .RightFooter = HeaderSave(Index)(5)
End With
Next Index
Application.ScreenUpdating = True
End Sub
Private Function SubstituteCellValues( _
ByVal FocusSheet As Worksheet, _
ByVal Text As String _
) As String
' Look for the text "^[Cell:A1]" and replace it with the cell's value. The
cell reference can be any valid cell reference with or without a sheet
name. If no sheet name is included the sheet for which the header or
footer text is defined is assumed.'
Dim StartPos As Long
Dim EndPos As Long
Dim FindText As String
Dim ReplaceText As String
Dim CellReference As String
Do
StartPos = InStr(Text, "^[Cell:")
If StartPos > 0 Then
EndPos = InStr(StartPos, Text, "]")
If EndPos = 0 Then Exit Do
FindText = Mid(Text, StartPos, EndPos - StartPos + 1)
CellReference = Mid(FindText, 8, Len(FindText) - 8)
If InStr(CellReference, "!") = 0 Then
CellReference = "'" & FocusSheet.Name & "'!" & CellReference
End If
On Error Resume Next
ReplaceText = Range(CellReference).Value
On Error GoTo 0
Text = Replace(Text, FindText, ReplaceText)
Else
Exit Do
End If
Loop
SubstituteCellValues = Text
End Function
Private Sub Workbook_BeforePrint(Cancel As Boolean)
SaveAndSetHeaders
Application.OnTime Now, "ThisWorkbook.Workbook_AfterPrint"
End Sub
Private Sub Workbook_AfterPrint()
RestoreHeaders
End Sub
解决方案
推荐阅读
- node.js - 节点项目在 Canvas.createCanvas() 上无错误退出
- python-2.7 - 如何使用 Python 和 gtk 将文本缓冲区(它包含使用不同字体颜色、系列、样式和大小修改的文本)保存到文件中?
- python - 如何使用 seaborn 热图制作 jupyter HTML-matplotlib 动画?
- javascript - 如何在循环中选择一组数字?
- powershell - 使用某些 cmdlet 返回空值的 Powershell 自定义列
- python - 在 Python 中的大型数据集上使用 OOP 是否有益?
- reference - 包含可变切片的结构
- python - 从 django 渲染的 html 中显示字典
- c# - 将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。该语句已终止
- reactjs - 如何将特定 id 传递给路由的路径?