2012-07-23 23 views
6

Sto cercando di eseguire una macro che eliminare le righe che non contengono un particolare valore nella colonna B. Ecco il mio codice:400 Errore macro di Excel

Sub deleteRows() 
    Dim count As Integer 
    count = Application.WorksheetFunction.CountA(Range("AF:AF")) 
    Dim i As Integer 
    i = 21 
    Do While i <= count 
     If (Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("OSR Platform", Range("B" & i))) = False) Then 
      If (Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("IAM", Range("B" & i))) = False) Then 
       Rows(i).EntireRow.Delete 
       i = i - 1 
       count = count - 1 
      End If 
     End If 
     i = i + 1 
    Loop 
End Sub 

Ora che cosa si dovrebbe fare è la seguente:

1.) Trovare il numero di righe per passare attraverso e impostare che, come il conteggio (questo funziona)

2.) Inizia alla riga 21 e cercare "Piattaforma OSR" e "IAM" nella colonna B [questo tipo di opere (vedi sotto)]

3. Se non trova nessuno, cancella l'intera riga e regola il conteggio e il numero di riga secondo necessità (questo funziona)

Per qualche motivo, ogni volta che il codice arriva alla prima istruzione If, ​​una finestra di errore con un appare la X rossa che dice solo "400". Per quanto posso dire, ho scritto tutto sintatticamente in modo sano, ma chiaramente c'è qualcosa di sbagliato.

+0

No, non è questo il problema. Ho testato questo metodo con altre condizioni sull'istruzione If e funziona bene. Buon pensiero, però. – jrad

+0

@Gaffi - è venuto qui per suggerire la stessa cosa – LittleBobbyTables

+0

Solo nel caso, ho solo cercato quello che Gaffi aveva suggerito (che mi metto in fondo al tavolo e ciclo indietro) e ho ottenuto lo stesso errore. – jrad

risposta

9

Si consiglia di iniziare dal looping il contrario. Quando elimini una linea, tutte le linee precedenti vengono spostate. È conto di questo, ma un ciclo inverso è più semplice (per me comunque) per capire che tenere traccia di quando ho compensato la posizione attuale all'interno del ciclo:

For i = count To 21 Step -1

Inoltre, sei fare troppo affidamento su Application.WorksheetFunction:

(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("OSR Platform", Range("B" & i))) = False)

a

InStr(Range("B" & i).value, "OSR Platform") > 0

Application.WorksheetFunction richiede molta più potenza di elaborazione e, a seconda di ciò che si sta tentando di ottenere, questo può richiedere molto più tempo. Anche per questa modifica suggerita, la dimensione del codice è ridotta e diventa più facile leggere senza di essa.

tuo count possono anche essere ottenuti senza A.WF:

  • Excel 2000/03: count = Range("AF65536").End(xlUp).Row
  • Excel 2007/10: count = Range("AF1048576").End(xlUp).Row
  • Versione indipendente: count = Range("AF" & Rows.Count).End(xlUp).Row

Una cosa di più è che puoi fare (e dovrebbe fare fare in questo caso) è unire le tue dichiarazioni If in una sola.

Fare questi cambiamenti, si finisce con:

Sub deleteRows() 
    Dim count As Integer 
    count = Range("AF" & Rows.Count).End(xlUp).Row 
    Dim i As Integer 
    For i = count To 21 Step -1 
     If Len(Range("B" & i).value) > 0 Then 
      If InStr(Range("B" & i).value, "OSR Platform") > 0 Or InStr(Range("B" & i).value, "IAM") > 0 Then 
       Range("B" & i).Interior.Color = RGB(255, 0, 0) 
      End If 
     End If 
    Next i 
End Sub 

Se questo non aiuta, allora si può fare un passo attraverso il codice riga per riga. Aggiungere un punto di interruzione e procedere con F8. Evidenzia le variabili nel codice, fai clic con il pulsante destro del mouse, scegli "aggiungi Guarda ...", Fai clic su 'OK', (Here's an excellent resource to help you with your debugging in general) e notare quanto segue:?

  • Quale linea colpisce l'errore
  • Qual è il valore di i e count quando ciò accade (aggiungere un orologio su queste variabili a? aiuto)
+0

Ho un paio di commenti. Innanzitutto, il secondo InStr non dovrebbe essere 'InStr (" IAM ", Range (" B "& i) .value) = 0'? Secondo, qual è il problema affidandosi a 'Application.WorksheetFunction'? – jrad

+0

Ehm, hai ragione riguardo a "InStr", quello era il mio errore di battitura. 'Application.WorksheetFunction' richiede molta più potenza di elaborazione e, a seconda di ciò che si sta tentando di ottenere, questo può richiedere molto più tempo. – Gaffi

+1

Vedo. Beh, sfortunatamente, quello che hai suggerito non funziona, ma so perché. Le celle che contengono o non contengono "OSR Platform" e "IAM" sono unite su poche righe, quindi non tutte le righe che ho bisogno di eliminare vengono cancellate. Ho cercato di evitare questo problema invece di eliminare la riga, cambiando il colore di quella cella in modo da avere almeno QUALCOSA di andare. Ma quando faccio 'If InStr (...)> 0 Oppure InStr (...)> 0 Then Range (" B "& i) .Interior.Color = 35536', cambia il colore di ogni cella anziché solo quelli con "OSR Platform" o "IAM" come mi aspettavo. Qualche idea del perché? – jrad

3

Questo ha funzionato per me. Esso utilizza il filtro automatico, non richiede looping o foglio di lavoro funzioni.

Sub DeleteRows() 

Dim currentSheet As Excel.Worksheet 
Dim rngfilter As Excel.Range 
Dim lastrow As Long, lastcolumn As Long 

Set currentSheet = ActiveSheet 

' get range 
lastrow = currentSheet.Cells(Excel.Rows.Count, "AF").End(xlUp).Row 
lastcolumn = currentSheet.Cells(1, Excel.Columns.Count).End(xlToLeft).Column 
Set rngfilter = currentSheet.Range("A1", currentSheet.Cells(lastrow, lastcolumn)) 

' filter by column B criteria 
rngfilter.AutoFilter Field:=2, Criteria1:="<>*OSR Platform*", Operator:= _ 
     xlAnd, Criteria2:="<>*IAM*" 

' delete any visible row greater than row 21 which does not meet above criteria 
rngfilter.Offset(21).SpecialCells(xlCellTypeVisible).EntireRow.Delete 

' remove autofilter arrows 
currentSheet.AutoFilterMode = False 
End Sub 

Questo codice si applica AutoFilte r alla colonna B per vedere quali righe non contengono né "Piattaforma OSR" né "IAM" nella colonna B. Quindi elimina semplicemente le righe rimanenti superiori a 21. Provalo prima su una copia della cartella di lavoro.

Con un enorme cenno al thread this OzGrid, perché non riesco mai a ricordare la sintassi corretta per la selezione di celle visibili dopo il filtraggio.

+0

+1 Poiché questo funziona anche con le celle unite annotate dall'OP. – Gaffi

+1

@Gaffi LOL Non sapevo che esistessero celle unite! – JimmyPena

Problemi correlati