VBA Hide и Unhide Rows, основанные на изменении значений ячеек - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь скрыть / показать строки в Excel на основе определенного значения ячейки. Если значение равно 0, все строки должны быть скрыты. Если значение равно 1, то строки с 36 по 1000 скрыты. Если значение равно 2, то строки с 72 по 1000 скрыты, если это 3, то скрыты строки с 108 по 100 и т. Д., Пока все ячейки не будут скрыты ...

Вот то, что у меня есть до сих пор ... Это работает для скрытия / отображения, но если я изменяю число с 0 на 1, а затем с 1 на 2, оно иногда не обновляется ...

Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Address = ("$E$3") And Target.Value = 0 Then
         Sheets("Abutments").Rows("5:1000").EntireRow.Hidden = True
     ElseIf Target.Address = ("$E$3") And Target.Value = 1 Then
        Sheets("Abutments").Rows("36:1000").EntireRow.Hidden = True
     ElseIf Target.Address = ("$E$3") And Target.Value = 2 Then
         Sheets("Abutments").Rows("72:1000").EntireRow.Hidden = True
     Else
         Sheets("Abutments").Rows("5:1000").EntireRow.Hidden = False
     End If
End Sub

БОНУС: есть ли способ для кода vba ссылаться на изменяющуюся ячейку, если ячейка содержала формулу?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

В вашем коде отсутствует та часть, где строки возвращены к видимой, а где скрыты ранее.Так, например, если вы введете 1, строки 5 ... 1000 будут скрыты.Теперь, если вы измените значение на 2, вы прячете строки 36 ... 1000 (но они уже скрыты), но строки 5.35 не отображаются.

Следующий код вычисляетпервый ряд будет скрыт.Все строки выше, которые отображаются, все строки, начиная с этой строки до строки 1000, скрыты.Если математика не соответствует вашим потребностям, ее легко изменить, чтобы адаптировать ее.

Обратите внимание, что я использовал функцию Val для предотвращения ошибок во время выполнения, если пользователь вводит что-то, что не являетсячисловой

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$E$3" Then Exit Sub

    Dim startrow As Long
    If Val(Target.Value) <= 0 Then
        startrow = 5
    Else
        startrow = Val(Target.Value) * 32
    End If

    With Sheets("Abutments")
        If startrow > 5 Then
            .Rows("5:" & startrow - 1).Hidden = False
        End If
        If startrow <= 1000 Then
            .Rows(startrow & ":1000").Hidden = True
        End If

    End With
End Sub

Обновление Не знаю, правильно ли я понимаю ваш бонусный вопрос.Если ячейка E3 содержит формулу, событие Change не будет вызываться при изменении значения.Вы должны реализовать логику, используя событие Worksheet_Calculate, как описано в https://stackoverflow.com/a/11409569/7599798

0 голосов
/ 16 ноября 2018

У тебя почти было это! Ваша логика была немного не в порядке:

Как истинный сторонник принципа К.И.С., просто внесите небольшие изменения в порядок своих высказываний. Не нужно слишком усложнять это ...

Private Sub Worksheet_Change(ByVal Target As Range)
 Sheets("Abutments").Rows("5:1000").EntireRow.Hidden = False ' Move this to the top
 If Target.Address = ("$E$3") And Target.Value = 0 Then
     Sheets("Abutments").Rows("5:1000").EntireRow.Hidden = True
 ElseIf Target.Address = ("$E$3") And Target.Value = 1 Then
    Sheets("Abutments").Rows("36:1000").EntireRow.Hidden = True
 ElseIf Target.Address = ("$E$3") And Target.Value = 2 Then
     Sheets("Abutments").Rows("72:1000").EntireRow.Hidden = True
 End If
End Sub

Просто переместите ваше окончательное условие оператора ELSE в начало вашей функции. Это откроет все в начале, а затем скроет строки на основе вашего выбора. Это заставит ваш сценарий переоценивать условие, чтобы скрывать строки каждый раз, вместо того, чтобы соответствовать условию отмены скрытия строк (именно поэтому ваш оригинальный сценарий работал только иногда).

EDIT:

Ваш бонусный вопрос уже решен с помощью этого скрипта. Пока значение ячейки (E3 в этом случае) содержит числовое значение, оно будет скрывать строки. Независимо от того, создается ли это значение формулой или жестко закодированным значением, сценарию не будет важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...