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

Информация о материале
Категория: Макросы Excel

Опубликовано: 08 апреля 2012

В одной из предыдущих статей мы удаляли пустые строки в таблицах Excel. Еще одна из достаточно часто встречающихся задач при обработке табличных данных — удаление скрытых строк. Перейдем к её решению с помощью макроса, написанного на Visual Basic for Applications.

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

Sub Udalenie_Skrytyh_Strok()
      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 Rows(r).Hidden = True Then Rows(r).Delete
            Next r
End Sub

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

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

 

Всем Добрый день! Подскажите, пожалуйста, умные люди, как программно удалить скрытые строки? спасибо

 

ZVI

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

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

—  
‘ Удаление скрытых строк во всем листе  
Sub KillHiddenRows()  
For Each x In ActiveSheet.Rows  
If x.Hidden Then x.Delete  
Next  
End Sub  

  —  
‘ Удаление используемых скрытых строк или строк с нулевой высотой  
Sub KillUsedHiddenThinRows()  
Dim x  
For Each x In ActiveSheet.UsedRange.Rows  
If x.Hidden Or x.Height = 0 Then x.EntireRow.Delete  
Next  
End Sub  
—  
ZVI

 

Спасибо за ответ, то проблема в том, что код работает, но пропускает строки, т.е. не все спрятанные строки удаляются…

 

Serge

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

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

Если бы выложили пример XLS, в котором скрытые строки не удаляются, то нам было бы легче Вам помочь…  

  Совет: тут на форуме к ответу можно прикрепить файл…

 

{quote}{login=blondinka}{date=01.04.2008 09:10}{thema=удаление скрытых строк}{post}Спасибо за ответ, то проблема в том, что код работает, но пропускает строки, т.е. не все спрятанные строки удаляются…{/post}{/quote}  
попробуйте заменить ActiveSheet.UsedRange.Rows  

  на range(cells(1,1),Cells.SpecialCells (xlLastCell)).rows

 

Спасибо всем за содействие! Первый раз на форуме, буду чаще заходить :) В общем-то у меня была задача, где ненужные строки было необходимо удалить, циклом For…Next не получилось, т.к. удалялись не все строки, задача была срочная, поэтому я их просто спрятала, а теперь я доработала этот код, чтобы ненужное удалялось, и необходимость удаления спрятанных строк отпала :)

 

puz

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

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

У меня часто появляется необходимость удалить в документе скрытые строки. В принципе макрос работает, но мне пришлось его запускать 3 раза подряд, т.к. после первых двух запусков в итоге были удалены не все скрытые строки. После третьего запуска все стало ОК. Все же почему не срабатывает с первого раза? Вариант с измененной строкой от ck’y так же не срабатывает с первого раза.

 

Юрий М

Модератор

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

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

Попробуйте обычный перебор строк, но только СНИЗУ ВВЕРХ!

 

puz

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

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

The_Prist, гениально!  
Спасибо. Теперь все получается с первого раза

 

слэн

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

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

я уже где-то спрашивал( и высказывал свое мнение)..  

  строки с нулевой высотой автоматически становятся скрытыми.. нет?  

  и уже приводил наиболее быстрый(imho) алгоритм удаления — через specialcells с areas

 

Юрий М

Модератор

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

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

Слэн, я читал, что это две большие разницы.

 

слэн

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

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

не знаю не знаю  

  простейший макрос:  
Sub t()  
Rows(1).RowHeight = 1 ‘0  
End Sub  

  и просмотр свойств rows(1)  

  показывает синхронность этих изменений..

 

Юрий М

Модератор

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

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

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

 

слэн

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

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

 

слэн

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

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

вот вопрос верить опыту или книге? :)  

  может найдете ссылочку?

 

Юрий М

Модератор

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

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

 

слэн

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

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

но все равно самое быстрое — specialcells и перебирать areas  

  о есть ограничение на specialcells..  

  которое врядли помешает..  

  но и разница во времени будет невелика.. при небольшом количестве строк

 

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

 

Serg_zab

Гость

#19

29.02.2012 23:11:11

The_Prist, подскажите какой смысл несет  ActiveSheet.UsedRange.Row — 1  

  в Вашем посте  

  Попробуйте так:  

  Sub KillHiddenRows()  
Dim li as long  
For li = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count to 1 Step -1  
If rows(li).Hidden Or rows(li).Height = 0 Then rows(li).Delete  
Next li  
End Sub

Содержание:

  1. Удалить все скрытые строки и столбцы в Excel
  2. Удалите скрытые строки и столбцы с помощью VBA
  3. Со всего рабочего листа (использованный диапазон)
  4. Из определенного диапазона ячеек

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

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

И, если у вас много таких скрытых строк / столбцов, может быть сложно найти и удалить эти скрытые строки и столбцы (в случае, если они вам не нужны).

В этом уроке я покажу вам несколько способов легко удалить скрытые строки и столбцы в Excel.

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

Итак, приступим!

Удалить все скрытые строки и столбцы в Excel

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

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

Ниже приведены шаги по удалению всех скрытых строк и столбцов из книги в Excel:

  1. Нажмите на опцию File
  2. В параметрах слева нажмите «Информация».
  3. Нажмите на опцию «Проверить наличие проблем».
  4. Нажмите на опцию «Проверить документ». Откроется диалоговое окно «Инспектор документов».
  5. В диалоговом окне «Инспектор документов» нажмите кнопку «Проверить». Это проверит всю книгу и предоставит вам информацию о книге.
  6. Прокрутите вниз до параметра «Скрытые строки и столбцы». Вы увидите, что он показывает общее количество скрытых строк и столбцов, найденных в книге.
  7. Нажмите кнопку «Удалить все».

Вышеупомянутые шаги удалят все скрытые строки и столбцы в книге.

Как удалить все скрытые строки и столбцы в Excel

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

Как удалить все скрытые строки и столбцы в Excel

Если нет скрытых строк и столбцов, вы увидите зеленую галочку перед параметром «Скрытые» и «Строки и столбцы» (в диалоговом окне «Инспектор документов»).

Помимо скрытых строк и столбцов, диалоговое окно «Инспектор документов» также предоставляет вам много другой полезной информации, такой как количество комментариев, или скрытые рабочие листы, или встроенные документы и т. Д.

Примечание. Вы не можете отменить изменения, внесенные Инспектором документов. Поэтому убедитесь, что у вас есть резервная копия исходных данных (на случай, если она вам понадобится в будущем).

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

Но если вы хотите удалить его только на определенном листе или в определенном диапазоне, вы не можете использовать эту опцию.

В этом случае вы можете использовать описанный далее метод VBA.

Удалите скрытые строки и столбцы с помощью VBA

Если у вас есть только несколько скрытых строк и столбцов, их можно отобразить вручную, а затем удалить.

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

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

Со всего рабочего листа (использованный диапазон)

Хотя я могу заставить код VBA проверять весь лист, начиная с номера последней строки и номера последнего столбца на листе, это было бы пустой тратой ресурсов.

Лучше всего посмотреть, какой диапазон используется, а затем проверять только этот используемый диапазон на наличие скрытых строк и столбцов.

Ниже приведен код VBA, который удалит все скрытые строки в используемом диапазоне:
Sub DeleteHiddenRows () Dim sht As Worksheet Dim LastRow Set sht = ActiveSheet LastRow = sht.UsedRange.Rows (sht.UsedRange.Rows.Count) .Row For i = LastRow To 1 Step -1 If Rows (i) .Hidden = True Затем Rows (i) .EntireRow.Delete Next End Sub
Приведенный выше код VBA сначала определяет номер последней строки в используемом диапазоне и назначает этот номер строки переменной «LastRow».

Этот номер последней строки затем используется в цикле For Next, где он начинается с последней строки и проверяет, скрыта она или нет.

Если он скрыт, вся строка удаляется. А если он не скрыт, код оставляет эту строку как есть и перемещается в строку над ней. Этот цикл проверяет все строки и удаляет все скрытые строки, которые встречаются в процессе.

Если вы хотите удалить все скрытые столбцы в используемом диапазоне, используйте приведенный ниже код VBA:
Sub DeleteHiddenColumns () Dim sht As Worksheet Dim LastCol as Integer Set sht = ActiveSheet LastCol = sht.UsedRange.Columns (sht.UsedRange.Columns.Count) .Column For i = LastCol To 1 Step -1 If Columns (i) .Hidden = True Then Columns (i) .EntireColumn.Delete Next End Sub
Это снова работает таким же образом, где вместо строк мы проверяем столбцы.

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

А если вы хотите иметь код, который удалял бы все скрытые строки, а также скрытые столбцы, используйте приведенный ниже код VBA:
Sub Удалить Columns.Count) .Column For i = LastRow To 1 Step -1 Если Rows (i) .Hidden = True Then Rows (i) .EntireRow.Delete Next For i = LastCol To 1 Step -1 If Columns (i) .Hidden = True Then Columns (i) .EntireColumn.Delete Next End Sub
Это просто комбинированный код для строк и столбцов, работающий одинаково.

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

Обратите внимание, что вам нужно поместить этот код VBA в обычный модуль в редакторе Visual Basic. Затем вы можете запустить код непосредственно из редактора VB, используя диалоговое окно макроса или добавив этот макрос на панель быстрого доступа.

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

Из определенного диапазона ячеек

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

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

Ниже кода VBA, который сделает это:
Sub DeleteHiddenRowsColumns () Dim sht As Worksheet Dim Rng As Range Dim LastRow As Integer Dim RowCount As Integer Set sht = ActiveSheet Set Rng = Range ("A1: K200") RowCount = Rng.Rows.Count LastRow = Rng.Rows (Rng. Rows.Count) .Row ColCount = Rng.Columns.Count LastCol = Rng.Columns (Rng.Columns.Count) .Column For i = LastRow To LastRow - RowCount Step -1 If Rows (i) .Hidden = True Then Rows ( i) .EntireRow.Delete Next For j = LastCol To LastCol - ColCount Step -1 Если Columns (j) .Hidden = True Then Columns (j) .EntireColumn.Delete Next End Sub
В приведенном выше коде я указал диапазон как A1: K200.

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

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

Вот как можно удалить скрытые строки и столбцы в Excel.

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

Надеюсь, вы нашли этот урок полезным!

This macro will delete hidden rows from every worksheet in an entire workbook. However, note that this will only delete one hidden row from a group at once. This means that if you have rows 3-9 hidden on a sheet and rows 45-55 hidden on the same sheet, the last hidden rows (row 9 and row 55) will be deleted on that worksheet. This means that the entire section of rows 3-9 etc. will not be deleted in one pass. Obviously if you are working with workbook that relies heavily on hidden data and hidden rows, this might not be the best macro.

Where to install the macro:  Module

Delete Hidden Rows

Sub DeleteHiddenRows_Workbook()

'This Microsoft Excel Macro will remove hidden rows from
'all worksheets in a workbook.

For i = 1 To Worksheets.Count
If Worksheets(i).Visible Then
Worksheets(i).Select
ActiveCell.SpecialCells(xlLastCell).Select
k = ActiveCell.Row
For j = 1 To k
If Rows(j).Hidden Then
Rows(j).Hidden = False
Rows(j).Delete
End If
Next j
End If
Next i
If Worksheets(1).Visible Then Worksheets(1).Select

End Sub


Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons
50+ Hours of Instruction
200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Similar Content on TeachExcel

Delete Duplicate Rows

Macro: This macro will delete rows that appear twice in a list or worksheet. If two cells are…

Delete Blank Rows in Excel

Macro: This is a macro which will delete blank rows in excel. This version will delete an entire …

Delete All Comments in a Worksheet in Excel Macro

Macro: Excel macro that will delete all of the comment contained within the active or current wor…

Delete Hidden Worksheets

Macro: This macro will delete all hidden worksheets within a workbook. When you run this macr…

Count the Visible Rows in a Filtered List in Excel

Tutorial:
How to use the COUNT or COUNTA function on a filtered list of data so that hidden rows ar…

Average the Visible Rows in a Filtered List in Excel

Tutorial:
Average the results from a filtered list in Excel. This method averages only the visible …

How to Install the Macro

  1. Select and copy the text from within the grey box above.
  2. Open the Microsoft Excel file in which you would like the Macro to function.
  3. Press «Alt + F11» — This will open the Visual Basic Editor — Works for all Excel Versions.
     Or For other ways to get there, Click Here.
  4. On the new window that opens up, go to the left side where the vertical pane is located. Locate your Excel file; it will be called VBAProject (YOUR FILE’S NAME HERE) and click this.
  5. If the Macro goes in a Module, Click Here, otherwise continue to Step 8.
  6. If the Macro goes in the Workbook or ThisWorkbook, Click Here, otherwise continue to Step 8.
  7. If the Macro goes in the Worksheet Code, Click Here, otherwise continue to Step 8.
  8. Close the Microsoft Visual Basic Editor window and save the Excel file. When you close the Visual Basic Editor window, the regular Excel window will not close.
  9. You are now ready to run the macro.

Similar Content

Delete Duplicate Rows

Macro: This macro will delete rows that appear twice in a list or worksheet. If two cells are…

Delete Blank Rows in Excel

Macro: This is a macro which will delete blank rows in excel. This version will delete an entire …

Delete All Comments in a Worksheet in Excel Macro

Macro: Excel macro that will delete all of the comment contained within the active or current wor…

Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons

50+ Hours of Video

200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

0 / 0 / 0

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

Сообщений: 8

1

Удаление скрытых строк

24.12.2014, 10:09. Показов 3914. Ответов 4


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

Добрый день!
Как в макросе прописать удаление скрытых строк, не проходя циклом по всем строкам листа (объем листа более 20 000 строк и это очень долго)?

Или, если это невозможно, то такие вопросы:
1) Можно как-то записать противоположный выделенному диапазон (например, выделено 2-3 и 5 строки, а запишет соответственно 1, 4 и больше 5?

Спасибо заранее!



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

24.12.2014, 10:09

Ответы с готовыми решениями:

Счетчик строк автофильтра (без скрытых строк)
Помогите, пожалуйста, поправить код.

Требуется, посчитать только видимые строки в таблице,…

Суммирование скрытых строк
В первой строке значение — 1
Во второй строке — 2
В третей строке — 4
В четвёртой строке, сумма…

Удаление строк
Здравствуйте!
Подскажите в чем может быть проблема. Делаю макрос чтобы он удалял строки в которых…

удаление строк
мне надо удалить строки. Посмотрел как это делает сам excel через макрос:

Sub delete1()

4

Модератор

Эксперт MS Access

11342 / 4661 / 748

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

Сообщений: 13,508

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

24.12.2014, 10:57

2

не проходя циклом по всем строкам листа (объем листа более 20 000 строк и это очень долго)?

Выложите макрос, коим вы это делаете
может макрос не оптимизирован

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



0



LoMANko

0 / 0 / 0

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

Сообщений: 8

24.12.2014, 11:16

 [ТС]

3

Выложите макрос, коим вы это делаете
может макрос не оптимизирован

макрос брал вроде даже с этого форума (мой вариант работал еще дольше)

Visual Basic
1
2
3
4
5
6
7
8
Dim lR As Long, ii As Long
lR = ActiveSheet.UsedRange.Rows.count + ActiveSheet.UsedRange.Row - 1
Application.ScreenUpdating = False
For ii = lR To 1 Step -1
If Rows(ii).Hidden Then Rows(ii).Delete
Next
Application.ScreenUpdating = True
ActiveSheet.ShowAllData

Вот такой код. Файл с 5 тысячами строк обрабатывает минут 5 (вес файла 12 мб).. Собственно 20 тысяч еще дольше.



0



SlavaRus

1121 / 229 / 36

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

Сообщений: 698

24.12.2014, 12:11

4

Лучший ответ Сообщение было отмечено LoMANko как решение

Решение

Попробуй так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
Public Sub proba()
    Dim TempRange As Range
    With ThisWorkbook.Worksheets(1)
        Set TempRange = .UsedRange.SpecialCells(xlCellTypeVisible)  ' Запоминаем диапазон видимых ячеек
        .ShowAllData                                                ' Все ячейки видимые
        TempRange.EntireRow.Hidden = True                           ' Скрываем  строки
        .UsedRange.SpecialCells(xlCellTypeVisible).Delete           ' Удаляем видимые
        .UsedRange.EntireRow.Hidden = False                         ' Показываем оставшиеся
    End With
End Sub



1



0 / 0 / 0

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

Сообщений: 8

24.12.2014, 17:20

 [ТС]

5

SlavaRus, Спасибо.. Так гораздо оперативнее работает.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

24.12.2014, 17:20

5

Понравилась статья? Поделить с друзьями:
  • Макрос excel удаление пустой строки
  • Макрос excel удаление папок
  • Макрос excel типы данных
  • Макрос excel текущая папка
  • Макрос excel считает количество