2015-10-12 6 views
1

Я ищу, чтобы обнаружить любые изменения в автофильтре в конкретной таблице, с целью форсирования UDF, который выполняет некоторые простые арифметические действия в записях таблицы, которые в настоящее время видны, чтобы обновить его результат. Уязвимость UDF не повлияла, но она не нацелена непосредственно на таблицу.Обнаружение изменений автофильтра

Это решение (https://stackoverflow.com/a/15906275/4604845) не работает для меня, возможно, потому что у меня есть только ручной расчет.

Мое маленькое слишком грязное обходное решение - Workbook_SelectionChange, и хотя UDF не убивает потребление ресурсов таким образом, я бы предпочел избежать его, если данные станут больше. Кроме того, у меня есть некоторые пользователи, которые являются полными новичками с точки зрения использования компьютеров, и у меня есть проблема с уверенностью в том, что я могу заставить всех их понять, что им нужно щелкнуть что-то еще после обновления автофильтра, чтобы результат был правильным.

Любые идеи? Я пробовал Workbook_Change и Workbook_Calculate, но ни один из них не запускается (или я не могу понять, как их запускать) с помощью изменений автофильтра.

+0

Синтаксис должен быть '= SUBTOTAL (3, TableName [Field])' вместо '= SUBTOTAL (3, tableName)' и он должен пересчитываться каждый раз, когда пользователь нажимает '[F9]' – EEM

+0

Да, я знаю синтаксис. Извините, если раньше я был неясен. Формулы, которые я разработал, работают очень хорошо с точки зрения отображения желаемой информации, я только борюсь с тем, как сделать это автообновление в пределах ограничений моей книги. – Vegard

+0

Они «обновляются» при нажатии '[F9]'? – EEM

ответ

2

Даже если у вас нет других формул на листе, если вы включите Итого() формулы где-то на листе, ссылающийся на таблицу, то Итого() будет пересчитывать каждый раз, когда автофильтрация изменяется.

Вы можете использовать это для запуска макроса события Calculate().

РЕДАКТИРОВАТЬ # 1:

Скажем, мы имеем набор AutoFilter на колонке листа с именем данные. Лист данные также содержит множество других формул. Если мы используем событие Calculate() в листе , мы получим пожары в любое время любые этих формул пересчитывают.

Мы создаем новый рабочий лист под названием trigger. Этот новый рабочий лист comletely пуст для одной ячейки, которая содержит, кроме:

=SUBTOTAL(3,data!A1:A20) 

Он находится в спускового листа, мы размещаем макрос события Вычислить().

Теперь, если мы, используя данные таблицы, мы можем сделать произвольные изменения и выполнять различный пересчёт и ничего не пожары, но если мы изменим автофильтр, макро событие на триггере будет видеть изменения и огнь!

+0

Вы имеете в виду '= SUBTOTAL (3, tableName)'? Я тоже пробовал это, но промежуточный итог не пересчитывается. Это, в сочетании с тем фактом, что текст-столбец, похоже, не работает с локализованными по языку функциями, была моей мотивацией для написания UDF в первую очередь. – Vegard

+0

Если у вас есть набор вычислений в ручном режиме, формула, естественно, не будет пересчитываться ... – Rory

+0

Это тоже мое понимание, поэтому я пытаюсь найти обходное решение. – Vegard

1

Как вызвать Worksheet Расчет следующие изменения Автофильтрами в то время как в ручном вычислении

Как известно, изменения в выборе AutoFilter не могут быть обнаружены автоматически, так как эти изменения не вызывают каких-либо Workbook Event или Worksheet Event. Таким образом, доступен только вариант, чтобы заставить пользователя вызывать вычисления рабочих листов с действием, т.е.Изменение выбора ячейки, щелчок правой кнопкой мыши, двойной клик и т. Д .; или просто нажав [F9]; что является предпочтительным действием, поскольку в нем нет ничего другого, и именно так оно и работает.

Тем не менее, по просьбе пользователя я предоставляю этот код VBA, хотя, хотя его необходимо инициировать действием пользователя, это действие можно выполнить сразу же после изменения AutoFilter, просто путем двойного щелчка.

DoubleClick может быть неограниченным (двойной щелчок любой ячейки на листе) с помощью этого кода:

Private Sub Worksheet_BeforeDoubleClick(ByVal rTrg As Range, blCancel As Boolean) 
    rTrg.Worksheet.Calculate 
End Sub 

или установка до трех типов ограничений:

  1. Любая клетка таблицы

  2. Заголовок таблицы

  3. Тело таблицы

использовать этот код, чтобы ограничить область DoubleClick: В настоящее время код установлен на ограничение типа 1, использовать переменную bRType, чтобы изменить его предпочтительного типа. Этот код считается, что имя таблицы является Table1(изменение при необходимости)

Private Sub Worksheet_BeforeDoubleClick(ByVal rTrg As Range, blCancel As Boolean) 
Dim ObjLst As ListObject, rTbl As Range, bRType As Byte 

    Rem Set Restriction Type 
    Rem 1: DoubleCliking any cell of the Table - Default 
    Rem 2: DoubleCliking any cell of the Table Header 
    Rem 3: DoubleCliking any cell of the Table Body 
    bRType = 1 

    With rTrg 
     Set ObjLst = .Worksheet.ListObjects("Table1") 

     Select Case bRType 
     Case 2:  Set rTbl = ObjLst.HeaderRowRange 
     Case 3:  Set rTbl = ObjLst.DataBodyRange 
     Case Else: Set rTbl = ObjLst.Range 
     End Select 

     If Not (Intersect(.Cells, rTbl) Is Nothing) Then 
      .Worksheet.Calculate 
      blCancel = True 
     End If 
    End With 
End Sub 

Обе процедуры Worksheet События, поэтому убедитесь, что один, что вы решили реализовать идет в модуль рабочего листа удерживая Таблица. (не изменяйте название процедур)

Смежные вопросы