Сбой Excel при обновлении автофильтров - PullRequest
2 голосов
/ 29 июля 2011

Я использую следующий код для обновления автофильтра в Excel при смене ячейки.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim MySheet As Worksheet
  'On Error Resume Next
  'Set MySheet = Application.ActiveSheet
  'MySheet.Columns(1).AutoFilter.ApplyFilter
  'On Error Resume Next
  'Application.EnableEvents = False
  Worksheets("Basisgegevens").Range("$A$1:$A$146").AutoFilter Field:=1, Criteria1:=Array("0", _
        "2", "="), Operator:=xlFilterValues
  'Application.EnableEvents = True
  'On Error GoTo 0
End Sub

Я использую это, чтобы скрыть строки на основе определенных критериев.И для этого он работает очень хорошо.

Проблема
Однако, когда я устанавливаю проверку для ячейки и добавляю один из этих крутых выпадающих списков.enter image description here
Чтобы ячейка выглядела следующим образом: enter image description here

Эта часть работает нормально, но как только я выбираю другое значение, заставляет автофильтр скрывать / отображать разные ячейки Excel вылетает

Моя теория
Раскрывающийся список проверки изменяет ячейку.
Это вызывает код VBA, показанный выше.
Однако код проверкивсе еще работает, в то время как настройки фильтра переинициализируются.
Это приводит к сбою Excel.

Как это исправить?
Поможет ли задержка запуска события VBA?
Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 11 августа 2011

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

Вот обходной путь:

Option Explicit

Dim ReapplyFilter As Boolean

'OnCalculate is always called twice, before and after calculation.
'I'm only interested in the event after.  
Private Sub Worksheet_Calculate()
  If (Application.CalculationState = xlDone) And (ReapplyFilter = True) Then
    ReapplyFilter = False
    On Error Resume Next
    Worksheets("Basisgegevens").Range("$A$1:$A$146").AutoFilter Field:=1, Criteria1:=Array("0", _
          "2", "3", "4", "5", "="), Operator:=xlFilterValues
    On Error GoTo 0
  End If

End Sub

'Always Reapply the filter on activation of the sheet.
Private Sub Worksheet_Activate()
  Worksheets("Basisgegevens").Range("$A$1:$A$146").AutoFilter Field:=1, Criteria1:=Array("0", _
          "2", "3", "4", "5", "="), Operator:=xlFilterValues
End Sub

'OnChange: set the flag to be picked up by calculation later on.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MySheet As Worksheet
  ReapplyFilter = True
End Sub
1 голос
/ 09 августа 2011

Я не думаю, что что-то не так с тем, что вы делаете сейчас.Но я подозреваю, что есть другой компонент, вызывающий этот сбой, такой как надстройки.Почему бы вам не выгрузить или не удалить ненужные надстройки (http://office.microsoft.com/en-us/excel-help/load-or-unload-add-in-programs-HP010096834.aspx) и попробовать код еще раз?

...