Excel VBA:分配给数据验证菜单的宏

时间:2013-07-01 12:59:45

标签: excel vba excel-vba

好的,这是我的情况:

我在工作簿中有两个数据透视图,图表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

1 个答案:

答案 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