Come ricercare date in un elenco di date

Anonimo
2024-11-17T23:29:39+00:00

Buongiorno

Ho incontrato difficoltà nel ricercare una data in un elenco di date.

L'elenco delle date è visualizzato come gg/mm/aaaa nel foglio excel. La variabile dove metto la data da cercare è definita come "date" ; per provare la routine, vi copio una delle date dell'elenco del foglio (poi otterrò la data nello stesso formato dinamicamente...

A questo punto per la ricerca uso questo:

With intervallo Set y = .Find(What:=rifData, LookIn:=xlValues, LookAt:=xlWhole) If Not y Is Nothing Then inizioRep.Offset(repPos, 2).Value = y.Address inizioRep.Offset(repPos, 2).Interior.Color = vbGreen Else inizioRep.Offset(repPos, 2).Value = "N/D" End If End With

dove intervallo definisce il range dove stanno le date, e rifdata contiene una delle date come dicevo sopra.

Succede che spesso la data cercata non risulta presente anche se ottenuta dall'elenco..

Ho quindi provato con un elenco dove la data è visualizzata come numero e uso sempre una delle celle da un elenco che ha un elenco di date nello stesso formato.. Uso lo stesso metodo di cui sopra (ovviamente usando intervallo che si riferisce al range di date nel formato numero e numData dove la data è in formato numerico.

Tutto viene localizzato perfettamente.

Ho visto che nel foglio excel la funzione CONFRONTA.X(elemDaTrovare, elencoDoveCercare,modo) usando le celle visualizzate come gg/mm/aaaa funziona perfettamente ed ho provato ad usare questa con VBA in questo modo

var = Application.Match(numData, intervallo, 0) dove var è una variabile long.

Anche in questo caso se uso Match con i valori numerici trovo la posizione perfettamente, ma se passo a gg/mm/aaaa ancora non ottengo la posizione...

Penso di superare il problema usando i valori numerici e aggiungendo qualche riga di codice per lasciare che i dati siano visibili come gg/mm/aaaa per ragioni pratiche, ma sarei curioso di sapere se mi sfugge qualcosa perchè non sono riuscito a trovare evidenza di limitazioni nell'uso di FIND con i formati di data o specifiche come debba essere usato. Stesso discorso per Match...

Grazie per suggerimenti.

gianniC

Se serve posso allegare un foglio con il vba che uso.

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

5 risposte

Ordina per: Più utili
  1. Anonimo
    2024-11-20T22:31:21+00:00

    Ciao

    Sto per aprire una discussione fornendo un piccolo file che mostra i problemi che ho rilevato e spiegando quale penso sia la causa di ciò.

    Grazie per il tuo supporto

    gianniC

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2024-11-18T13:48:41+00:00

    L'elenco delle date è visualizzato come gg/mm/aaaa nel foglio excel.

    Ho quindi provato con un elenco dove la data è visualizzata come numero e uso sempre una delle celle da un elenco che ha un elenco di date nello stesso formato.. Uso lo stesso metodo di cui sopra (ovviamente usando intervallo che si riferisce al range di date nel formato numero e numData dove la data è in formato numerico.

    Tutto viene localizzato perfettamente.

    Ho visto che nel foglio excel la funzione CONFRONTA.X(elemDaTrovare, elencoDoveCercare,modo) usando le celle visualizzate come gg/mm/aaaa funziona perfettamente ed ho provato ad usare questa con VBA in questo modo

    var = Application.Match(numData, intervallo, 0) dove var è una variabile long.

    Anche in questo caso se uso Match con i valori numerici trovo la posizione perfettamente, ma se passo a gg/mm/aaaa ancora non ottengo la posizione...

    È molto probabile che le date in elenco in realtà siano testi. La CONFRONTA.X funziona perché probabilmente converte le date in numeri. Il VBA, se non gli dici espressamente di farlo, non lo fa. Cerca una data tra stringhe e non la trova.

    Prova, in una colonna d'appoggio, ad usare =DATA.VALORE(elencoDate) e poi a sfruttare questo per richiamare il Find. Se funziona, allora converti direttamente le date nella colonna originale, ad esempio con Dati -> Testo in colonne.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2024-11-18T08:17:33+00:00

    La risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o parole insolite.

    Ho ricevuto la tua risposta, ti assicuro. Per favore, dammi un po' di tempo per testarlo. Non sono un esperto di programmazione e VBA non rientra nell'ambito di supporto della comunità. Studiare le questioni relative alla programmazione è solo un mio hobby. Discuterò con te ulteriori domande correlate tramite messaggio privato.

    Buona Giornata!

    Tommaso

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2024-11-18T08:05:46+00:00

    Thomas good morning

    I'm going to open a new discussion supplying the example of the problem I think I've identified both with FIND and MATCH

    Thanks for you replies

    gianniC

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2024-11-18T06:05:31+00:00

    La risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o parole insolite.

    Ciao GianniC50,

    Grazie per il tuo post nella community Microsoft.

    Non sono ancora del tutto sicuro del motivo per cui non hai recuperato accuratamente la corrispondenza. Ho aggiunto la macro completa e l'ho eseguita:

    Sub test()
    
        Dim rifData As Variant
    
        Dim interval As Range
    
        Dim startRep As Range
    
        Dim repPos As Long
    
        Dim y As Range
    
        rifData = "11/18/2024"
    
        Set interval = ThisWorkbook.Sheets("Sheet1").Range("A1:A100")
    
        Set startRep = ThisWorkbook.Sheets("Sheet1").Range("B1")
    
        repPos = 0
    
        With interval
    
            Set y = .Find(What:=rifData, LookIn:=xlValues, LookAt:=xlWhole)
    
            If Not y Is Nothing Then
    
                startRep.Offset(repPos, 2).value = y.Address
    
                startRep.Offset(repPos, 2).Interior.Color = vbGreen
    
            Else
    
                startRep.Offset(repPos, 2).value = "N/A"
    
            End If
    
        End With
    
    End Sub
    

    E il risultato è stato il seguente: 

    Sembra che dovrebbe essere il risultato corretto.

    Inoltre, il motivo per cui il comando:

    var = Application.Match(numData, intervallo, 0)

    non funziona è probabile che la funzione che hai descritto come CONFRONTA. X è in realtà questa funzione: CONFRONTA. X (funzione CONFRONTA. X) - Supporto tecnico Microsoft.

    Ma non c'è CONFRONTA. Funzione X disponibile per la chiamata in VBA. Invece nel comando citato sopra, si chiama questa funzione: CONFRONTA (funzione CONFRONTA) - Supporto tecnico Microsoft

    Sono funzioni diverse, quindinon restituiranno lo stesso risultato.

    Ho abilitato l'autorizzazione per i messaggi privati. Puoi condividere la cartella di lavoro di Excel con le macro abilitate tramite messaggio privato e ti aiuterò a risolvere i problemi.

    Attendo con ansia la tua risposta!

    Migliori saluti

    Thomas C - MSFT | Specialista del supporto della community Microsoft

    La risposta è stata utile?

    0 commenti Nessun commento