#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 листов в рабочей книге и, вероятно, будет расширяться). То, что он делает, не очень сложно с математической точки зрения, это просто перемещение информации с правильными параметрами.