Excel VBA Не удается удалить всю строку, если часть строки является таблицей - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь перебрать мои данные и Union определенные номера строк, которые мне нужно удалить позже.Код ниже хранит правильные строки, но я не могу их удалить.Я считаю, что это потому, что мои данные расположены в таблице, так как я могу удалить нужные строки, если данные не находятся в таблице.Я получаю сообщение об ошибке 'run time error 1004 - delete method of range class failed' в строке Urng.delete.

Sub DeleteRows()
Dim ws4 As Worksheet: Set ws4 = Worksheets("Sheet1") 
Dim LastRow As Long 
Dim CurrentRow As Long
Dim GroupValue
Dim GroupTotal As Long
Dim x As Long
Dim Urng As Range

Application.ScreenUpdating = False
ws4.Activate

GroupValue = ws4.Range("B6").Value
CurrentRow = 6     LastRow = ws4.Cells(Rows.Count, "B").End(xlUp).Row
Set Urng = Rows(LastRow + 1)

    For x = 1 To LastRow 
        GroupTotal = Application.WorksheetFunction.CountIf(Range("B6:B" & LastRow), GroupValue)
        If GroupTotal = 1 Then
            Set Urng = Union(Urng, Rows(CurrentRow))
        End If

        CurrentRow = CurrentRow + GroupTotal
        GroupValue = Range("B" & CurrentRow).Value     
        If GroupValue = "" Then ' 
            Exit For
        End If

    Next x

Urng.Delete
Application.ScreenUpdating = True
End Sub

Я пытался использовать .EntireRow.Delete без удачи.

Нет данных вне таблицы, поэтому удалениеРешением проблемы могут быть только строки таблицы, однако я не знаю, как построить цикл, в котором Unions номера строк, если я не могу использовать номер строки в Union(Urng, Rows(CurrentRow)).

Существует ли VBA-решение для удаления нескольких целых строк, где часть строки представляет собой таблицу?

1 Ответ

0 голосов
/ 04 июня 2018

Это способ удаления строки № 5 из таблицы с именем TableName:

Sub TestMe()
    Range("TableName[#All]").ListObject.ListRows(5).Delete
End Sub

Что касается конкретной проблемы, то в Urng имеются строки, которыекак внутри, так и вне стола.Таким образом, они не могут быть удалены с помощью .Delete.Напишите это до Urng.Delete, чтобы увидеть себя:

Urng.Select
Stop
Unrg.Delete

В примере вы можете увидеть, что строка 6 находится в таблице, а строка 18 находится вне таблицы:

enter image description here


Что касается удаления двух строк, которые не расположены близко друг к другу в таблице, я думаю, что единственный способ - это цикл.Это немного медленнее, но работает:

Sub TestMe()

    Dim cnt As Long
    Dim arrRows As Variant: arrRows = Array(10, 12)
    Dim table As ListObject: Set table = ActiveSheet.ListObjects("SomeTable")

    For cnt = UBound(arrRows) To LBound(arrRows) Step -1
        table.ListRows(arrRows(cnt)).Delete
    Next cnt

    'This works only when the rows are after each other, e.g. 2,3,4
    table.Range.Rows("2:4").Select
    Stop
    table.Range.Rows("2:4").Delete

End Sub
...