Страницы: 1
RSS
Макрос для удаления скрытых столбцов и строк
 
Подскажите, нужен макрос для удаление скрытых строк и столбцов по всей книге. Вариант "вставить значения" не подходит, т.к. в книге много листов и занимает большое количество времени. Использую Ексель 2019
 
Код
Sub Macto1()
Dim rCell As Range, n As Long
    For n = 1 To Sheets.Count
        For Each rCell In Sheets(n).UsedRange.Rows
            If rCell.Hidden Or rCell.Height = 0 Then rCell.EntireRow.Delete
        Next
    Next
End Sub


Для столбцов по аналогии.
 
Юр, а сдвиг не помешает?
По вопросам из тем форума, личку не читаю.
 
Не должен - мы же не отталкиваемся "до последней строки", а по диапазону )
 
Цитата
БМВ написал:
Юр, а сдвиг не помешает?
Тоже об этом подумал...
Был под "рукой" пример с фильтром, проверил - работает корректно.
 
ну в любом случае будет долго. Как минимум события отключить, да и прорисовку. А по большому счету UNION.
По вопросам из тем форума, личку не читаю.
 
Миш, про события и обновления всё верно. Но я ведь сам принцип показал )
 
Цитата
Юрий М написал:
Но я ведь сам принцип показал )
так и я не особо критикую :-) .

Хотя нет, критикую, если две и более подряд, то удалит не все. Так что.....
Изменено: БМВ - 17.07.2020 22:41:09
По вопросам из тем форума, личку не читаю.
 
В "боевых" условиях нужно удалять скрытые строки методом Владимира (ZVI) через сортировку строк. Можно так:
Код
Option Explicit

' Удаляет из листа Excel скрытые строки.
' Возвращает число удаленных строк
' - r: прямоугольный диапазон (объект, имя, адрес), строки которого анализируются
Function RangeDeleteHiddenRows(ByVal r) As Long
    Dim rg As Range, sh As Worksheet, arr(), i As Long, row As Range, n As Long, rg1 As Range
    If IsObject(r) Then
        Set rg = r
    Else
        Set rg = Range(r)
    End If
  
    Set rg = rg.CurrentRegion
    Set sh = rg.Parent
    ReDim arr(1 To rg.Rows.Count, 1 To 1)   ' для сортировки
    For Each row In rg.Rows
        i = i + 1
        If row.EntireRow.Hidden Then
            n = n + 1 ' счетчик скрытых строк
            arr(i, 1) = 10000000 + i
        Else
            arr(i, 1) = i
        End If
    Next row
  
    If n = 0 Then
        Exit Function
    End If
  
    If rg.Column + rg.Columns.Count > sh.Columns.Count Then
        Exit Function     ' последний столбец листа заполнен
    End If
  
    Set rg = rg.Resize(, rg.Columns.Count + 1) ' захватываем столбец
    Set rg1 = rg.Columns(rg.Columns.Count)
    If sh.FilterMode Then
        rg.AutoFilter   ' убираем автофильтр
    End If
  
    rg1.Value = arr
    rg.Sort rg1
    rg1.ClearContents
    rg.Offset(rg.Rows.Count - n).Resize(n).EntireRow.Delete
    RangeDeleteHiddenRows = n
End Function

' Удаляет скрытые строки из всех листов книги
Sub DeleteHiddenRows()
  Dim sh As Worksheet
  For Each sh In ActiveWorkbook.Worksheets
    RangeDeleteHiddenRows sh.UsedRange
  Next sh
End Sub
Изменено: sokol92 - 18.07.2020 18:53:15
Владимир
 
Цитата
БМВ написал:
если две и более подряд, то удалит не все.
Во пристал! ))
Ну тогда перебором снизу вверх. А вообще это не по феншую - скрывать соседние строки.
Страницы: 1
Наверх