2013-08-14 24 views
22

Ho notato che il mio script VBA non funziona quando è già attivo un filtro automatico. Qualche idea sul perché questo?Metodo ShowAllData della classe foglio di lavoro non riuscito

wbk.Activate 
    Set Criteria = Sheets("Sheet1").Cells(i, 1) 

    Set rng = Sheets("Sheet1").Range(Cells(i, 2), Cells(i, 4)) 

    wb.Activate 
    If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData 'remove autofilter, but it crashes on this line 

    Selection.AutoFilter 

    Range("$A$1:$BM$204").AutoFilter Field:=2, Criteria1:=Criteria.Value 

    rng.Copy 

    Range("$BC$2:$BE$204").SpecialCells(xlCellTypeVisible).PasteSpecial 

Molte grazie

+1

Quale errore si verifica sulla linea in cui si arresta? –

+0

Un errore di runtime: Metodo ShowAllData di classe del foglio di lavoro non è riuscito –

risposta

6

l'errore ShowAllData method of Worksheet class failed solito si verifica quando si tenta di rimuovere un filtro applicato quando non c'è quella applicata.

Non sono sicuro se si sta tentando di rimuovere l'intero AutoFilter o semplicemente rimuovere qualsiasi filtro applicato, ma esistono approcci diversi per ciascuno.

Per rimuovere un filtro applicato ma lasciano AutoFilter on:

If ActiveSheet.AutoFilterMode Or ActiveSheet.FilterMode Then 
    ActiveSheet.ShowAllData 
End If 

La logica alla base del codice di cui sopra è quello di testare che c'è un AutoFilter o se un filtro è stato applicato (questo inoltre rimuovere filtri avanzati) .

per rimuovere completamente l'AutoFilter:

ActiveSheet.AutoFilterMode = False 

Nel caso di cui sopra, si sta semplicemente disabilitando la AutoFilter completamente.

+0

Ho aggiornato il mio codice di seguito: Se ActiveSheet.AutoFilterMode Poi ActiveSheet.AutoFilterMode = False Se ActiveSheet.FilterMode Poi ActiveSheet.FilterMode = False voglio rimuovere completamente i filtri . Tuttavia, ora noto che il metodo paste incolla anche le prime tre (invisibili?) Tre celle. Non sono in grado di capirlo. –

+1

@KrisVandenBergh Sono contento che il problema iniziale sia risolto :) Se c'è un altro problema con il metodo 'PasteSpecial', potrebbe valere la pena sollevare una nuova domanda perché questo era quello di capire l'errore con il' Filtro automatico'. –

+0

@KrisVandenBergh Come il tuo problema originale è stato risolto, puoi contrassegnare questa domanda come risposta? Grazie –

29

AutoFilterMode sarà True se attivato, indipendentemente dal fatto che sia effettivamente applicato un filtro a una colonna specifica o meno. In questo caso, verrà eseguito ancora ActiveSheet.ShowAllData, generando un errore (perché non esiste un filtro effettivo).

Ho avuto lo stesso problema e mi hanno fatto lavorare con

If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then 
    ActiveSheet.ShowAllData 
End If 

Questo sembra impedire ShowAllData l'esecuzione quando non v'è filtro effettivo applicato ma con AutoFilterMode acceso.

La seconda cattura Or ActiveSheet.FilterMode dovrebbe prendere filtri avanzati

+12

C'è un problema logico: ** (A e B) o B == B **, quindi la tua soluzione è equivalente a. . . . . 'Se ActiveSheet.FilterMode Then ...' – MGM

1

ho appena sperimentato lo stesso problema. Dopo alcune prove ed errori ho scoperto che se la selezione era a destra della mia area di filtro E il numero di record mostrati era zero, ShowAllData avrebbe avuto esito negativo.

Un po 'più di contesto è probabilmente pertinente. Ho un numero di fogli, ognuno con un filtro. Vorrei impostare alcuni filtri standard su tutti i fogli, quindi io uso un po 'di VBA come questo

Sheets("Server").Select 
col = Range("1:1").Find("In Selected SLA").Column 
ActiveSheet.ListObjects("Srv").Range.AutoFilter Field:=col, Criteria1:="TRUE" 

Questo codice sarà regolare il filtro sulla colonna con intestazione "In SLA Selected", e lasciare tutti gli altri filtri invariato . Questo ha lo sfortunato effetto collaterale che posso creare un filtro che mostra zero record. Questo non è possibile usando l'UI da solo.

Per evitare questa situazione, desidero ripristinare tutti i filtri prima di applicare il filtro sopra. Il mio codice di reset sembrava così

Sheets("Server").Select 
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 

Nota come non ho spostato la cella selezionata. Se la selezione era a destra, non rimuoveva i filtri, consentendo così al codice del filtro di creare un filtro a riga zero. La seconda volta che si esegue il codice (su un filtro a riga zero) ShowAllData avrà esito negativo.

La soluzione è semplice: spostare la selezione all'interno delle colonne del filtro prima di chiamare ShowAllData

Application.Goto (Sheets("Server").Range("A1")) 
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 

Questo era in Excel versione 14.0.7128.5000 (32-bit) = Office 2010

+0

La selezione è rilevante solo quando si lavora con ListObjects: questi possono essere filtrati separatamente, più di un'area in un singolo foglio. Foglio normale (singolo) Il filtro può essere accessibile semplicemente tramite l'oggetto Foglio di lavoro. – MGM

10

Il modo più semplice per evitare questo, non è quello di utilizzare il metodo del foglio di lavoro ShowAllData

Autofilter ha lo stesso metodo ShowAllData che non genera un errore quando il filtro è attivato, ma nessun filtro è impostato

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData

+0

I metodi non sono 'Autofilter' e' ShowAllData'? Mentre 'Autofilter' ** rimuove ** filter,' ShowAllData' solo ** cancella ** it. – Mertinc

+0

L'OP si riferisce a Worksheet.ShowAllData che genera un errore quando il filtro è attivo ma non è selezionato alcun criterio e la mia risposta è di utilizzare Worksheet.Autofilter.ShowAllData che non causa un errore quando non è selezionato alcun criterio di filtro. - È ShowAllData che è lo stesso metodo, –

+0

Non sapevo che differenza e in realtà questo ha risolto anche il mio problema attuale dopo la tua spiegazione migliore Steven, grazie mille! – Mertinc

Problemi correlati