Страницы: 1
RSS
Макрос на отслеживание действий в определенных графах и обновления сводной таблицы
 
Здравствуйте, форумчане!
Есть огромная умная таблица, по ней создана сводная. А, как известно, сводная автоматически не обновляется. Через макрорекордер записал на кнопку обновление, но хочется что бы ексель сам отслеживал, если были изменения в определенных столбцах [Дата1] и [Дата2] то автоматически запускается уже готовый макрос на обновление. Интернет облазил, а необходимого не нашел. Ексель такое может? И если да, то что в макрос прописывать надо?
 
Ну, раз файл с примером Вы не удосужились прикрепить- докручивайте сами:)

Код
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("B:B, F:F")) Is Nothing Then 'Сюда впишите ваши столбцы в которых нужно отслеживать изменения
  On Error Resume Next
   If Len(Target.Cells(1, 1).Value) Then
    Call Refresh 'сюда 'вместо Refresh название готового макроса на обновление или  вот так     ActiveWorkbook.RefreshAll 
 
        Else
    Exit Sub
    End If
    End If
End Sub


P.S. На всякий случай:
Код вставляется в модуль листа, на котором будет происходить отслеживание изменений
Изменено: Dyroff - 03.05.2018 18:35:07
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Цитата
Dyroff написал:
Ну, раз файл с примером Вы не удосужились прикрепить- докручивайте сами:)
Докручу, с этим норм) В файле просто много персональных данных, от которых устану чистить файл.
Код работает - огромное спасибо! Но он проверяет только если данные добавились или изменились, а как сделать что бы еще на удаление он откликался?
 
Worksheet_Change срабатывает на любое изменение, в том числе на удаление, но в зависимости от того, как производится удаление, да и изменение тоже,  Target может быть как одной ячейкой, так и диапазоном или несколькими диапазонами и не факт что  условие Len(Target.Cells(1, 1).Value)  выполнится.
Изменено: БМВ - 03.05.2018 21:32:37
По вопросам из тем форума, личку не читаю.
 
Доброе время суток
Цитата
Dyroff написал:
Код вставляется в модуль листа, на котором будет происходить отслеживание изменений
Коллега, а стоит ли идти на поводу у ТС? В 99,9% случаев сводная находится на другом листе. И если так, то не лучше ли чуть под другом, зачем "тормоза" при вводе данных?
 
Андрей VG, Андрей, вечер добрый. Но ведь есть вероятность ,что сводная - всего лишь промежуточный расчет. Тогда встряхивать нужно при изменении, а не тогда когда глаз на нее кто положит.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Тогда встряхивать нужно при изменении
Привет, Михаил.
Всё может быть. Только делать из Excel realtime систему, как-то не очень хороший подход, на мой скромный взгляд.
 
Андрей VG, Да, поторопился)
Отличное решение, но это приходит с опытом:)
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Off
Цитата
Андрей VG написал:
Только делать из Excel realtime систему
Ну как бы она уже такая, и автопересчет, и MSQuery Refresh, все об этом. Так что, если управляемо и грамотно это делать, то ничего страшного.  
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Worksheet_Change срабатывает на любое изменение, в том числе на удаление, но в зависимости от того, как производится удаление
А скажите, пожалуйста, как правильно производить удаление? Обычным "делит" не получается
Цитата
Андрей VG написал:
Только делать из Excel realtime систему, как-то не очень хороший подход, на мой скромный взгляд
К большому сожалению пока в моей распоряжении нет других продуктов, когда я пришел на рабочее место, здесь был вообще хаос, сейчас пытаюсь все как то упорядочить, пока с помощью экселя. Ведь у нас покупают продукт только в том случае, если на практике доказать его необходимость
Изменено: GertiyMV - 04.05.2018 08:47:21
 
Цитата
Андрей VG написал:
В 99,9% случаев сводная находится на другом листе. И если так, то не лучше ли чуть под другом, зачем "тормоза" при вводе данных?
Да, я знаю данный способ, спасибо за вариант решения проблемы. Но он мне не подходит, т.к. основные данные на "Лист1", сводная на "Лист1", а на "Лист2" находится таблица пересчета данных из таблицы на "Лист1" и является таблицей для сводной таблицы на "Лист1". По этому при изменении основных данных, есть необходимость что бы сразу же пересчитывалась и сводная.
 
ну примерно так измените код
Код
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Target, Range("B:B, F:F")) Is Nothing Then 'Сюда впишите ваши столбцы в которых нужно отслеживать изменения
     On Error Resume Next
     Call Refresh 'сюда 'вместо Refresh название готового макроса на обновление или  вот так     ActiveWorkbook.RefreshAll 
   End If
End Sub

ведь Dyroff, как раз этим Len(Target.Cells(1, 1).Value) заблокировал выполнение.
По вопросам из тем форума, личку не читаю.
 
Коллеги, не настаиваю, высказал своё мнение. Только, думаю, следует учесть, что раз в неделю - месяц обязательно возникает тема:
Помогите оптимизировать (подобрать мощный компьютер), а то тормозит при вводе :)
 
Андрей VG, Андрей, добрый день. Да правы вы конечно в том, что лишние телодвижения только греют процессор, спору нет. И все понимают, что бесполезной работой можно нагрузить топовый I7, при этом выхлоп будет минимальным. Но с другой стороны, если на текущий момент -тормозов сильных нет и  пока не предвидится, а переработка модели и методов расчета трудозатратна, можно и погреть проц лишний  раз, ну или потерпеть пару секунд.  
По вопросам из тем форума, личку не читаю.
 
БМВ,спасибо, попробую в выходные!
БМВ, Андрей VG, в этом файле не планируется более 500 записей и включать данный макрос планирую только при планировании свой работы и работы департамента, а это всего лишь 30% работы с файлом, но очень сильно мне поможет автоматизация!
Страницы: 1
Наверх