根据 MacroMarc 的评论,这是一个建议,其中包括一个数据透视图、一些子过程和一个 Worksheet.Change 事件。
1 - 设置数据透视图
从您的示例数据开始,选择范围并使用 Data |插入数据透视图。确认所选范围并指定您希望将数据透视图放置在单元格 K1 中。实际上,这是附表结束的地方,而不是图表本身。
最初,您可以在数据透视图字段下同时选择 car-model 和 car-color。当然,您也需要崩溃:
说到崩溃,你应该继续点击Sum of Crashes:
然后点击Value Field Settings并选择Summarize value field by下的Average:
现在你应该得到这个:
2 - 制作下拉菜单
首先,我们将创建一个列表,我们可以在其中选择要显示的值。
转到 公式 |名称管理器:
单击新建 并将您的列表命名为modelORcolor。确保它引用您的类别名称所在的范围 A1:B1。单击确定,然后在下一个窗口中单击关闭:
如果您想仔细检查参考文献是否正确,现在可以在此处选择您的新列表:
接下来,选择单元格 F2 并转到 Data 选项卡 并选择 Data Validation:
在 Allow 下,选择 list,然后在 Source 字段中输入您的列表名称 =modelORcolor(不要忘记等号):
现在您可以在单元格 F2 的下拉列表中进行选择:
3 - 编写一些宏:
打开 Visual Basic 编辑器并插入一个新模块。
您可以在此处插入这段小代码:
Sub setModel()
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.ChartTitle.Text = "Average Crashes by Model"
ActiveChart.PivotLayout.PivotTable.PivotFields("car-color").Orientation = xlHidden
With ActiveChart.PivotLayout.PivotTable.PivotFields("car-model")
.Orientation = xlRowField
.Position = 1
End With
End Sub
Sub setColor()
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.ChartTitle.Text = "Average Crashes by Color"
ActiveChart.PivotLayout.PivotTable.PivotFields("car-model").Orientation = _
xlHidden
With ActiveChart.PivotLayout.PivotTable.PivotFields("car-color")
.Orientation = xlRowField
.Position = 1
End With
End Sub
现在您需要启用对工作表中的更改做出反应的功能。
在 Project Explorer 中转到 Sheet1(Sheet1):
并插入这段小代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Range("E3").Value = "car-model" Then
Call setModel
End If
If Range("E3").Value = "car-color" Then
Call setColor
End If
Application.EnableEvents = True
End Sub
Application.EnableEvents = False 非常重要。没有它,您的代码将触发连锁反应,其中 sn-ps setModel 和 setColor 的更改会触发对工作表更改的新反应。
保存您的项目(作为 .xlsm 文件以允许宏执行其操作)并返回到您的 Excel 工作表。
现在您应该可以选择 car-model 或 car-color 并立即在数据透视图中看到所需的结果。
汽车模型
汽车颜色
此解决方案有点受限于您的示例数据。更灵活的解决方案包括将数据范围和列表定义为动态范围。但是这个解决方案应该符合您的规范。试试看,如果遇到任何障碍,请告诉我。