不确定您的第二段;我的理解是,您要监视输入工作表上的单元格 B3,当它发生变化时,调整工作表报告的 PageSetup 的 RightHeader,使其反映输入工作表上单元格 B18 中的内容。如果正确,您可以将以下代码放在 Input 工作表后面:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Me.Range("B3")) Is Nothing Then
ThisWorkbook.Worksheets("Report").PageSetup.RightHeader = "&28" & Me.Range("B18").Text
End If
End Sub
...并删除您的 Worksheet_SelectionChange 程序。
这个想法是监控输入工作表上的变化,并针对涉及其 B3 单元格的变化采取行动。
理想情况下,您应该为上面的单元格命名,这样即使您在输入工作表上添加或删除行和列,您的代码也能继续工作。见Define and use names in formulas。如果将Inputs!B3 定义为MyMonitoredValue 并将Inputs!B18 定义为MyPageSetupValue,则上面的代码将变为:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Me.Range("MyMonitoredValue")) Is Nothing Then
ThisWorkbook.Worksheets("Report").PageSetup.RightHeader = "&28" & Me.Range("MyPageSetupValue").Text
End If
End Sub
...您可以毫无顾虑地重新组织输入工作表的布局。
最后,您可以在工作表的(名称)属性下的“属性”窗口中,直接使用它们的代码名称(从 VBA 编辑器中看到)来引用它们,而不是通过其选项卡的名称来引用它们(按 Ctrl+R 显示 Project Explorer,单击 Microsoft Excel Objects 节点下的工作表,然后按 F4 显示 Properties 窗口)。您可以更改此值;我通常会将其更改为 shtReport。代码的另一个版本是:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Me.Range("MyMonitoredValue")) Is Nothing Then
shtReport.PageSetup.RightHeader = "&28" & Me.Range("MyPageSetupValue").Text
End If
End Sub
...能够承受报告工作表选项卡名称的更改和输入工作表的重组。