Есть ли код для скрытия пустых строк в нескольких столбцах?

#vba #hide

Вопрос:

Я ищу код, чтобы скрыть пустые строки для определенного диапазона столбцов с помощью кнопки переключения. У меня есть таблица, начинающаяся с P9 по U71, и я хотел бы, чтобы код скрывал любую строку, которая не содержит никаких данных в этой конкретной таблице. Я попробовал несколько кодов с последней публикацией ниже, но этот код скрывается на основе значений в столбце U и даже если в той же строке были данные, но в другом столбце. Я должен отметить, что у меня нет никакого опыта в кодировании, и поэтому я благодарю вас за любую помощь в этом вопросе.

 Sub Worksheet_Activate()
    Dim r As Range, c As Range
Set r = Range("q9:u71")
Application.ScreenUpdating = False
For Each c In r
      If Len(c.Text) = 0 Then
              c.EntireRow.Hidden = True
      Else
              c.EntireRow.Hidden = False
      End If
 Next c
Application.ScreenUpdating = True
End Sub
 

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

1. Итак, вы хотели бы скрыть все строки в указанном диапазоне, если они полностью пусты . Правильно ли это понимание?

2. Это правильно

3. Используйте WorksheetFunction.CountA в каждой строке. Если результат равен 0, скройте строку.

4. Затем проверьте адаптированный код, который я опубликовал. Но если ячейки в обработанном диапазоне изменяются кодом и некоторые (уже) скрытые ячейки получают значение, разве вам не нужно, чтобы эти строки были видны?

Ответ №1:

Попробуйте следующий код, пожалуйста:

 Sub Worksheet_Activate()
 Dim i As Long, rngH As Range

 For i = 9 To 71
      If WorksheetFunction.CountA(Range("P" amp; i amp; ":U" amp; i)) = 0 Then
              If rngH Is Nothing Then
                   Set rngH = Range("P" amp; i)
              Else
                   Set rngH = Union(rngH, Range("P" amp; i))
              End If
      End If
 Next i
 If Not rngH Is Nothing Then rngH.EntireRow.Select '.Hidden = True
End Sub
 

Он выбирает только строки, которые должны быть скрыты. Если это работает так, как вам нужно, поставьте .Hidden = True вместо Select .

Это должно быть очень быстро, помещая пустые ячейки в диапазон и скрывая EntireRow их сразу, в конце.

Теперь, если ячейки в обработанном диапазоне изменены кодом и некоторые (уже) скрытые ячейки получают значение, не нужно ли сделать их видимыми?

Я закрою свой ноутбук. Если ответ на мой вышеприведенный вопрос «да», пожалуйста, используйте следующий код. Если нет, не используйте его…

 Sub Worksheet_Activate()
 Dim r As Range, i As Long, rngH As Range, rngV As Range

 For i = 9 To 71
      If WorksheetFunction.CountA(Range("P" amp; i amp; ":U" amp; i)) = 0 Then
              If rngH Is Nothing Then
                   Set rngH = Range("P" amp; i)
              Else
                   Set rngH = Union(rngH, Range("P" amp; i))
              End If
      Else
             If rngV Is Nothing Then
                   Set rngV = Range("P" amp; i)
              Else
                   Set rngV = Union(rngV, Range("P" amp; i))
              End If
      End If
 Next i
 If Not rngH Is Nothing Then rngH.EntireRow.Hidden = True
 If Not rngV Is Nothing Then rngV.EntireRow.Hidden = False
End Sub
 

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

1. Я попробовал оба кода, но ни один не сработал. Когда я нажал «Запустить форму Суб/пользователя», ничего не произошло.

2. Что нужно проверить? Вы должны скопировать код (только один) в модуль листа, и он автоматически запустится при активации листа. Это событие для листа!

3. А, понятно. На самом деле я использую кнопку переключения… как я уже упоминал, у меня нулевые знания в VBA, поэтому я приношу извинения, когда спотыкаюсь.

4. @Karla: Теперь, когда у вас есть некоторые знания, не могли бы вы отправить отзыв о своих тестах? Если у вас возникла проблема, пожалуйста, объясните ее. Если нет, то, по крайней мере, вежливо отправить несколько отзывов…

5. @Karla: Я использовал ваш пример кода, как это было. Я могу просто адаптировать его для работы как субмарину, когда вам нужно запустить его… Но вы должны сказать, что вам нужно, и отправить некоторые отзывы.