Удаление скрытых строк в выбранном диапазоне - PullRequest
0 голосов
/ 20 июня 2020

Я хочу удалить все скрытые строки из выбранного диапазона. Здесь выбранный диапазон - это диапазон, который пользователь выбирает в поле ввода. В моем l oop я перехожу с LastRow на StartRow. Я столкнулся с проблемой определения строк, поскольку я хочу, чтобы StartRow была первой строкой этого выбранного диапазона, а LastRow была последней строкой в ​​конце области выбранного диапазона. Код дает ошибку несоответствия '13'.

Я новичок в VBA и, вероятно, допускаю какую-то глупую ошибку в приведенном ниже коде.

Sub Delete_Hidden_Row()
Dim LastRow As Long
Dim StartRow As Long
Dim r As Long
Dim MyRange As range

Set MyRange = Application.InputBox(Prompt:="Select the first Cell (Hidden Rows in the region of the 
selected cell will be deleted) ", _
Title:="Delete Hidden Rows", Type:=8)

StartRow = range(MyRange.Rows, MyRange.Columns).Rows.EntireRow
LastRow = range(MyRange.Rows, MyRange.Columns).CurrentRegion.Rows.Count + 1
For r = LastRow To StartRow
    If Rows(r).Hidden = True Then
        Rows(r).Delete
        
    End If
Next r

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Это должно вас туда доставить:

StartRow = MyRange.Cells(1,1).Row
LastRow = MyRange.Cells(myRange.Rows.Count,1).Row

For r = LastRow To StartRow
    If r.EntireRow.Hidden Then 
        Dim remove as Range
        If remove Is Nothing Then
            Set remove = r
        Else
            Set remove = Union(remove,r)
        End If        
    End If
Next r

remove.EntireRow.Delete
0 голосов
/ 20 июня 2020

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

Самый простой способ исправить это - l oop назад, начиная с последней строки и работайте в обратном направлении.

Другой метод - не увеличивать счетчик строк, пока он не встретит видимую строку и не перейдет к следующей.

Обновить

Ниже приведены примеры упомянутых мной методов. При работе с диапазонами row относится к диапазону, поэтому он всегда изменяется от 1 до количества строк.

Sub Delete_Hidden_One()
Dim TargetRange As Range
Set TargetRange = Application.InputBox(Prompt:="Select the first Cell (Hidden Rows in the region of the selected cell will be deleted) ", Title:="Delete Hidden Rows", Type:=8)
Dim Row As Integer
Dim TargetStart As Integer
TargetStart = TargetRange.Rows.Count
For Row = TargetStart To 1 Step -1
    If TargetRange.Rows(Row).EntireRow.Hidden = True Then
        Debug.Print "Deleting Row <" & Row & ">"
        TargetRange.Rows(Row).EntireRow.Delete xlShiftUp
    Else
        Debug.Print "Skipping Row <" & Row & ">"
    End If
Next Row
End Sub

Sub Delete_Hidden_Two()
Dim TargetRange As Range
Set TargetRange = Application.InputBox(Prompt:="Select the first Cell (Hidden Rows in the region of the selected cell will be deleted) ", Title:="Delete Hidden Rows", Type:=8)
Dim Row As Integer
Row = 1
Do
    If TargetRange.Rows(Row).EntireRow.Hidden = True Then
        Debug.Print "Row <" & Row & "> Is Hidden - Deleting"
        TargetRange.Rows(Row).EntireRow.Delete xlShiftUp
    Else
        If Row < TargetRange.Rows.Count Then
            Debug.Print "Row <" & Row & "> Is Not Hidden - Incrementing"
            Row = Row + 1
        Else
            Debug.Print "Row <" & Row & "> Is Out-Of-Bounds - Exiting"
            Exit Do
        End If
    End If
Loop
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...