Condividi tramite

Filtro in base a valore da combo e data

Anonimo
2014-03-27T09:27:22+00:00

Ho un codice vba che, fra le tante cose, mi permette di applicare un filtro in un foglio excel (.Range("A1").AutoFilter Field:=10, Criteria1:= _

            Me.ComboBox1.Value) prendendo il valore/criterio da una combobox. Avrei bisogno di applicare ulteriori filtri:

Un filtro su di un altra colonna (colonna "C") prendendo il valore da combobox4 e un filtro sulla colonna "B" che abbia come valore una data o un periodo fra due date (es.: dal 25/03/2014 al 27/03/2014).

Qualche anno fà ho ricevuto un notevole aiuto dal sig. Gamberini che mi ha suggerito gran parte di questo codice che segue e vorrei, se è possibile, modificarlo!

Tutto parte da una User che contiene combo e pulsanti, e questo è il codice:

Option Explicit

Private shAutori As Worksheet

Private shOperatore As Worksheet

Private shSequenza As Worksheet

Private shRaggruppa As Worksheet

  Private shArticoli As Worksheet 'Aggiunto per popolare combobox4 **

Private lRigaAut As Long 'riga autore

Private lRigaOp As Long 'riga operatore

Private Sub UserForm_Initialize()

       Dim lng As Long

    With ThisWorkbook

        Set shAutori = .Worksheets("elenco")

        Set shOperatore = .Worksheets("RagioneSociale")

        Set shSequenza = .Worksheets("ArchivioStatistiche")

        Set shRaggruppa = .Worksheets("Raggruppa")

          Set shArticoli = .Worksheets("Articoli") 'Aggiunto per popolare combobox4  **

'Ho Aggiunto fin qui per popolare combobox4 (dal Foglio "Articoli" colonna "A") ma da qui in poi non so come procedere per popolare la combo

    End With

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

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

       For lng = 2 To lRigaAut

        Me.ComboBox1.AddItem shAutori.Cells(lng, 1).Value

    Next

       For lng = 2 To lRigaOp

        Me.ComboBox2.AddItem shOperatore.Cells(lng, 1).Value

    Next

   End Sub

Private Sub ApplicaFiltro_Click()

    Dim lng As Long

    Dim rng As Range

    Dim lRiga As Long

    Application.ScreenUpdating = False

    ThisWorkbook.Worksheets.Add ' aggiungo un foglio

On Error Resume Next

    ActiveSheet.Name = "Pippo"

    If Err.Number = 1004 Then

        Application.DisplayAlerts = False

        MsgBox "(1)Movimento gia eseguito: Contatta Alfredo!"

               ActiveSheet.Delete ' lo elimino

        Application.DisplayAlerts = True

        Exit Sub

    End If

On Error GoTo 0

On Error GoTo RigaErrore

    With shAutori ' carico nelle due combobox le liste

        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 ' dentro al foglio statistiche

        Application.ScreenUpdating = False

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

            Me.ComboBox1.Value 'applico il filtro usando il valore della combo

'****A QUESTO PUNTO VORREI POTER PERFEZIONARE IL FILTRO AGGIUNGENDO IL CRITERIO SELEZIONATO NELLA COMBOBOX4 E SCEGLIERE IL PERIODO '(FILTRO PER DATA SULLA COLONNA "B")

         Unload Me

     Application.Run "CopiaRigheStatistica" 'dopo applica filtro copia le righe

    If Sheets("Pippo").Range("A16") > 0 Then

    Sheets("Pippo").Select

    Application.Run "TestataStatisticaRaggruppa"

    Else

    Application.DisplayAlerts = False

    MsgBox "(2)Nessun risultato Ottenuto"

    Sheets("Pippo").Delete

    Sheets("PiePagina").Select

    Range("A21:L21").Select

    Selection.Copy

    Sheets("Archivio").Select

    Range("A1").Select

    ActiveSheet.Paste

    Selection.AutoFilter

    Sheets("Comandi").Select

    Raggr_User.Show

    Exit Sub

End If

    End With

RigaChiusura:

Exit Sub

    Application.ScreenUpdating = True

    shSequenza.Range("A1").AutoFilter

RigaErrore:

    If Err.Number = 1004 Then

        Application.DisplayAlerts = False

        MsgBox "(3)Nessun risultato Ottenuto"

        ActiveSheet.Delete

        Application.DisplayAlerts = True

    Else

        MsgBox Err.Number & vbNewLine & Err.Description

    End If

    Resume RigaChiusura

End Sub

Spero di non aver fatto troppa confusione e ringrazio in anticipo per l'interessamento.

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
2014-03-31T17:17:32+00:00

Ho desistito, lo faccio manualmente! Troppo complicato! Grazie lo stesso a tutti!!!

Ripeto che: le date sono date e il testo è testo. Non puoi confrontarli in VB. Quindi, nelle ComboDox/TextBox/listBox hai del testo, non una data. Inoltre, vb se converte *da solo* il testo in data, fa quello che gli hanno insegnato, lo converte in una data USA, quindi nel formato mm/dd/yyyy.

CDate(TestoValido) serve appunto per trasformare il testo in una data, una data valida per la localizzazione che c'è su quella macchina, nel nostro caso dd/mm/yyyy, e la stessa cosa la ottieni con Format(Testo,Formattazione).

Esempio semplice semplice. Fai girare la macro qui sotto:

Public Sub m()

    Dim s As String

    s = "05/01/2014"

    With ActiveSheet

        .Range("A1").Value = s

        .Range("A2").Value = Format(s, "dd/mm/yyyy")

        .Range("A3").Value = Format(s, "mm/dd/yyyy")

        .Range("A4").Value = CDate(s)

    End With

End Sub

Assumendo che s sia la data presente in una ComboDox/TextBox/listBox (che ti ricordo è testo), vedi come quel testo viene trasformato in una data differente a seconda del codice che utilizzi. Come puoi vedere, in A1 e A2 hai una cosa non congrua.

Se devi filtrare un intervallo di date, devi tenere conto di quanto sopra. Se mentre filtri registri una macro, ottieni un codice tipo questo:

    ActiveSheet.Range("$A$1:$A$17").AutoFilter Field:=1, Criteria1:= _

        ">=02/01/2014", Operator:=xlAnd, Criteria2:="<=05/01/2014"

Ma. se vai poi ad eseguire la macro, non ottieni quello che vuoi. Come dicevo prima,un conto è Excel, un conto è il vb. Quello che hai registrato, quando andrai a rieseguirlo verrà interpretato male.

In questo caso specifico il codice corretto sarebbe:

    ActiveSheet.Range("$A$1:$A$17").AutoFilter Field:=1, _

        Criteria1:=">=" & Format("02/01/2014", "mm/dd/yyyy"), _

        Operator:=xlAnd, _

        Criteria2:="<=" & Format("05/01/2014", "mm/dd/yyyy")

(sto filtrando la colonna A per un intervallo di date).

Al posto delle due date, puoi passare il Text di ComboDox/TextBox/listBox, esempio:

Criteria1:=">=" & Format(ComboBox1.Text, "mm/dd/yyyy")

La risposta è stata utile?

0 commenti Nessun commento

5 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-04-01T07:36:51+00:00

    Adesso mi è chiaro perchè mi si incasinava tutto! I filtri precedenti erano tutti basati sul testo e son riuscito a farli funzionare ma quando arrivavo alle date... Quindi se uso una imputbox e gli specifico il formato data, funziona! Ho provato questo codice che segue (molto elementare) sembra funzionare bene, faccio un po di prove ... ma lo devo scrivere meglio!

    Sub Filtrodate() 'Applica un filtro in base a due date iniz e fine

    Dim Inizio

    Dim Fine

    Inizio = InputBox("Inserire la data INIZIO periodo ricerca" & Chr(13) & "nel formato gg/mm/aaaa" & Chr(13) & "Se omesso esce")

    Fine = InputBox("Inserire la data FINE periodo ricerca" & Chr(13) & "nel formato gg/mm/aaaa" & Chr(13) & "Se omesso esce")

    Range("A1").Select      'seleziono la cella di  inizio

    Selection.AutoFilter Field:=2, Criteria1:=">=" & Format(Inizio, "mm/dd/yy"), Operator:= _

    xlAnd, Criteria2:="<=" & Format(Fine, "mm/dd/yy") ' e filtro

    End Sub

    Mauro, lei è illuminante, e la ringrazio.

    Alfredo

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-03-31T16:54:54+00:00

    Ho desistito, lo faccio manualmente! Troppo complicato! Grazie lo stesso a tutti!!!

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-03-27T18:11:41+00:00

            Application.ScreenUpdating = False

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

                Me.ComboBox1.Value 'applico il filtro usando il valore della combo

    '****A QUESTO PUNTO VORREI POTER PERFEZIONARE IL FILTRO AGGIUNGENDO IL CRITERIO SELEZIONATO NELLA COMBOBOX4 E SCEGLIERE IL PERIODO '(FILTRO PER DATA SULLA COLONNA "B")

    Le date sono date, la proprietà Text di una ComboBox è testo. Quindi, prova come criterio:

    ...... Criteria1:="=" & CDate (Me.ComboBox1.Text)

    Non ho capito, e di sicuro non mi sono spiegato bene.

    Leggendo la risposta penso che Mauro mi suggerisca di cambiare il metodo del filtro presente nel codice da "Criteria1:= Me.ComboBox1.Value" a "Criteria1:="=" & CDate (Me.ComboBox1.Text)" . Se ho inteso bene la risposta (data la mia ignoranza), non sono stato chiaro nella domanda. Procedo con ordine e calma.

    Vorrei sapere se e come è possibile ...

       Dopo aver applicato il filtro ".Range("A1").AutoFilter Field:=10, Criteria1:= _

                Me.ComboBox1.Value", mi viene restituito come risultato le righe che nella colonna "L" rispondono al criterio selezionato nella combobox1 e questo va bene.

       A questo punto dovrei filtrare i dati risultanti dal primo filtro applicando alla colonna "C" il criterio selezionato nella combobox4 e poi al risultato ottenuto un ulteriore filtro per un periodo es.: dal 25/03/2014 al 27/03/2014.

    Per farla semplice un esempio: lo faccio manualmente in excel cosi: Menu Dati/Filtro/filtro automatico poi nel foglio seleziono la freccietta sulla colonna "L" e metto il primo criterio, poi vado alla freccia sulla colonna "C" e metto il secondo criterio e infine sulla freccia colonna "B" seleziono "personalizza" e scelgo le date per il margine che mi interessa.

    Mi scuso per la confusione e ringrazio Mauro per i consigli e il tempo dedicatomi!

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2014-03-27T10:36:35+00:00

            Application.ScreenUpdating = False

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

                Me.ComboBox1.Value 'applico il filtro usando il valore della combo

    '****A QUESTO PUNTO VORREI POTER PERFEZIONARE IL FILTRO AGGIUNGENDO IL CRITERIO SELEZIONATO NELLA COMBOBOX4 E SCEGLIERE IL PERIODO '(FILTRO PER DATA SULLA COLONNA "B")

    Le date sono date, la proprietà Text di una ComboBox è testo. Quindi, prova come criterio:

    ...... Criteria1:="=" & CDate (Me.ComboBox1.Text)

    La risposta è stata utile?

    0 commenti Nessun commento