好的,这是我的情况:
我在工作簿中有两个数据透视图,图表A和图表B(在单独的表格上......它们是大图表)。在每个图表下面是一个数据验证下拉菜单,其中列出了多年(2010-2020)。在菜单中选择年份会激活一个宏,该宏会更改给定年份显示的信息。我想编写宏,以便两个图表中的信息都会发生变化,即使只选择了两个菜单中的一个菜单中的项目。此外。我想这样做,以便两个下拉菜单更新。也就是说,我从图表A的下拉列表中选择“2010”,图表A和图表B现在显示2010年的数据,图表B下的菜单现在显示2010年。
我开始编写以下宏:
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
这似乎可以工作......它应该是,如果它不是基于下拉变化调用宏的例程(下面)
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语句会导致无限循环,因为调用宏是基于工作表更改。
所以问题是(并且对于如此长时间的啰嗦而感到遗憾),有没有办法让两个下拉菜单更新而不会一遍又一遍地调用宏?
感谢。
-Sean
答案 0 :(得分:2)
尝试在事件过程中关闭(禁用)events
一段时间:
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