2012-10-20 49 views
9

Sto tentando di eseguire una macro che seleziona celle vuote in una colonna della tabella ed elimina l'intera riga.Excel VBA - Rimuovi righe vuote nella tabella

Lo script seguente fa tutto tranne la parte di eliminazione, che richiede un run-time error 1004 - "Delete method of Range class failed".

Qualche idea su come risolvere questo problema? Grazie

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

risposta

7

Bella domanda! Senza un tavolo, .EntireRow.Delete funziona sempre, ma all'interno di un tavolo sembra come se non fosse così.

Questo funziona:

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

Questa è la soluzione giusta per le tabelle, ma si dovrebbe aggiungere di controllo degli errori (come da risposta di Brettdj) nel caso in cui nessun righe vuote si trovano –

+1

ok Ho modificato la risposta e l'errore aggiunto controllo – fthiella

+0

Questo ha funzionato perfettamente. Grazie. – user91240192094

1

Si può effettivamente farlo in un solo passaggio, ma è necessario utilizzare l'oggetto ListObject e le sue DataBodyRange e ListColumns proprietà:

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

Questo metodo mi dà ancora l'errore di runtime 1004: anche se leggermente diverso, dicendo che" L'operazione non è consentita. L'operazione sta tentando di spostare le celle in una tabella del foglio di lavoro. ") – user91240192094

+0

C'è un'altra tabella sotto il uno di cui stiamo parlando? In tal caso, dovresti pensare a cambiare il design per non avere tabelle sovrapposte l'una sull'altra. Mi aspetto che tu riceva lo stesso messaggio se lo fai in Excel, senza VBA. Inoltre, in tal caso, provalo su un tavolo senza altri tavoli sopra o sotto. In caso contrario, potrei essere perplesso :). –

+0

Hey Doug - solo un singolo tavolo nel foglio di lavoro. – user91240192094

1

Fase 1: Fare un aiutante colonna nella tabella in cui si controlla eventuali campi vuoti in quella riga. Ad esempio, se nella tabella sono presenti 3 colonne: A (Prezzo), B (Quantità) e C (Costo), è necessario aggiungere una quarta colonna D e etichettarla "Qualsiasi spazio vuoto?". L'equazione sarebbe =IF(OR(ISBLANK([@Price]),ISBLANK([@Quantity]),ISBLANK([@Cost])),"Yes","No")

Ciò fornirebbe una colonna da filtrare per visualizzare tutti gli spazi vuoti.

Fase 2: In VBA si dovrebbe quindi effettuare le seguenti operazioni:

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 

Questo in sostanza sta filtrando le righe che si desidera eliminare nella tabella utilizzando la colonna di supporto, selezionando tutti i dati visibili nella tabella e unfiltering il tavolo. Stavo cercando in giro come eliminare tutte le righe visibili in una tabella e ho trovato questo e ho giocato in giro fino a quando ho capito che questo avrebbe funzionato. Prenderlo e combinarlo con una colonna helper per selezionare tutte le righe con spazi vuoti sembra proprio quello che volevi.

0

Adattamento risposte precedenti:

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