2012-10-20 46 views
9

Próbuję uruchomić makro, które wybiera puste komórki w kolumnie tabeli i usuwa cały wiersz.Excel VBA - Usuń puste wiersze w tabeli

Poniższy skrypt wykonuje wszystko oprócz usunięcia części, która monituje o run-time error 1004 - "Delete method of Range class failed".

Wszelkie pomysły na rozwiązanie tego problemu? Dzięki

Sub test() 
Range("Table1[[New]]").Activate 
Selection.SpecialCells(xlCellTypeBlanks).Select 
Selection.EntireRow.Delete 
End Sub 

Odpowiedz

7

Ładne pytanie! Bez stołu, .EntireRow.Delete zawsze działa, ale wewnątrz stołu wygląda tak, jak nie.

to działa:

Sub Test() 
    Dim Rng As Range 
    On Error Resume Next 
    Set Rng = Range("Table1[[New]]").SpecialCells(xlCellTypeBlanks) 
    On Error Goto 0 
    If Not Rng Is Nothing Then 
    Rng.Delete Shift:=xlUp 
    End If 
End Sub 
+1

Jest to dobre rozwiązanie dla tabel, ale trzeba dodać sprawdzanie błędów (jak za odpowiedź Brettdj użytkownika) w przypadku nie puste wiersze znajdują –

+1

porządku edytowany odpowiedź i dodał błąd sprawdzenie – fthiella

+0

To działało idealnie. Dziękuję Ci. – user91240192094

1

rzeczywiście może to zrobić w jednym przejściu, ale trzeba użyć obiektu ListObject i jego DataBodyRange i ListColumns właściwości:

Sub ClearBlankCellsInColumnNew() 
Dim rngBlanks As Excel.Range 

With Worksheets("Sheet1").ListObjects("Table1") 
    On Error Resume Next 
    Set rngBlanks = Intersect(.DataBodyRange, .ListColumns("New").Range).SpecialCells(xlCellTypeBlanks) 
    On Error GoTo 0 
    If Not rngBlanks Is Nothing Then 
     rngBlanks.Delete 
    End If 
End With 
End Sub 
+0

Ta metoda nadal daje mi błąd wykonania 1004: aczkolwiek nieco inny, mówiąc, że operacja jest niedozwolona Operacja próbuje przenieść komórki do tabeli w arkuszu.) – user91240192094

+0

Czy jest inna tabela poniżej o którym mówimy? Jeśli tak, powinieneś pomyśleć o zmianie projektu, aby tabele nie były ustawione jeden nad drugim. Oczekuję, że otrzymasz tę samą wiadomość, jeśli zrobisz to w Excelu, bez VBA. Ponadto, jeśli tak, proszę spróbować w tabeli bez innych tabel powyżej lub poniżej. Jeśli nie, mogę być zaskoczony :). –

+0

Hej Doug - tylko jedna tabela w arkuszu roboczym. – user91240192094

1

Krok 1: Sprawdź, pomocnika kolumna w tabeli, w której zaznaczono puste pola w tym wierszu. Na przykład, jeśli w tabeli były 3 kolumny: A (Cena), B (Ilość) i C (Koszt), należałoby dodać czwartą kolumnę D i oznaczyć ją jako "Dowolne blanki?". Równanie to: =IF(OR(ISBLANK([@Price]),ISBLANK([@Quantity]),ISBLANK([@Cost])),"Yes","No")

To da ci kolumnę do filtrowania, aby wyświetlić wszystkie puste pola.

Krok 2: W VBA byś następnie wykonaj następujące czynności:

Range("MyTableNameHere").AutoFilter Field:=Range("MyTableNameHere[Any Blanks?]").Column, Criteria1:="Yes" 
Application.DisplayAlerts = False 
Range("MyTableNameHere").ListObject.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete 
Application.DisplayAlerts = True 
Range("MyTableNameHere").AutoFilter Field:=Range("MyTableNameHere[Any Blanks?]").Column 

To w istocie jest filtrowany do wierszy, które chcesz usunąć z tabeli stosując kolumnę pomocnika, wybraniu wszystkich widocznych danych w tabeli i odfiltrowanie stołu. Szukałem, jak usunąć wszystkie widoczne wiersze w tabeli i znalazłem to i błądziłem, dopóki nie zorientowałem się, że to zadziała. Biorąc to i łącząc go z kolumną pomocnika, aby wybrać wszystkie wiersze z dowolnymi pustymi miejscami, wydaje się, że również tego chcesz.

0

Adaptacja wcześniejsze odpowiedzi:

On Error Resume Next 
Set Rng = ListObjects(1).DataBodyRange.SpecialCells(xlCellTypeBlanks) 
On Error GoTo 0 
If Not Rng Is Nothing Then 
Rng.Delete Shift:=xlUp 
End If