Condividi tramite

Errore nel controllo in una funzione che filtra dati

Anonimo
2010-11-29T17:57:36+00:00

Faccio riferimento al tread seguente

http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/thread/d8ffd750-a1b2-4e10-8bfb-fdaac1d96a03  Ho aggiunto questo controllo indicatomi "gentilmente" da Mauro

With shSequenza

            .Range("A1").AutoFilter Field:=2, Criteria1:= _

            Me.ComboBox1.Value   'prende il valore contenuto nella combo e lo usa come criterio di filtro "OK"

        Set rng = .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)   'Setta la variabile rng "OK"

        If rng.Rows.Count > 1 Then   'conta se rng è superiore a 1 "Qui ci sta l'errore!"

            .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _

                Destination:=ActiveSheet.Range("A9")

        Else

            Application.DisplayAlerts = False

            MsgBox "Processo fallito, verrà eliminato il foglio creato"

            ActiveSheet.Delete

            Application.DisplayAlerts = True

        End If

        .Range("A1").AutoFilter

    End With

(If rng.Rows.Count > 1 Then   'conta se rng è superiore a 1 "Qui ci sta l'errore!")

Il filtro viene applicato correttamente e funziona, ma il controllo non và bene: (Ipotesi dati Sequenza: B2 Paolo B3 Ciro B4 Antonio B5 Lisa)

se nella CoboBox inserisco il valore "Paolo" presente in B2 il controllo "rng" risulta = a 2 quindi funziona, per tutti gli altri (Ciro, Antonio, Lisa) "rng" risulta sempre = a 1 e quindi non và (i dati sono presenti, filtrati e visibili ma "rng" risulta = a 1). Se "Paolo" lo sposto in B3 e "Ciro" in B2 inserendo nella CoboBox il valore "Paolo" "rng" risulta = a 1 quindi non và.

Ne deduco che se in B2 (prima riga dei dati da filtrare) è presente il nome che inserisco nella conboBox per il filtro le celle visibili, risultanti dal filtro, vengono contate in "rng" ! Diversamente, se il nome che inserisco nella conboBox per il filtro non è presente nella prima riga ("B2") pur funzionando il filtro le celle visibili non vengono contate in "rng" !

Come mai ?

Segue il codice completo:

Private Sub ApplicaFiltro_Click()

On Error GoTo RigaErrore

    Dim lng As Long

    ThisWorkbook.Worksheets.Add

    ActiveSheet.Name = Me.ComboBox1.Value & "_" & _

        Format(Date, "dd") & "_" & _

        Format(Date, "mm") & "_" & _

        Format(Year(Date), "yy")

    With shAutori

        For lng = 2 To lRigaAut

            If .Range("A" & lng).Value = _

                Me.ComboBox1.Value Then

                .Range("A" & lng & ":G" & lng).Copy _

                    Destination:=ActiveSheet.Range("A1")

            End If

        Next

    End With

    With shOperatore

        For lng = 2 To lRigaAut

            If .Range("A" & lng).Value = _

                Me.ComboBox2.Value Then

                .Range("A" & lng & ":G" & lng).Copy _

                    Destination:=ActiveSheet.Range("A2")

            End If

        Next

    End With

    With shSequenza

        .Range("A1").AutoFilter Field:=2, Criteria1:= _

            Me.ComboBox1.Value

        Set rng = .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)

        If rng.Rows.Count > 1 Then

            .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _

                Destination:=ActiveSheet.Range("A9")

        Else

            Application.DisplayAlerts = False

            MsgBox "Processo fallito, verrà eliminato il foglio creato"

            ActiveSheet.Delete

            Application.DisplayAlerts = True

.Range("A1").AutoFilter

            Exit Sub

        End If

        .Range("A1").AutoFilter

    End With

RigaChiusura:

    Exit Sub

RigaErrore:

    If Err.Number = 1004 Then

        MsgBox "Foglio già presente"

    Else

        MsgBox Err.Number & vbNewLine & Err.Description

    End If

    Resume RigaChiusura

End Sub

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2010-12-02T16:32:28+00:00

Scusami, per cercare di fare meglio ho fatto peggio!  Il pulsante ConControllo non esiste, lo ho inserito per mostrarti la differenza fra la macro con il controllo e quella senza.

A scanso di equivoci ti ho ri-postato l'esempio come deve essere, spiegando anche come funziona http://cid-e14e39f69c1c7d59.office.live.com/self.aspx/.Public/FiltroCombo.xls

Solo ApplicaFiltro crea il foglio ma avrei bisogno di tutti e due i controlli :

1)se Foglio gia presente (allora Esci dalla funzione!)

2)se Non ci sono righe per l'Autore selezionato nel foglio "Sequenza" (allora Avvisami, Elimina il foglio che mi hai generato, Esci dalla funzione!)

il primo 1) E' intercettato e gestito e funziona a puntino.

Il secondo 2) mi genera il problema che segue:

Prova a selezionare "Zucchero" come autore, e fai partire la macro ConControllo. "Zucchero" non è presente nella lista, quindi dovrebbe eliminare il foglio! Invece mi da "foglio gia presente". Poi chiudi la User elimina il foglio che si è generato, riapri la User, seleziona "Zucchero" come autore, e fai partire la macro ConControllo, mi da "Processo fallito, verrà eliminato il foglio creato". Riprova piu volte e vedi che fa sempre prima uno e poi l'altro errore !

Riprova questo:

Private Sub ConControllo_Click()

    Dim lng As Long

    Dim rng As Range

    Dim lRiga As Long

    Application.ScreenUpdating = False

    ThisWorkbook.Worksheets.Add

On Error Resume Next

    ActiveSheet.Name = Me.ComboBox1.Value & "_" & _

        Format(Date, "dd") & "_" & _

        Format(Date, "mm") & "_" & _

        Format(Year(Date), "yy")

    If Err.Number = 1004 Then

        Application.DisplayAlerts = False

        MsgBox "Processo fallito, verrà eliminato il foglio creato"

        ActiveSheet.Delete

        Application.DisplayAlerts = True

        Exit Sub

    End If

On Error GoTo 0

On Error GoTo RigaErrore

    With shAutori

        For lng = 2 To lRigaAut

            If .Range("A" & lng).Value = _

                Me.ComboBox1.Value Then

                .Range("A" & lng & ":G" & lng).Copy _

                    Destination:=ActiveSheet.Range("A1")

            End If

        Next

    End With

    With shOperatore

        For lng = 2 To lRigaAut

            If .Range("A" & lng).Value = _

                Me.ComboBox2.Value Then

                .Range("A" & lng & ":G" & lng).Copy _

                    Destination:=ActiveSheet.Range("A2")

            End If

        Next

    End With

   With shSequenza

        lRiga = .Range("A" & .Rows.Count).End(xlUp).Row

        .Range("A1").AutoFilter Field:=2, Criteria1:= _

            Me.ComboBox1.Value

        If .Range("A2:A" & lRiga).SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then

                .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _

                    Destination:=ActiveSheet.Range("A9")

        Else

            Application.DisplayAlerts = False

            MsgBox "Processo fallito, verrà eliminato il foglio creato"

            ActiveSheet.Delete

            Application.DisplayAlerts = True

        End If

    End With

RigaChiusura:

    Application.ScreenUpdating = True

    shSequenza.Range("A1").AutoFilter

    Exit Sub

RigaErrore:

    If Err.Number = 1004 Then

        Application.DisplayAlerts = False

        MsgBox "Processo fallito, verrà eliminato il foglio creato"

        ActiveSheet.Delete

        Application.DisplayAlerts = True

    Else

        MsgBox Err.Number & vbNewLine & Err.Description

    End If

    Resume RigaChiusura

End Sub

Fai sapere, grazie.


--

La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

--

Mauro Gamberini - Microsoft© MVP(Excel)

http://www.maurogsc.eu/

La risposta è stata utile?

0 commenti Nessun commento

16 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-11-30T16:45:32+00:00

    Capito pochissimo. Prova comunque a modificare così l'evento ApplicaFiltro_Click() che hai nella UserForm:

    Private Sub ApplicaFiltro_Click()

    On Error GoTo RigaErrore

        Dim lng As Long

      

        ThisWorkbook.Worksheets.Add

        ActiveSheet.Name = Me.ComboBox1.Value & "_" & _

            Format(Date, "dd") & "_" & _

            Format(Date, "mm") & "_" & _

            Format(Year(Date), "yy")

          

        With shAutori

            For lng = 2 To lRigaAut

                If .Range("A" & lng).Value = _

                    Me.ComboBox1.Value Then

                    .Range("A" & lng & ":G" & lng).Copy _

                        Destination:=ActiveSheet.Range("A1")

                End If

            Next

        End With

      

        With shOperatore

            For lng = 2 To lRigaAut

                If .Range("A" & lng).Value = _

                    Me.ComboBox2.Value Then

                    .Range("A" & lng & ":G" & lng).Copy _

                        Destination:=ActiveSheet.Range("A2")

                End If

            Next

        End With

      

        With shSequenza

            .Range("A1").AutoFilter Field:=2, Criteria1:= _

                Me.ComboBox1.Value

            .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _

                Destination:=ActiveSheet.Range("A9")

        End With

      

    RigaChiusura:

        shSequenza.Range("A1").AutoFilter

        Exit Sub

      

    RigaErrore:

        If Err.Number = 1004 Then

            MsgBox "Foglio già presente"

        Else

            MsgBox Err.Number & vbNewLine & Err.Description

        End If

        Resume RigaChiusura

      

    End Sub

    Non vorrei sbagliare. ma questo codice è uguale a quello inserito nel mio esempio. Cliccando sul pulsante "ApplicaFiltro" nella user, lo avvio e funziona.

    Quello che non funziona è il codice che si avvia dal pulsante "ConControllo" . Questo secondo codice è uguale al primo solo che effettua un controllo:

    Dopo aver applicato il filtro (.Range("A1").AutoFilter Field:=2, Criteria1:= Me.ComboBox1.Value) controlla se le righe risultanti dal filtro sono superiori ad 1, se SI continua altrimenti elimina il foglio creato. Questa è la parte che cambia nel secondo codice:

    With shSequenza

                .Range("A1").AutoFilter Field:=2, Criteria1:= _

                Me.ComboBox1.Value 

            Set rng = .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)          If rng.Rows.Count > 1 Then

                .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _

                    Destination:=ActiveSheet.Range("A9")

            Else            Application.DisplayAlerts = False            MsgBox "Processo fallito, verrà eliminato il foglio creato"            ActiveSheet.Delete            Application.DisplayAlerts = True        End If

            .Range("A1").AutoFilter

        End With

    Se selezioni "VascoRossi" e clicchi sul tasto "ConControllo" noterai che genera un errore, come se "VascoRossi" non fosse presente nella lista del foglio "Sequenza" .

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-11-30T10:22:20+00:00

    http://cid-e14e39f69c1c7d59.office.live.com/self.aspx/.Public/ProvaFiltroCombo.xls

    Scusa Mauro... hai perfettamente ragione. Ti ho postato un esempio ...  nella pagina iniziale trovi un pulsante che fa partire la User. Il pulsante"Applica Filtro"non genera errori perche non effettua il controllo, invece il pulsante"ConControllo"effettua il controllo e genere l'errore. Nel file è spiegato meglio!

    Grazie per la disponibilità

    Alfredo

    Capito pochissimo. Prova comunque a modificare così l'evento ApplicaFiltro_Click() che hai nella UserForm:

    Private Sub ApplicaFiltro_Click()

    On Error GoTo RigaErrore

        Dim lng As Long

        ThisWorkbook.Worksheets.Add

        ActiveSheet.Name = Me.ComboBox1.Value & "_" & _

            Format(Date, "dd") & "_" & _

            Format(Date, "mm") & "_" & _

            Format(Year(Date), "yy")

        With shAutori

            For lng = 2 To lRigaAut

                If .Range("A" & lng).Value = _

                    Me.ComboBox1.Value Then

                    .Range("A" & lng & ":G" & lng).Copy _

                        Destination:=ActiveSheet.Range("A1")

                End If

            Next

        End With

        With shOperatore

            For lng = 2 To lRigaAut

                If .Range("A" & lng).Value = _

                    Me.ComboBox2.Value Then

                    .Range("A" & lng & ":G" & lng).Copy _

                        Destination:=ActiveSheet.Range("A2")

                End If

            Next

        End With

        With shSequenza

            .Range("A1").AutoFilter Field:=2, Criteria1:= _

                Me.ComboBox1.Value

            .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _

                Destination:=ActiveSheet.Range("A9")

        End With

    RigaChiusura:

        shSequenza.Range("A1").AutoFilter

        Exit Sub

    RigaErrore:

        If Err.Number = 1004 Then

            MsgBox "Foglio già presente"

        Else

            MsgBox Err.Number & vbNewLine & Err.Description

        End If

        Resume RigaChiusura

    End Sub

    Fai sapere se hai risolto, grazie.


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-11-30T09:24:28+00:00

    http://cid-e14e39f69c1c7d59.office.live.com/self.aspx/.Public/ProvaFiltroCombo.xls

    Scusa Mauro... hai perfettamente ragione. Ti ho postato un esempio ...  nella pagina iniziale trovi un pulsante che fa partire la User. Il pulsante"Applica Filtro" non genera errori perche non effettua il controllo, invece il pulsante"ConControllo" effettua il controllo e genere l'errore. Nel file è spiegato meglio!

    Grazie per la disponibilità

    Alfredo

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2010-11-29T18:08:56+00:00

    Faccio riferimento al tread seguente

     Ho aggiunto questo controllo indicatomi "gentilmente" da Mauro

    <cut>

    Invece di postare tutte quelle righe di codice, un semplice file d'esempio postato qui:http://explore.live.com/windows-live-skydrive non costringerebbe achi risponde a ricreare un contesto a volte difficile da capire. Lo so che ho risposto io, ma non ricordo più nulla. E spiega bene, basandoti sull'esempio che posterai, cosa ottieni e cosa vorresti ottenere. Grazie per la comprensione.


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento