Динамическое скрытие столбцов на основе значений ячеек - PullRequest
0 голосов
/ 15 января 2020

У меня есть лист с диапазоном ячеек (B15: BL15) с формулами, которые возвращают либо «Показать», либо «Скрыть». Значения меняются, когда я делаю выбор из поля со списком элемента управления формы (не ActiveX), и я назначил макрос ниже для поля со списком. Макрос должен отображать или скрывать столбец на основе значений в ячейке.

При первом выборе все столбцы в конечном итоге скрываются независимо от значений в ячейках. Когда я выбираю его снова, код работает нормально (т. Е. Я выбираю параметр A, и все столбцы в диапазоне скрыты. Я выбираю параметр B, а затем go возвращается к варианту A, и правильные столбцы теперь отображаются и скрываются). Что-то мне здесь не хватает?

Option Explicit

Sub ShowHide()

Cells.Columns.EntireColumn.Hidden = False    ' Added to unhide all of the columns first.

Dim c As Range

For Each c In Range("B15:BL15").Cells        ' Range of cells containing the formulas

With c
    If .Value = "Hide" Then
       .EntireColumn.Hidden = True
    Else
        .EntireColumn.Hidden = False
    End If

End With

Next c

End Sub

Любая помощь с благодарностью!

1 Ответ

0 голосов
/ 15 января 2020

Надеюсь, это кому-нибудь поможет!

Проблема была вызвана тем, что код выполнялся до завершения всех вычислений и обновления диапазона. Во время калибровки c ячейки в диапазоне кратко по умолчанию стали «скрывать», что вызвало скрытие столбца.

Я обнаружил Application.CalculateUntilAsyncQueriesDone, что заставило код выполняться после завершения всех вычислений и диапазона был обновлен. Пересмотренный код ниже:

Sub ShowHide()

Dim c As Long

Application.ScreenUpdating = False
Application.CalculateUntilAsyncQueriesDone

For c = 2 To 64
    If Cells(16, c).Value = "Hide" Then
        Columns(c).Hidden = True
    Else
        Columns(c).Hidden = False
    End If
Next c
Application.ScreenUpdating = True

End Sub

Примечание: Я видел несколько потоков, используя оператор IF и затем, а затем Application.CalculationState = xlDone, но это не сработало. Если кто-нибудь знает, почему я хотел бы понять.

...