Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    11

    Excel - ricerca fra un intervallo di due date

    Ciao a tutti…
    ho creato una macro dove inserendo in due separati box due date, ad es. 12/01/2013 e 15/01/2013 ho bisogno di ricercare tutti i dati presenti in una tabella, dal 12/01/2013 al 15/01/2013 e copiarli in un' altra tabella, senza dover controllare per forza tutto il foglio. Non riesco a venirne a capo… ho provato in tutti i modi conosciuti ma niente…
    ecco un pezzo di tabella (foglio 1)

    284937 CONSEGNA MILANO 12/01/2013
    673645 SPEDIZIONE MILANO 13/03/2013
    238875 SPEDIZIONE ROMA 13/03/2013
    6762263 CONSEGNA ROMA 12/01/2013
    2544745 CONSEGNA NAPOLI 13/03/2013
    9678236 CONSEGNA ROMA 13/03/2013
    8578365 SPEDIZIONE VIAREGGGIO 12/01/2013
    657833 SPEDIZIONE ROMA 13/03/2013
    374535 SPEDIZIONE MILANO 13/03/2013
    235758 CONSEGNA LUCCA 13/03/2013
    613759 SPEDIZIONE NAPOLI 12/01/2013
    787836 CONSEGNA ROMA 15/01/2013
    949835 SPEDIZIONE MILANO 15/01/2013
    294658 CONSEGNA MILANO 15/01/2013
    633759 SPEDIZIONE NAPOLI 15/01/2013


    ecco la macro:

    Sub cerca()
    Sheets("Foglio1").Select
    Set Rng = ActiveSheet.Range("D11200")

    riga = 1
    cdata1 = Application.InputBox("", "Inserisci la 1° data", Date)
    cdata2 = Application.InputBox("", "Inserisci la 2° data", Date)
    If cdata1 <> False Or cdata2 <> False Then

    For Each cell In Rng.Cells
    If Format(cell.Value, "dd/mm/yyyy") = "" Then
    Exit For
    Else
    If (Format(cell.Value, "dd/mm/yyyy") >= Format(cdata1, "dd/mm/yyyy") And Format(cell.Value, "dd/mm/yyyy") <= Format(cdata2, "dd/mm/yyyy")) Then
    Rows(cell.Row).Select
    Selection.Copy
    Sheets("Foglio2").Select
    Rows(riga).Select
    ActiveSheet.Paste
    Sheets("Foglio1").Select
    riga = riga + 1
    End If
    End If
    Next
    End If
    Application.Goto Reference:="Cerca"
    End Sub


    Grazie in anticipo

  2. #2
    Bè, se le righe non sono ordinate per data, come nel tuo esempio, c'è poco da fare, devi necessariamente scorrere tutto il foglio.

    Credo che non servirebbe neanche ordinare i dati su un foglio nascosto e poi accedere a quelli perché per ordinarli excel dovrebbe comunque leggerli tutti e quindi velocizzeresti la macro ma a costo di un rallentamento iniziale per ordinarli.

    Un'idea potrebbe essere quella di creare una cosiddetta "lista invertita" cioè un elenco, data per data, delle righe che si riferiscono a quella data.

    E' un sistema che veniva utilizzato da ADABAS, un vecchio DB su mainframe che aveva prestazioni eccezionali in velocità di accesso ai dati proprio grazie a questa struttura.

    Per capirci, una lista invertita è una cosa fatta cosi:

    codice:
    Data        Righe
    
    10/01/2013  1 5 7 18 31 54
    11/01/2013  2 28 42 43
    12/01/2013  8 12 13 14 22
    ecc...
    In pratica dovresti fare una macro che viene attivata nel momento in cui si inserisce una riga e che va ad aggiornare la lista invertita (da memorizzare su un foglio apposito, magari nascosto) inserendo il numero di riga in corrispondenza della data giusta e poi, quando si tratta di recuperare i dati, scorri la lista fino alla prima data richiesta, estrai tutte le righe e continui così fino all'ultima data. A quel punto esci dal ciclo con una exit for.

    Il risultato dovrebbe essere:
    - un leggerissimo appesantimento in fase di inserimento dei dati dovuto all'aggiornamento della lista
    - un aumento di dimensioni della base dati dovuto alla presenza della lista
    - un miglioramento della velocità di accesso ai dati, tanto più marcato quanti più dati ci sono.

    Se poi le date sono tante e quindi anche l'accesso sequenziale alla lista per cercare la prima data da estrarre diventa troppo lungo, puoi provare con una ricerca dicotomica ma di questo magari parliamo un'altra volta.

    Valuta tu.
    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    11
    Grazie per le idee ma il mio problema lo vorrei legare principalmente al discorso di date.... di ricerca tra intervalli... poi eventualmente sbatterò la testa per la velocità di ricerca o altro...
    Per essere più chiaro, ho provato (modificando la stessa macro) a fare lo stesso tipo di ricerche sia per numero di pacco (prima colonna), per città (terza colonna) e riesco a venirne a capo ma con le date, utilizzando lo stesso principio non ci riesco.

  4. #4
    Se il problema non è la velocità di ricerca allora qual è?

    Magari posta una delle macro che hai usato per il numero pacco o la città, così magari riesco a capire.
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    11
    Ecco la macro che ho utilizzato per cercare la città e copiare solo le righe (che contengono il nome della città inserita) nel foglio 2:

    Sub cerca()
    Sheets("Foglio1").Select
    Set Rng = ActiveSheet.Range("D11200")
    riga = 1
    citta = Application.InputBox("", "Inserisci la città", "")
    If citta <> False Then
    'citta = UCase(citta)

    For Each cell In Rng.Cells
    If cell.Value = citta Then
    Rows(cell.Row).Select
    Selection.Copy
    Sheets("Foglio2").Select
    Rows(riga).Select
    ActiveSheet.Paste
    Sheets("Foglio1").Select
    riga = riga + 1
    End If

    Sulla falsariga di questa
    Next
    End If
    Application.Goto Reference:="Cerca"
    End Sub

    Quello che non riesco a fare è la stessa cosa ma con le date.
    Inserita una data di partenza e di fine (attraverso la imput box) che la macro mi copi tutte le righe comprese tra le due date.
    Spero di essere stato più chiaro.
    Grazie.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    11
    Ritrasmetto la macro corretta....

    Sub cerca()
    Sheets("Foglio1").Select
    Set Rng = ActiveSheet.Range("C1:C1200")
    riga = 1
    citta = Application.InputBox("", "Inserisci la città", "")
    If citta <> False Then
    'citta = UCase(citta)

    For Each cell In Rng.Cells
    If cell.Value = citta Then
    Rows(cell.Row).Select
    Selection.Copy
    Sheets("Foglio2").Select
    Rows(riga).Select
    ActiveSheet.Paste
    Sheets("Foglio1").Select
    riga = riga + 1
    End If

    Next
    End If
    Application.Goto Reference:="Cerca"
    End Sub

  7. #7
    Ciao,
    sinceramente continuo a non capire.

    Mi dici che non vuoi scorrere tutto il foglio però mi dai come esempio una macro che non ha condizioni di uscita anticipata e che quindi scorre tutto il foglio... mah

    Comunque, visto che quelle macro sul mio excel non funzionano ho messo un po' a posto la prima, vedi se ti risolve il problema se no, per favore, spiegami qual è il problema:

    codice:
    Sub cerca()
       Sheets("Foglio1").Select
       Set Rng = ActiveSheet.Range("D1:D1200")
       riga = 1
       contatore = 0
       
       cdata1 = Application.InputBox("Inserisci la 1° data", "Ricerca per data", Format(Date, "dd/mm/yyyy"))
       If Not cdata1 = False Then
          If IsDate(cdata1) Then
             cdata1 = Format(cdata1, "yyyy/mm/dd")
             cdata2 = Application.InputBox("Inserisci la 2° data", "Ricerca per data", Format(Date, "dd/mm/yyyy"))
             If Not cdata2 = False Then
                If IsDate(cdata2) Then
                   cdata2 = Format(cdata2, "yyyy/mm/dd")
                   If cdata1 <= cdata2 Then
                      Sheets("Foglio2").Cells.Clear
                      For Each cell In Rng.Cells
                         If cell.Value = "" Then
                            Exit For
                         Else
                            If Format(cell.Value, "yyyy/mm/dd") >= cdata1 And Format(cell.Value, "yyyy/mm/dd") <= cdata2 Then
                               Rows(cell.Row).Select
                               Selection.Copy Destination:=Sheets("Foglio2").Cells(riga, 1)
                               riga = riga + 1
                               contatore = contatore + 1
                            End If
                         End If
                      Next
                   End If
                Else
                   MsgBox "Data errata"
                End If
             End If
          Else
             MsgBox "Data errata"
          End If
       End If
       [A1].Select
       MsgBox contatore & " righe copiate"
       
    End Sub
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    11
    Gent.mo NonCeLaFaccio+
    GRAZIE, anche se non mi sarò fatto capire nelle mie esposizioni, con la tua messa a punto mi hai risolto il problema..... O meglio il primo problema insormontabile (ora non più) che non riuscivo proprio a risolvere.

    Per il momento un grosso ringraziamento.

  9. #9
    Bene, dai, meglio così

    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.