在不同工作表上更改单元格时运行VBA

时间:2017-10-31 15:58:01

标签: excel vba excel-vba

我是VBA的新手,但已设法创建一个代码,将我的工作表的标题链接到另一个工作表上的单元格。

每次单击活动工作表中的单元格时,代码都会运行。我希望代码只在另一个工作表中的某个单元格发生变化时运行。 "报告"有标题 "输入"具有代码所引用的单元格(B18)以及我希望代码在更改时运行的单元格(B3)。

以下是我已经拥有的代码。

Private Sub Worksheet_selectionChange(ByVal Target As Range)
ActiveSheet.PageSetup.RightHeader = "&28" & Format(Worksheets("Input").Range("b18").Text)
End Sub

非常感谢任何帮助!!!

1 个答案:

答案 0 :(得分:0)

不确定你的第二段;我的理解是你要监视输入工作表上的单元格B3,当它发生变化时,调整工作表报表的PageSetup的RightHeader,使其反映输入工作表中单元格B18中的内容。如果这是正确的,您可以将以下代码放在输入工作表后面:

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

...您可以毫无后顾之忧地重新组织输入工作表的布局。

最后,不是通过其选项卡的名称引用工作表(从Excel中看到),您可以直接使用它们的CodeName来引用它们,如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

...它能够承受报告工作表选项卡名称的更改以及输入工作表的重组。