Excel VBA:分配给数据validation菜单的macros

好的,这是我的情况:

我有一个工作簿中的两个数据透视图,图表A和图表B(在单独的工作表上…他们是大图表)。 每个图表下都有一个数据validation下拉菜单,其中列出了几年(2010-2020)。 在菜单中select一年激活一个macros,该macros改变给定年份显示的信息。 我想编写macros,以便两个菜单中只有一个菜单中的项目被选中,两个图表中的信息都会发生变化。 此外。 我想使这两个下拉菜单更新。 也就是说,我从图表A的下拉菜单中select“2010”,B图表A和图表B现在显示2010年的数据,而图表B下方的菜单现在显示2010。

我开始写下如下的macros:

Sub Chart2010() ' ' Chart2010 Macro ' ' Application.ScreenUpdating = False ReturnSheet = ActiveSheet.Name Sheets("VP MfgGroupPivot").Select ActiveSheet.PivotTables("MfgGroupPivot").ClearTable With ActiveSheet.PivotTables("MfgGroupPivot").PivotFields( _ "VP: Manufacturer Group") .Orientation = xlRowField .Position = 1 End With With ActiveSheet.PivotTables("MfgGroupPivot").PivotFields( _ "E: Propulsion System Design") .Orientation = xlColumnField .Position = 1 End With ActiveSheet.PivotTables("MfgGroupPivot").AddDataField ActiveSheet.PivotTables( _ "MfgGroupPivot").PivotFields("VCR 2010"), "Sum of VCR 2010", xlSum Columns("B:H").Select Selection.NumberFormat = "_($* #,##0_);_($* (#,##0);_($* ""-""??_);_(@_)" Sheets("DCS MfgPivot").Select ActiveSheet.PivotTables("DCSMfgPivot").ClearTable With ActiveSheet.PivotTables("DCSMfgPivot").PivotFields( _ "VP: Manufacturer Group") .Orientation = xlRowField .Position = 1 End With With ActiveSheet.PivotTables("DCSMfgPivot").PivotFields( _ "E: Propulsion System Design") .Orientation = xlColumnField .Position = 1 End With ActiveSheet.PivotTables("DCSMfgPivot").AddDataField ActiveSheet.PivotTables( _ "DCSMfgPivot").PivotFields("DCS Rev 2010"), "Sum of DCS Rev 2010", xlSum Columns("B:H").Select Selection.NumberFormat = "_($* #,##0_);_($* (#,##0);_($* ""-""??_);_(@_)" If ReturnSheet = "VP MfgGroupChart" Then Sheets("DCS MfgChart").Select [C37].Value = 2010 ElseIf ReturnSheet = "DCS MfgChart" Then Sheets("VP MfgGroupChart").Select [C37].Value = 2010 End If Sheets(ReturnSheet).Select End Sub 

这似乎是工作…它应该,如果不是例程调用基于下拉改变(下面)的macros,

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Select Case Range("C37") Case "2010" Call Chart2010 Case "2011" Call Chart2011 Case "2012" Call Chart2012 Case "2013" Call Chart2013 Case "2014" Call Chart2014 Case "2015" Call Chart2015 Case "2016" Call Chart2016 Case "2017" Call Chart2017 Case "2018" Call Chart2018 Case "2019" Call Chart2019 Case "2020" Call Chart2020 End Select End Sub 

因此,我在Chart2010例程结束时的if语句会导致无限循环,因为调用macros是基于表更改。

所以问题是(对于这么长时间的啰嗦)抱歉,有没有办法让下拉菜单更新,而不是一遍又一遍地调用macros?

谢谢。

-Sean

尝试在事件过程中closures(禁用)一段时间的事件:

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'add this at the beginning Application.EnableEvents = false 'your Select case code here 'add this at the end Application.EnableEvents = true End Sub