【问题标题】:Worksheet_change event and slicer filter connection conflictWorksheet_change 事件和切片器过滤器连接冲突
【发布时间】:2020-02-11 12:27:57
【问题描述】:

我有一个问题困扰了我几天,所以我决定与您分享,也许您已经偶然发现了同样的问题。

=== 这是上下文:===

我正在处理这个 excel 文件,其中包括以下三个选项卡: - 一,称为“数据”,我将文件所需的数据存储在常规表中; - 第二个,称为“Chart_1”,可以在其中找到 pivot_table_1 和 chart_1。这些对象的来源位于“数据”选项卡中。 - 第三个选项卡称为“Chart_2”,包含 pivot_table_2 和 chart_2。这些对象也来自“数据”选项卡。 我在选项卡“Chart_1”中有五个切片器,在选项卡“Chart_2”中有五个切片器。所有切片器都连接到“图表*”选项卡中的两个数据透视表。 我将 VBA 用于选项卡中的图表格式,作为 Worksheet_Change 事件。

=== 这就是问题所在:===

当我在切片器中选择某些内容时(以“图表*”选项卡为准),它总是会激活“图表_2”。 如果我单击选项卡“Chart_1”中的切片器之一,当宏完成运行时,选项卡“Chart_2”被激活。 当我单击选项卡“Chart_2”中的一个切片器时,一切都很好,因为激活的选项卡没有改变。 无论我使用哪个切片器(无论它嵌入在哪个选项卡中),VBA 总是首先运行“Chart_1”的 Worksheet_Change,然后运行“Chart_2”的 Worksheet_Change。我认为这是由于过滤器连接而发生的:当我单击一个切片器时,它将触发所有受影响的 Worksheet_Change 事件。

=== 这是我已经尝试过的:===

  • 有一个全局变量,用于存储工作对应选项卡的名称。不起作用,因为两个选项卡中的两个宏都已执行。我用计数器尝试了同样的方法,但同样失败了。
  • 查找 OnClick 事件,我可以在其中保存在“图表 *”的宏运行之前最后一次单击的选项卡的名称。没有找到任何 OnClick 事件,呃。
  • 我想过有一个全局变量来存储我上次单击/选择的切片器的工作表名称,但我不知道如何获取它。你认为这可行吗?如何实施?

所以,这是我现在的逻辑/编程问题。你对我该如何解决它有什么建议吗?我只想留在我单击切片器时所在的选项卡中......

【问题讨论】:

  • “无论我使用哪个切片器(无论它嵌入在哪个选项卡中),VBA 总是先运行“Chart_1”的 Worksheet_Change,然后运行“Chart_2”的 Worksheet_Change” 这是有意的吗?即,当您使用任一切片器时,您是否希望两个图表都更新?如果两个工作表都发生变化,这两个宏都触发是有意义的。如果您不希望这样做,是否将切片器与工作表的连接移除是否可以解决问题?还是您只是在寻找一种方法来“激活”您在调整切片器之前所在的工作表?
  • 如果是这样,您可以,对于这种特定情况,并且因为 chart1 总是首先被调用,可能会使用 golabl 变体执行以下操作:GoodNameForAVariable = activesheet.name 在 chart1s 更改事件的开头,然后在结束时chart2s 变更事件:Thisworkbook.Sheets("GoodNameForAVariable").activate
  • @Czeskleba,是的,这两个宏都打算运行。我想在使用切片器时同时更新两个图表。我还尝试删除连接并将每个工作表的切片器仅连接到同一工作表中的其他对象,但它也不起作用,因为我在一个选项卡中勾选的连接被模仿到另一个选项卡。这正是我正在寻找的:在调整切片机之前激活我所在的工作表! :)
  • 我只是制作了一张和你的有点相似的床单。我的方式可行,只是更改切片器并在另一张表上触发更改事件本身并不会激活该表。我怀疑你的代码中有一些东西实际上会切换工作表。也许你可以避免这种情况。如果你不能,我的代码仍然可以工作。
  • @Czeskleba,当我调整切片器时(无论是在“Chart_1”还是“Chart_2”选项卡中),VBA 事件总是从 chart1 宏开始,然后是 chart2 宏。所以,我们会有这样的: - 我单击任何选项卡中的任何切片器; - Chart_1 宏运行; - Chart_2 宏运行; - 两个标签都更新了; - Chart_2 无论如何都会被激活。所以:如果我在启动宏 1 时填充 GoodNameForAVVariable 全局变量,Thisworkbook.Sheets("GoodNameForAVariable").activate 行将激活图表 1。但如果我从 Chart_2 选项卡开始,它也会激活 Chart_1 选项卡,所以它不会工作...

标签: excel vba events slicers


【解决方案1】:

如 cmets 中所述:

Chart1-Sheet:

Public GoodNameForAVariable As String

Private Sub Worksheet_Change(ByVal Target As Range)

GoodNameForAVariable = ActiveSheet.Name

'Your code happens here

End Sub

Chart2-Sheet:

Private Sub Worksheet_Change(ByVal Target As Range)

'Your code happens here

ThisWorkbook.Sheets(GoodNameForAVariable).Activate

End Sub

【讨论】:

  • 实际上,这个 WWWWWOOOOOOOOORKEEEEEEEEED!!!!!!!!!非常感谢,Czeskleba!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2017-06-09
相关资源
最近更新 更多