Excel form di ricerca per intervallo di date

Anonimo
2016-04-30T12:17:31+00:00

Buongiorno,

ho un file excel in cui, tramite un bottone nel Foglio1, apro una form di ricerca per intervallo di date (con due caselle di testo, rispettivamente CASELLARICERCADA e CASELLARICERCAA) che nel Foglio2 della stessa cartella di lavoro mi dovrebbe trovare i dati corrispondenti all'intervallo richiesto e poi caricali nel Foglio1 della stessa cartella di lavoro.

Quanto sopra con questo codice VBA:

Private Sub INSERISCIPERDATA_Click()

Dim ur As Long

Dim rng As Range

Dim c As Range

Dim cont As Long

Dim SommaColE As Integer

cont = 0

With Worksheets("Foglio2")

    ur = .Range("B" & Rows.Count).End(xlUp).Row

    Set rng = .Range("B2:B" & ur)

    For Each c In rng

        If c.Value >= CASELLARICERCADA.Text And c.Value <= CASELLARICERCAA.Text Then

            Set sh1 = ThisWorkbook.Worksheets("Foglio1")

            With sh1

            RigaColA = sh1.Range("A" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("A" & RigaColA) = c.Offset(0, -1).Value

            RigaColB = sh1.Range("B" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("B" & RigaColB) = c.Value

            RigaColC = sh1.Range("C" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("C" & RigaColC) = c.Offset(0, 1).Value

            RigaColD = sh1.Range("D" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("D" & RigaColD) = c.Offset(0, 2).Value

            RigaColE = sh1.Range("E" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("E" & RigaColE) = c.Offset(0, 3).Value

            End With

        Unload FORMINSERISCIPERDATA

        End If

    Next

    Set rng = Nothing

End With

End Sub

Il mio problema è il seguente: se cerco, per esempio, nell'intervallo di date che va dal 01/04/2016 al 30/04/2016, vorrei che mi trovasse i dati che ricadono in quell'intervallo, né più né meno, (quindi mi deve restituire, ad esempio, la corrispondenza al 02/04/2016, al 05/04/2016, al 10/04/2016, al 15/04/2016, al 28/04/2016, ecc..., insomma in base a quello che trova in quell'intervallo) e invece mi trova dati che corrispondono anche prima del 01/04/2016 (ad esempio 13/03/2016) e dopo il 30/04/2016 (ad esempio 02/05/2016).

Come modifico il codice di cui sopra, affinché mi trovi solo i dati che cadono esattamente nell'intervallo richiesto, ad esempio dal 01/04/2016 al 30/04/2016, non prima né dopo?

Grazie a tutti per l'aiuto che vorrete darmi.

Marta

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
2016-04-30T17:52:42+00:00

Ciao Marta,

ho un file excel in cui, tramite un bottone nel Foglio1, apro una form di ricerca per intervallo di date (con due caselle di testo, rispettivamente CASELLARICERCADA e CASELLARICERCAA) che nel Foglio2 della stessa cartella di lavoro mi dovrebbe trovare i dati corrispondenti all'intervallo richiesto e poi caricali nel Foglio1 della stessa cartella di lavoro.

Quanto sopra con questo codice VBA:

    

Private Sub INSERISCIPERDATA_Click()

Dim ur As Long

Dim rng As Range

Dim c As Range

Dim cont As Long

Dim SommaColE As Integer

cont = 0

With Worksheets("Foglio2")

    ur = .Range("B" & Rows.Count).End(xlUp).Row

    Set rng = .Range("B2:B" & ur)

    For Each c In rng

        If c.Value >= CASELLARICERCADA.Text And c.Value <= CASELLARICERCAA.Text Then

            Set sh1 = ThisWorkbook.Worksheets("Foglio1")

            With sh1

            RigaColA = sh1.Range("A" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("A" & RigaColA) = c.Offset(0, -1).Value

            RigaColB = sh1.Range("B" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("B" & RigaColB) = c.Value

            RigaColC = sh1.Range("C" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("C" & RigaColC) = c.Offset(0, 1).Value

            RigaColD = sh1.Range("D" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("D" & RigaColD) = c.Offset(0, 2).Value

            RigaColE = sh1.Range("E" & Rows.Count).End(xlUp).Offset(1).Row

            sh1.Range("E" & RigaColE) = c.Offset(0, 3).Value

            End With

        Unload FORMINSERISCIPERDATA

        End If

    Next

    Set rng = Nothing

End With

End Sub

Il mio problema è il seguente: se cerco, per esempio, nell'intervallo di date che va dal 01/04/2016 al 30/04/2016, vorrei che mi trovasse i dati che ricadono in quell'intervallo, né più né meno, (quindi mi deve restituire, ad esempio, la corrispondenza al 02/04/2016, al 05/04/2016, al 10/04/2016, al 15/04/2016, al 28/04/2016, ecc..., insomma in base a quello che trova in quell'intervallo) e invece mi trova dati che corrispondono anche prima del 01/04/2016 (ad esempio 13/03/2016) e dopo il 30/04/2016 (ad esempio 02/05/2016).

Come modifico il codice di cui sopra, affinché mi trovi solo i dati che cadono esattamente nell'intervallo richiesto, ad esempio dal 01/04/2016 al 30/04/2016, non prima né dopo?

La ragione di fondo del tuo problema è che stai cercando di confrontare i valori delle due caselle di testo con valori di data sul foglio di lavoro di interesse. Il valore di una casella di testo sarà sempre un valore di testo, mentre Excel memorizza sempre date internamente come un numero che rappresenta il numero di giorni trascorsi dallo  0/gen /1900. Al fine di effettuare correttamente il confronto, il tuo codice deve convertire i valori di testo delle due caselle di testo in date. Pertanto, prova a sostituire:

        If c.Value >= CASELLARICERCADA.Text And c.Value <= CASELLARICERCAA.Text Then

con:

        If c.Value >= CDate(CasellaRicercaDa.Text) _

           And c.Value <= CDate(CasellaRicercaA.Text) Then

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-05-01T10:00:05+00:00

    Ciao Marta,

    grazie mille: adesso funziona tutto alla perfezione!!!

    Grazie a te, Marta, per il cortese riscontro.

    Alla prossima.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-05-01T09:54:54+00:00

    Buongiorno,

    grazie mille: adesso funziona tutto alla perfezione!!!

    Grazie ancora e alla prossima!

    Marta

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-04-30T18:07:30+00:00

    Ciao Marta,

    Excel memorizza sempre date internamente come un numero che rappresenta il numero di giorni trascorsi dallo  0/gen /1900.

    Vorrei aggiungere che si può formattare questo valore di data in vari modi, ma rimarrà sempre un valore numerico. Per dimostrare questo, immetti la data odierna nelle celle (diciamo)  A1 e A2. Ora formatta la seconda cella come generale: vedrai che la seconda cella ora visualizza il valore numerico 42490. ovvero il numero di giorni trascorsi dallo  0/gen /1900:

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento