Vba скрыть пустые строки в excel

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

Как скрыть пустые строки средствами Excel?

Скрыть строки вручную

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

Скрыть строки используя сортировку

Если предстоит скрыть большое количество строк, искать их, что называется «глазами» очень не удобно. В этом случае можно использовать сортировку для того чтобы пустые строки сгруппировались и после этого скрыть их, выделив сразу весь диапазон либо просто вывести за пределы печати при распечатывании документа. Минусом этого метода является то, что очередность строк нарушается.

Программное скрытие макросом VBA

Теперь речь пойдет о том как программно скрыть пустые строки макросом. Возьмем процедуру, при помощи которой мы уже удаляли пустые строки и внесем в её программный код небольшие изменения. Заменим команду Rows(r).Delete на Rows(r).Hidden = True 

Sub Skryt_Pustye_Stroki()          
Dim r As Long, FirstRow As Long, LastRow As Long
FirstRow = ActiveSheet.UsedRange.Row
LastRow = ActiveSheet.UsedRange.Rows.Count - 1 + ActiveSheet.UsedRange.Row
    For r = LastRow To FirstRow Step -1
        If Application.CountA(Rows(r)) = 0 Then
            Rows(r).Hidden = True
        End If
    Next r
End Sub

Для того, чтобы перенести этот программный код на свой компьютер, наведите курсор мыши на поле с программным кодом , нажмите на одну из двух кнопкок knopka_view_source в правом верхнем углу этого поля, скопируйте программный код и вставьте его в модуль проекта на своем компьютере (подробнее о том, как сохранить программный код макроса).

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

Автоматическое скрытие с использованием надстройки

Еще более гибкий инструмент для работы со строками — надстройка, сделанная на базе макроса VBA, позволяющая удалять и скрывать не только пустые строки, но и строки, подходящие под условия пользователей. Для удобства пользователей здесь добавлено диалоговое окно, при помощи которого можно изменять диапазоны действия макроса, выставлять условия и определять другие параметры.

udalenie-i-skrytie-strok-po-usloviyu

Пользователь на свой выбор может как удалить так и скрыть пустые строки. Может удалить либо скрыть строки содержащие либо не содержащие заданный текст. При поиске заданного текста пользователь на свой выбор может учитывать либо не учитывать регистр. Возможен одновременный поиск сразу нескольких значений, введенных через точку с запятой (;). Кроме того пользователь также может ограничивать диапазон действия макроса, задавая номера первой и последней обрабатываемой строки. Надстройка освобождает пользователя от поиска нужного макроса в списке доступных макросов, так как позволяет вызывать диалоговое окно прямо из панели инструментов Excel.

Еще одна надстройка, для скрытия и удаления строк и столбцов, в зависимости от значений ячеек и заданных условий. Работает несколько медленнее, чем первая, так как проверяет не строки, а ячейки, но более гибко. Позволяет удалять не только строки и столбцы, но и ячейки с заданными значениями и с заданным сдвигом.

Vyborochnoe-udalenie-yacheek-po-usloviyu

Другие материалы по теме:

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

Есть файл, в котором надо нажатием кнопки скрыть/отобразить строки, которые пусты визуально (на самом деле в них формулы). Дополнительную сложность представляют столбцы залитые зелёным (в них есть значения, но строки надо скрывать невзирая на них).  

  Спасибо.  

  9,72 Кб в архиве.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

А просто автофильтром?

Я сам — дурнее всякого примера! …

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#3

16.08.2010 21:23:05

может как нибудь так?  
If Value(Cells(i, 2)) > 0 Then Rows(«i:i»).RowHeight = 0  

  или наверное <> «» по первому столбцу  
то был я

Спасибо

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Если именно ВБА, то:  
Public Sub RowHide()  
Dim i As Integer  
For i = 4 To 20  
If Cells(i, 1).Value = «» Then Rows(i).RowHeight = 0  
Next  
End Sub  

  Public Sub RowsShow()  
   Rows(«4:20»).RowHeight = 15  
End Sub

Я сам — дурнее всякого примера! …

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#5

16.08.2010 21:31:48

только через  
Range

Спасибо

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Или, если строго следовать заданию:  
Public Sub RowHide()  
Dim i As Integer  
For i = 4 To 20  
If Cells(i, 1).Value = «» Then Rows(i).Hidden = True  
Next  
End Sub  

  Public Sub RowsShow()  
   Rows(«4:20»).Hidden = False  
End Sub

Я сам — дурнее всякого примера! …

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#7

16.08.2010 21:40:38

ну да это меня клинит

Спасибо

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

Всем спасибо, но это конечно не решение…  
Серёг, Rows(«4:20»).Hidden = False я и сам макрорекордером могу записать :-)  
Количество строк для отображения/скрытия заранее неизвестно, оно получается в результате работы формул, содержащихся в этих строках.  

  Кстати круче было бы не по кнопке скрывать строки, а по заполнению строк, реал тайм.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Так?  
Public Sub RowHide()  
Dim i As Integer, lr As Long  
[A2].CurrentRegion.Select
lr = [A2].CurrentRegion.Rows.Count
For i = 4 To lr  
If Cells(i, 1).Value = «» Then Rows(i).Hidden = True  
Next  
End Sub  
<<<Кстати круче было бы не по кнопке скрывать строки, а по заполнению строк, реал тайм. >>> Это как? Заполнять скрытые строки, после чего они должны отобразиться?

Я сам — дурнее всякого примера! …

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Соответсвенно:  
Public Sub RowsShow()  
Dim lr As Long  
lr = [A2].CurrentRegion.Rows.Count
   Rows(«4:» & lr).Hidden = False  
End Sub  
В прошлом посте строка с селектом лишняя. Забыл удалить.

Я сам — дурнее всякого примера! …

 

или так  
Public Sub RowHide()  
Dim i As Integer  
Dim lLastRow As Long  
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row  
For i = 4 To lLastRow  
If Cells(i, 1).Value = «» Then Rows(i).Hidden = True  
Next  
End Sub

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

{quote}{login=KuklP}{date=16.08.2010 10:36}{thema=}{post}Так?  
Public Sub RowHide()  
…………………………{/post}{/quote}По коду: Да, так, спасибо.  
По «хотелке»: Типа. Если в результате работы формулы в скрытой строке появилось значение — она отображается. И наооборот.  

  ЗЫ Код медленно очень работает, можно к нему прогрессбар привинтить красивый?

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#13

16.08.2010 22:46:44

lr = [A2].CurrentRegion.Rows.Count

  Сергей прокомментируй пж CurrentRegion

Спасибо

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

Ну, для меня разницы никакой.  
Так же правильно и так же медленно…

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#15

16.08.2010 22:55:04

это было ему KuklP  
просто я не знаю что это

Спасибо

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Такая фенька не всегда срабатывает при последних скрытых строках. Я сознательно пошел другим путем.  
Вообще правильней будет:  
lr = [A2].CurrentRegion.Rows.Count + [A2].CurrentRegion.Row — 1
Но в этом конкретном случае такое не важно.  
Если есть желание гляньте тему:

http://www.planetaexcel.ru/forum.php?thread_id=18295    

Там о том же есть.

Я сам — дурнее всякого примера! …

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Public Sub RowHide()  
Dim i As Integer, lr As Long  
Application.ScreenUpdating = False  
lr = [A2].CurrentRegion.Rows.Count + [A2].CurrentRegion.Row — 1
For i = 4 To lr  
If Cells(i, 1).Value = «» Then Rows(i).Hidden = True  
Next  
Application.ScreenUpdating = True  
End Sub  
Так быстрей.  
CurrentRegion — это текущий диапазон, отделенный от других пустыми строками и столбцами.

Я сам — дурнее всякого примера! …

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

{quote}{login=KuklP}{date=16.08.2010 10:59}{thema=}{post}Так быстрей.{/post}{/quote}Ага! То что надо. Спасибо Серёг!  
ЗЫ Задача решена. Как насчёт онлайн изменений?

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Вот так будет работать только если в столбец Н данные будут вводиться вручную.  
При формульных изменениях событие Worksheet_Change не возникает.  
Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Column <> 8 Then Exit Sub  
   If Target.Value <> 0 Then  
       Target.EntireRow.Hidden = False  
   Else  
       Target.EntireRow.Hidden = True  
   End If  
End Sub

Я сам — дурнее всякого примера! …

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Но опять же, как ты внесешь данные в скрытую строку? Ерунда…  
Мож чего позже в голову прийдет.  

  99550

Я сам — дурнее всякого примера! …

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

{quote}{login=KuklP}{date=16.08.2010 11:15}{thema=}{post}Но опять же, как ты внесешь данные в скрытую строку? Ерунда…{/post}{/quote}Я ничего в скрытую строку вносить не собираюсь :-)  
Там есть формулы, которые могут возвращать 0, а могут и не ноль. Так вот если не ноль, то строка должна отобразится, если 0, то остаётся скрытой.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Вот так можно, но… Пробуй.  
В модуль листа:  
Private Sub Worksheet_Calculate()  
RowHide  
End Sub  
В общий модуль:  
Public Sub RowHide()  
Dim i As Integer, lr As Long  
Application.ScreenUpdating = False  
Application.EnableEvents = False  
lr = [A2].CurrentRegion.Rows.Count + [A2].CurrentRegion.Row — 1
For i = 4 To lr  
If Cells(i, 9).Value = 0 Then  
Rows(i).Hidden = True  
Else  
Rows(i).Hidden = False  
End If  
Next  
Application.EnableEvents = True  
Application.ScreenUpdating = True  
End Sub  
Но будет дрыгаться на каждый чих.  

  97337

Я сам — дурнее всякого примера! …

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

А без Worksheet_Calculate() нельзя обойтись?  
Чтоб только при изменениях, а не при каждом пересчёте?

 

yura68

Пользователь

Сообщений: 17
Регистрация: 01.01.1970

Добрый день. Как  при помощи VBA  подкорректировать ,  
что-бы можно было скрыть-отобразить незаполненные ячейкив строках  
По одной  расходной накладной можно отпустить  
несколько товара и ячейки A10,B12  нет необходимости заполнять  

  Т.Е невсегда  ячейки А10,  B12   могут быть заполнены  

  я в ячейках A10:A13  прописал знак =»» — работает  
После  каждого открытия книги нужно прописывать знак =»» -это неудобно  
Спасибо.  
Юра

 

k61

Пользователь

Сообщений: 2441
Регистрация: 21.12.2012

 

yura68

Пользователь

Сообщений: 17
Регистрация: 01.01.1970

Спасибо.Вариант отличный. А если все строки заполнены,то выдает ошибку, так как нет пустых строк. А как устранить эту ошибку?  
Спасибо.

 

k61

Пользователь

Сообщений: 2441
Регистрация: 21.12.2012

 

Diman1780

Пользователь

Сообщений: 3
Регистрация: 01.01.1970

Есть файл, в  котором есть 2 кнопки : «Скрыть» и «Отобразить».    
Условия выбираются фильтром, а затем кнопки скрывают пустые ячейки, если таковые есть в диапазоне, либо отображают все ячейки  

  Писал макрос не я, потому ничего сказать о его содержимом не могу. Всё прекрасно работало. Добавлял строки и столбцы в таблицу….но в какой то момент просто перестал работать. Хотя в содержимое макроса не лазил нигде, кроме прописывания диапазона в котором и должно проверяться наличие/отсутствие содержимого ячеек.  

  В данный момент скрываются абсолютно все солбцы(не важно пустые или нет), а строки наоборот: скрываются только на части диапазона.  
Прошу помощи!!! Заранее благодарен, если здесьобитающие ГУРУ просветят меня в моей безграмотности!  
<EM><STRONG>Файл удален</STRONG> — велик размер — [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>

 

IGGI

Пользователь

Сообщений: 15
Регистрация: 01.01.1970

{quote}{login=Serge 007}{date=17.08.2010 12:03}{thema=}{post}А без Worksheet_Calculate() нельзя обойтись?  
Чтоб только при изменениях, а не при каждом пересчёте?{/post}{/quote}  

  Скажите пожалуйста, удалось решить проблему с отображением только тех строк, в которых выводится визуальная информация, с учетом вышеозвученного Serge 007?

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#30

06.09.2012 19:13:34

Как понять — визуальная информация?

Исходные коды макросов для выделения, удаления, скрытия и добавления пустых строк в таблицу Excel по условию пользователя.

Как выделить все пустые строки макросом

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

Таблица бюджета.

Нам необходимо удалить все пустые строки в таблице. Для этого сначала необходимо их выделить. Если выделять вручную, то потребуется много времени и сил. Кроме того, нужно еще быть уверенным что строка действительно является пустой, чтобы вместе с ней не удалить важную информацию из бюджета или формулу. Для автоматического решения данной задачи лучше написать свой макрос, который сам проверит и выделит все пустые строки в таблице годового бюджета.

Откройте редактор Visual Basic (ALT+F11):

редактор Visual Basic.

И воздайте в нем новый модуль для текущей книги «Insert»-«Module», а потом запишите в него следующий VBA-код макроса:

Sub SelectLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.Select
End If
End Sub

VBA-код макроса.

Теперь если нам нужно автоматически выделить все пустые строки в таблице бюджета перед тем как их удалить, выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«SelectLine»-«Выполнить». В результате выделяться все пустые ячейки только для пустых строк внутри исходной таблицы.

Пример работы первого VBA-кода:

Выделить пустые строки.

Пустые строки, которые находиться под последними заполненными ячейками не будут выделены. Теперь для удаления выделенных строк пользователю осталось только выбрать инструмент: «ГЛАВНАЯ»-«Ячейки»-«Удалить»-«Удалить строки с листа». Или нажать комбинацию горячих клавиш CTRL+=. А после в появившемся окне «Удаление ячеек» выбрать опцию «строку» и нажать ОК.

Вначале кода присваиваем для переменной diapaz1 диапазон ячеек в границах между A1 и последней используемой ячейкой на рабочем листе Excel.

Примечание. Последняя используемая ячейка на листе — это любая ячейка для, которой были выполнены любые изменения: ввод значений, изменение формата границ или цвета фона и т.п.

Далее в цикле проверяются все строки в этом диапазоне, каждая по отдельности, на количество непустых ячеек. В том случаи если метод CountA возвращает значение 0, то адреса этих ячеек дополняют несмежный диапазон в переменной diapaz2 еще на одну пустую строку.

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



Макрос для удаления пустых строк

Как удалить строку макросом? Если нужно сделать так чтобы макрос автоматически не только выделял, но и сам удалял пустые целые и смежные диапазоны ячеек без использования других инструментов, тогда в конце кода для переменной diapaz2.Select следует изменить метод на [Delete]:

diapaz2.[Delete]

Удалить:

Sub DelLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.[Delete]
End If
End Sub

Пример второго VBA-кода:

Пример второго VBA-кода удалить.

Макрос для скрытия пустых строк

Как скрыть пустые строки макросом? Но если вам нужно не удалить, а только скрыть (например, при подготовке документа на печать), тогда эту строку кода следует модифицировать несколько иначе:

diapaz2.EntireRow.Hidden = True

Скрыть:

Sub HidLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.EntireRow.Hidden = True
End If
End Sub

Пример третьего VBA-кода:

Пример третьего VBA-кода скрыть.

Добавление строк макросом

Как вставить строки макросом? Если мы изменим код в этом же месте как показано ниже, то получиться инструмент для добавления и вставки строк после пустых:

diapaz2.[Insert]

Добавить:

Sub AddLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.[Insert]
End If
End Sub

Пример четвертого VBA-кода:

Пример четвертого VBA-кода добавить.

Если же вы хотите, чтобы макрос работал исключительно только для пустых строк предварительно выделенного определенного диапазона листа перед запуском макроса, то в начале макроса следует изменить строку создания экземпляра объекта для переменной diapaz1, на:

Set diapaz1 = Selection

Читайте также: Как выделить столбцы в Excel макросом.

Внимание! Следует помнить о том, что если таким образом создавать экземпляр объекта для переменной diapaz1, то тогда нельзя перед запуском макроса выделять все ячейки листа или все ячейки любого столбца. Иначе это затормозит программу Excel, так как один лист содержит аж 1 048 576 строк и тогда они все будут обрабатываться макросом, а пользователь будет ждать.

I use this code to create a new sheet and list all the sheet names in the workbook with empty rows in between them and then it hides all the empty rows in between the sheet name.

But its taking over over a min to complete is there a more efficient way of doing this?

Sub ListAllSheetNames()
'Disabling the following to speed up the vba code
ActiveSheet.DisplayPageBreaks = False
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False

'code to create new sheet and list all sheet names in workbook
Dim xWs As Worksheet
On Error Resume Next
xTitleId = "All Sheet Names"
Application.Sheets(xTitleId).Delete
Application.Sheets.Add.Index
Set xWs = Application.ActiveSheet
xWs.Name = xTitleId
For i = 2 To Application.Sheets.Count
  'Edit this to adjust the row spacing, number after *
  xWs.Range("A" & ((i - 2) * 18) + 1) = Application.Sheets(i).Name
Next

'Hides all empty rows
Set Rng = Range("A1", Range("A15000").End(xlUp))

For Each cel In Rng
  If Not cel.Value > 0 Then
    cel.EntireRow.Hidden = True
  End If
Next cel

Range("A1").Select

'UnDisabling
ActiveSheet.DisplayPageBreaks = True
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Rdster's user avatar

Rdster

1,8461 gold badge14 silver badges30 bronze badges

asked Dec 1, 2016 at 18:01

luke's user avatar

Instead of the brute-force approach:

For Each cel In Rng

    If Not cel.Value > 0 Then

        cel.EntireRow.Hidden = False

    End If
Next cel

You should be able to do simply:

Rng.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True

Using SpecialCells(xlCellTypeBlanks) should be nearly instantaneous (although even in my tests,it only took a few seconds to do the brute force iteration).

answered Dec 1, 2016 at 18:10

David Zemens's user avatar

David ZemensDavid Zemens

52.8k11 gold badges79 silver badges129 bronze badges

1

The problem is that there are 16384 cells in each row and you are iterating through 16384 * (Sheet Count - 1) * 18 cells

For Each cel In Rng

    If Not cel.Value > 0 Then

        cel.EntireRow.Hidden = True

    End If
Next cel

This is better

For Each rw In Rng.Rows

    If Not rw.Cells(1,1).Value > 0 Then

        rw.Hidden = True

    End If
Next rw

I would hide the rows as I add the Sheet Names:

Sub ListAllSheetNames()
    Const xTitleId = "All Sheet Names"
    Application.ScreenUpdating = False

    'code to create new sheet and list all sheet names in workbook
    Dim xWs As Worksheet, ws As Worksheet
    Dim i As Long
    On Error Resume Next
    DeleteWorksheet xTitleId

    Application.Sheets.Add

    Set xWs = Application.ActiveSheet
    xWs.Name = xTitleId
    i = 1
    For Each ws In Sheets
        xWs.Cells(i, 1).Value = ws.Name
        xWs.rows(i + 1).Resize(17).Hidden = True
        i = i + 18
    Next

    Range("A1").Select

    Application.ScreenUpdating = True
End Sub

Sub DeleteWorksheet(SheetName As String)
    Application.DisplayAlerts = False 'Resets when the Sub Exits
    On Error Resume Next 'Resets when the Sub Exits
    Sheets(SheetName).Delete
End Sub

answered Dec 1, 2016 at 18:28

0

-4 / 0 / 0

Регистрация: 21.04.2021

Сообщений: 157

1

Excel

Скрыть пустые строки на листе

28.02.2023, 13:50. Показов 477. Ответов 13


Студворк — интернет-сервис помощи студентам

Добрый день. Можете помоч скрит пустых строк с формулой или макросом в 1-листе.



0



2630 / 1636 / 744

Регистрация: 23.03.2015

Сообщений: 5,141

28.02.2023, 14:21

2



1



-4 / 0 / 0

Регистрация: 21.04.2021

Сообщений: 157

28.02.2023, 14:30

 [ТС]

3

Тут все вруную. Я попробоваль много вариантов но не получилос там в файле есть макрос Удалить_пустых_строк() но он удаляеть пустых строк везде. Мне надо чтоб он работаль в диапазоне строк 62:90 и 110:139. Не удалил а скриль строк в этом диапазоне.



0



MikeVol

Ученик

87 / 69 / 16

Регистрация: 01.04.2020

Сообщений: 247

28.02.2023, 15:18

4

ulugbek tulakov, Здравствуйте. Пробуйте:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
    Dim rng As Range
    Dim i As Long
    Set rng = Range("62:90")
 
    For i = rng.Rows.Count To 1 Step -1
 
        If WorksheetFunction.CountA(rng.Rows(i)) = 0 Then
            rng.Rows(i).Hidden = True
        End If
 
    Next i

На форуме полно тем с таким же вопросом. Поиск рулит.

P.S. Забыл сказать что остальные строки (110:139) по аналогии сделайте сами.



1



Jack Famous

531 / 164 / 27

Регистрация: 10.05.2021

Сообщений: 535

Записей в блоге: 7

28.02.2023, 15:37

5

Ещё вариант по мотивам выше)))

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub t()
Dim x, r&
    For Each x In Array("62-90", "110-139")
        x = Split(x, "-")
 
        For r = x(0) To x(1)
            If Not Rows(r).Hidden Then
                If WorksheetFunction.CountA(Rows(r)) = 0 Then Rows(r).Hidden = True
            End If
        Next r
    Next x
End Sub

MikeVol, это не удаление и можно сверху идти, как обычно



0



-4 / 0 / 0

Регистрация: 21.04.2021

Сообщений: 157

28.02.2023, 16:05

 [ТС]

6

Jack Famous, Спасибо. Но не работает вы прбовали в моём файле. Там в строках есть формули по этому можеть не работать? Если из-за формул не работаеть как быть.



0



Jack Famous

531 / 164 / 27

Регистрация: 10.05.2021

Сообщений: 535

Записей в блоге: 7

28.02.2023, 16:22

7

Цитата
Сообщение от ulugbek tulakov
Посмотреть сообщение

Но не работает вы прбовали в моём файле

Так у вас там 0 стоят (строка не считается пустой), которые просто скрыты форматом ячейки

Считаем ячейки с нолями пустыми

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub t()
Dim x, arr, r&, c&
    For Each x In Array("62-90", "110-139")
        x = Split(x, "-")
 
        For r = x(0) To x(1)
            If Rows(r).Hidden Then GoTo nx
            arr = Intersect(Rows(r), ActiveSheet.UsedRange).Value2
 
            For c = 1 To UBound(arr, 2)
                If Len(arr(1, c)) <> 0 Then If arr(1, c) <> 0 Then GoTo nx
            Next c
 
            Rows(r).Hidden = True
nx:     Next r
    Next x
End Sub



1



-4 / 0 / 0

Регистрация: 21.04.2021

Сообщений: 157

28.02.2023, 16:26

 [ТС]

8

Файле 1-листа имееть 3-форми 8, 8а и 8б там поставиться оценки студентам из предмета каторий сдаль экзамен. Форми 8а и 8б для неуспеваюших студентам. В конча листов есть семестровка он берёт оценки из листов.Сейчас семестровка берет оценки только с 8-форми. Неуспеваемих студентов есть оценка всех формах. Поэтому сделать формули чтоб в семестовку отобразилься самий максималний оценка студента из всех формах (8, 8а и 8б).



0



531 / 164 / 27

Регистрация: 10.05.2021

Сообщений: 535

Записей в блоге: 7

28.02.2023, 16:28

9

ulugbek tulakov, я ни черта не понял
В вашем файле мой код прекрасно отработал



0



-4 / 0 / 0

Регистрация: 21.04.2021

Сообщений: 157

28.02.2023, 17:03

 [ТС]

10

Цитата
Сообщение от Jack Famous
Посмотреть сообщение

Так у вас там 0 стоят (строка не считается пустой), которые просто скрыты форматом ячейки

Супер все работаль

Добавлено через 21 минуту
Например студент Алексей первий раз не пришёл в экзамен и у него в место оценки в ячейке G16 поставили «kelmagan». После пересдачи он брал «2» (двойку) ячейка G65. У него остался последний шанс и он этот раз сдаль экзамен на «3» (тройку) ячейка G114.
В семестровку из этих оценках отобразилься максималний 3 [3]. Число в квадратним скобке обозначаеть что сдуденть сдал экзамен на 3-й раз или в форме 8б. В квадратним скобке можеть быть число от 1 до 3 смотря в каком попытке он сдал экзамен.
Для этого надо формула. Помогите.

Добавлено через 5 минут
Jack Famous, Можете памоч.



0



531 / 164 / 27

Регистрация: 10.05.2021

Сообщений: 535

Записей в блоге: 7

28.02.2023, 17:09

11

Цитата
Сообщение от ulugbek tulakov
Посмотреть сообщение

Для этого надо формула. Помогите.

создайте новую тему. Вопрос этой не касается



1



Ученик

87 / 69 / 16

Регистрация: 01.04.2020

Сообщений: 247

28.02.2023, 19:42

12

ulugbek tulakov, а мой вариант из поста #4 не подошёл?
Jack Famous, я знаю что это не удаление. Первое что вспомнил так как в своё время тоже искал решение на эту тему. ТС просил конкретно скрыть строки 62:90 и 110:139 вот и дал пример. По всем строкам листа я не пробежался а именно только эти строки указал. Да и сам файл я не смотрел.



0



-4 / 0 / 0

Регистрация: 21.04.2021

Сообщений: 157

01.03.2023, 04:40

 [ТС]

13

Jack Famous,

Цитата
Сообщение от MikeVol
Посмотреть сообщение

а мой вариант из поста #4 не подошёл?

Не подошёл. Но также спасибо



0



531 / 164 / 27

Регистрация: 10.05.2021

Сообщений: 535

Записей в блоге: 7

01.03.2023, 09:22

14

Цитата
Сообщение от MikeVol
Посмотреть сообщение

мой вариант из поста #4 не подошёл?

так я свой на основе вашего и делал. У ТСа нули в строках (которые нужно считать пустыми) и СЧЁТЗ/СЧИТАТЬПУСТОТЫ (в том виде) не подойдут

Цитата
Сообщение от MikeVol
Посмотреть сообщение

я знаю что это не удаление

я прост на всякий случай)))



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

01.03.2023, 09:22

14

Like this post? Please share to your friends:
  • Vba скрипты для word
  • Vba скрипты для excel что это
  • Vba скрипт для excel
  • Vba скопировать строку word
  • Vba скопировать область excel