Есть ли способ повторить оператор if в VBA для excel в зависимости от того, в какой ячейке вы находитесь

#excel #vba

Вопрос:

В настоящее время я работаю над созданием книги excel, в которой я хочу иметь возможность скрывать ячейки на основе проверки данных. Код, который у меня уже есть, работает нормально.

 Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Activate
If Not Application.Intersect(Range("C2"), Range(Target.Address)) Is Nothing Then
    Select Case Target.Value
    Case Is = "A": Rows("18:41").EntireRow.Hidden = True
                                          Rows("6:17").EntireRow.Hidden = False
    Case Is = "B": Rows("6:29").EntireRow.Hidden = False
                                          Rows("30:41").EntireRow.Hidden = True
    Case Is = "C": Rows("6:41").EntireRow.Hidden = False
    End Select
End If
End Sub
 

Проблема, с которой я сталкиваюсь, заключается в том, что это может повторяться до 8 раз (выполняется с аналогичной проверкой данных). Но каждый раз целевой адрес будет меняться, и строки, которые необходимо скрыть, будут меняться. Т. е. Ячейка целевого адреса 2-го раунда будет «C42», и строки, которые необходимо будет скрыть, изменят свои скрытые или нет, будут строками 46:81.

Мой первоначальный план состоит в том, чтобы просто создать 8 отдельных утверждений If, каждое из которых предназначено для рассматриваемой группы. Я хотел посмотреть, есть ли более чистый способ повторить тот же процесс.

Ответ №1:

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

Код будет выглядеть так:

 for i = 1 to letters.length
    if target.value = letters(i) then
        Rows(addresses(i)).EntireRow.Hidden = True
        Exit for
    End if
Next
        
 

Комментарии:

1. Спасибо, что это сработало.

2. Добро пожаловать :-). Пожалуйста, взгляните на именованные ячейки. Это упростит вашу жизнь. Другое дело: благодаря многолетнему опыту создания решений с помощью Excel, по мере роста решения вы должны оставаться все более и более дисциплинированными и избегать жесткого кодирования адресов или, если что-то окажется жестко закодированным, создавать константы с описательными именами с жестко закодированными адресами, значениями или чем-либо еще. Если вы этого не сделаете, ваш код скоро превратится в кошмар обслуживания. Я также советую вам взглянуть на то, что может делать Python, и, возможно, перейти к этому. Это сокращает код и значительно упрощает длительное кодирование VBA.

3. Да, я надеюсь перейти на python или что-то еще в будущем, это генератор документов. Но мне нужно будет создать графический интерфейс для конечных пользователей, что я все еще учусь делать. Мне нужно будет создать сложный графический интерфейс (лист Excel в настоящее время содержит 15 листов в рабочей книге и, вероятно, будет расширяться). То, что он делает, не очень сложно с математической точки зрения, это просто перемещение информации с правильными параметрами.