Событие Worksheet_change и конфликт подключения фильтра среза

У меня проблема, которая ломает голову уже пару дней, вот и решил поделиться с вами, может вы уже сталкивались с такой же проблемой.

=== это контекст: ===

Я работаю над этим файлом Excel, где у меня есть, среди прочего, эти три вкладки: - одна, называемая «Данные», где я храню данные, которые мне нужны для файла, в обычной таблице; - второй, называемый "Диаграмма_1", где находятся сводная_таблица_1 и диаграмма_1. Источник для этих объектов находится во вкладке «Данные». - третья вкладка называется "Диаграмма_2" и содержит сводную_таблицу_2 и диаграмму_2. Эти объекты также берутся из вкладки «Данные». У меня есть пять слайсеров на вкладке «Диаграмма_1» и еще пять на вкладке «Диаграмма_2». Все слайсеры подключены к обеим сводным_таблицам, которые находятся на вкладках «График*». Я использовал VBA для форматов диаграмм на вкладках, как события Worksheet_Change.

=== вот в чем проблема: ===

Когда я выбираю что-то в слайсере (в зависимости от того, что является вкладкой «Диаграмма*»), он всегда активирует «Диаграмма_2». Если я щелкну один из слайсеров на вкладке «Диаграмма_1», когда макросы закончат работу, активируется вкладка «Диаграмма_2». Когда я нажимаю на один из слайсеров на вкладке «Диаграмма_2», все в порядке, потому что активированная вкладка не меняется. Какой бы слайсер я ни использовал (в какую бы вкладку он ни был встроен), VBA всегда сначала запускает Worksheet_Change «Chart_1», а затем Worksheet_Change «Chart_2». Я думаю, что это происходит из-за подключений фильтра: когда я нажимаю на один слайсер, он запускает все затронутые события Worksheet_Change.

=== это то, что я уже пробовал: ===

  • есть глобальная переменная, в которой я храню имя соответствующей вкладки работы. Не сработало, потому что выполняются оба макроса с обеих вкладок. Я пробовал то же самое со счетчиком и тоже потерпел неудачу.
  • ищите событие OnClick, где я мог бы сохранить имя вкладки, на которой я щелкнул в последний раз перед запуском макросов «Диаграмма *». Не нашел ни одного события OnClick, бух.
  • Я думал о том, чтобы иметь глобальную переменную для хранения имени листа слайсера, который я щелкнул/выбрал в последний раз, но я не знаю, как его получить. Как вы думаете, это может сработать? Как я могу это реализовать?

Итак, это моя проблема с логикой/программированием прямо сейчас. Есть ли у вас какие-либо предложения о том, как я могу это исправить? Я просто хочу остаться на той вкладке, где я был, когда щелкнул слайсер...


person SSGrace    schedule 11.02.2020    source источник
comment
Какой бы слайсер я ни использовал (в какую бы вкладку он ни был встроен), VBA всегда сначала запускает Worksheet_Change Chart_1, а затем Worksheet_Change Chart_2. Это предназначено? т. е. Вы хотите, чтобы обе диаграммы обновлялись при использовании любого из слайсеров? Оба макроса имеют смысл срабатывать при изменении обоих листов. Если вы этого не хотите, устраняет ли проблему удаление подключения слайсеров к листу, на котором они не находятся? Или вы просто ищете способ .активировать тот лист, на котором вы были, прежде чем настраивать слайсеры?   -  person Czeskleba    schedule 11.02.2020
comment
Если это так, вы могли бы, для этого конкретного случая и потому, что диаграмма 1 всегда вызывается первой, возможно, сделать следующее с вариантом golabl: GoodNameForAVariable = activesheet.name в начале события изменения диаграммы 1, а затем в конце события изменения диаграммы 2: Thisworkbook.Sheets("GoodNameForAVariable").activate   -  person Czeskleba    schedule 11.02.2020
comment
@Czeskleba, да, предполагается, что оба макроса запускаются. Я хочу обновлять обе диаграммы одновременно, когда использую слайсер. Я также пытался удалить соединения и подключить срезы каждого листа только к другим объектам на том же листе, но это тоже не сработало, потому что соединения, которые я отметил на одной вкладке, имитировались на другой вкладке. Это именно то, что я ищу: активировать лист, на котором я был, прежде чем настраивать слайсеры! :)   -  person SSGrace    schedule 11.02.2020
comment
Я просто строю лист, немного похожий на ваш. мой способ работает, но просто изменение слайсера и запуск события изменения на другом листе сами по себе не активируют этот лист. Я подозреваю, что в вашем коде есть что-то, что фактически переключает листы. Может быть, вы можете избежать этого. если вы не можете, мой код все равно должен работать.   -  person Czeskleba    schedule 11.02.2020
comment
@Czeskleba, когда я настраиваю слайсер (будь то на вкладке Chart_1 или Chart_2), события VBA всегда начинаются с макроса chart1, а затем макроса chart2. Итак, у нас было бы так: - я нажимаю любой слайсер в любой из вкладок; - запускается макрос Chart_1; - запускается макрос Chart_2; - Обе вкладки обновлены; - Chart_2 активирован, несмотря ни на что. Итак: если я заполню глобальную переменную GoodNameForAVVariable при запуске макроса 1, строка Thisworkbook.Sheets(GoodNameForAVariable).activate активирует диаграмму 1. Но если я начал на вкладке Chart_2, она также активирует вкладку Chart_1, поэтому она не я работаю...   -  person SSGrace    schedule 11.02.2020


Ответы (1)


Как обсуждалось в комментариях:

Chart1-Лист:

Public GoodNameForAVariable As String

Private Sub Worksheet_Change(ByVal Target As Range)

GoodNameForAVariable = ActiveSheet.Name

'Your code happens here

End Sub

Chart2-лист:

Private Sub Worksheet_Change(ByVal Target As Range)

'Your code happens here

ThisWorkbook.Sheets(GoodNameForAVariable).Activate

End Sub
person Czeskleba    schedule 11.02.2020
comment
На самом деле, ЭТО ВВВВВУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУМ-С-С Большое спасибо, Ческлеба! - person SSGrace; 11.02.2020