Aiuto su istruzione Range().find

di il
15 risposte

Aiuto su istruzione Range().find

Buongiorno. 

Ho risolto il problema ma non riesco a cancellare il post.

Sorry.

15 Risposte

  • Re: Aiuto su istruzione Range().find

    In questi casi non devi cancellare ma lasciare il post iniziale e dire come hai risolto, il forum serve anche a questo

  • Re: Aiuto su istruzione Range().find

    Ciao oregon hai ragione.

    Mi sono accorto che, per esempio, l'istruzione Range(B2:p2").find("Nome) non funziona se si cerca il valore su una sola riga.

    Funziona se scrivo Range("B2:P3").find("Nome")

    In questo caso viene coinvolta nella ricerca una porzione di celle non solo una riga e la ricerca va a buon fine.

    Non chiedermi il perchè....l'ho scoperto casualmente e magari (da ignorante patentato quale sono), la cosa per voi è normale.

    Grazie per la disponibilità e pazienza.

  • Re: Aiuto su istruzione Range().find

    26/05/2025 - Premuroso ha scritto:

    Mi sono accorto che, per esempio, l'istruzione Range(B2:p2").find("Nome) non funziona se si cerca il valore su una sola riga.

    Funziona se scrivo Range("B2:P3").find("Nome")

    Ciao,

    non dare false notizie o false speranze  ;-)      ... un range è un range, che sia su una riga o su più righe nulla cambia, sempre range è.

    Come usi la Find ?  

    Esempio,  prova a provare a scrive questo:

    Dim cellFind As Range
    Set cellFind = Range("B2:P2").Find("YourValueFind", LookIn:=xlValues, LookAt:=xlWhole)
    
    If Not cellFind Is Nothing Then MsgBox cellFind.Address & " - " & cellFind.Value, vbInformation Else MsgBox "No Match", vbCritical
  • Re: Aiuto su istruzione Range().find

    26/05/2025 - Premuroso ha scritto:

    In questo caso viene coinvolta nella ricerca una porzione di celle non solo una riga e la ricerca va a buon fine.

    naaaaaa.... 

    guarda, esempio Find solo su una riga :

  • Re: Aiuto su istruzione Range().find

    Ciao By65Franco.

    ... un range è un range, che sia su una riga o su più righe nulla cambia, sempre range è. 

    Infatti quello che pensavo anch'io.

    Il tuo codice funziona. Le estensioni che hai scritto le avevo anch'io utilizzate.

    Probabilmente ho fatto io qualche cazzata che poi ho sistemato (senza accorgermene) quando ho re-inserito il range su doppia riga.

    PS: Ora vado (se riesco) a recuperare un errore, ancora con Range().find, che ho avuto quando cercavo una data specifica.

    Se non ricordo male, le celle da controllare avevano un riferimento ad altre, poste su un altro foglio, e avevano la formattazione data "gggg gg yyy".

    Quando ricercavo una data (es:24/05/2025) con range("A1":A10")find(Data, LookIn:=xlValues, LookAt:=xlWhole)) avevo Nothing.

    Se cambiavo la formattazione delle celle con generale, appariva il numero seriale della data e con quello, utilizzando ancora "Data", me la trovava.

    Per ora grazie mille.

  • Re: Aiuto su istruzione Range().find

    Buongiorno.

    Approfitto della vostra pazienza.

    Sono riuscito a ricreare il problema sopra descritto.

    Non avendo mai utilizzato l'istruzione range().find mi sono trovato in difficoltà.

    Di seguito il link . il file è da scaricare.

    Grazie.

    https://drive.google.com/open?id=11VJiGk7NeZ2lLHjtnPhwi1KzcRrUIxRy&usp=drive_copy

  • Re: Aiuto su istruzione Range().find

    Ciao,

    se posso permettermi, sei partito da una richiesta per arrivare ad un altra, etc...

    devo dirti che non capisco proprio cosa devi fare di preciso.

    - qual'è lo scopo dell'applicazione?

    - come deve intaragire l'utente?

    - quali sono le informazioni da trattare il volume e di che tipo?

    Vedi , quello che voglio dire è che se non presenti in modo esaustivo il progetto e/o il problema, cosa, dove e quando si devono eseguire talune azioni, diventa veramente difficile capire di cosa hai bisogno.

    Diventa difficile trovare una soluzione che risponda alle tue esigenze.

    Alla fine si rischia di fare mille esempi e che nessuno di questi sarà o attinente e/o fattibile per lo scopo specifico che ti sei posto.

    Parli di Range Find function ma non la conosci e non sai come adoperarla, però vuoi utilizzare proprio quasta function per eseguire una certa ricerca. 
    Ma le ricerche si possono fare in tanti altri modi e con altre function, non per forza con la Find, dipende dai contesti e scenari.

    Concludendo, emerge che devi fare una certa ricerca e che la devi fare con la Find, ...ma la Find non la conosci e non sai come usarla e cosa fa.
    A me pare che ci siano molte cose che non tornano, credimi... così è molto difficile procedere.

    Potresti cortesemente descrivere bene il progetto ?

  • Re: Aiuto su istruzione Range().find

    26/05/2025 - Premuroso ha scritto:

    Non avendo mai utilizzato l'istruzione range().find mi sono trovato in difficoltà.

    Giusto appunto quello che ti dicevo nel post precedente ;-)

    Se devi ricercare nei valori di tipo Date, la Range.Find è la meno indicata e crea problemi. 
    Perchè ?   Semplice, perchè non puoi controllare i valori nelle celle coinvolte nella ricerca.
    Questo può comportare anche errori bloccanti. Vedere per celle vuote e/o con valori non di tipo Date, etc. etc...

    In questo caso la ricerca va eseguita con altre tecniche, controlli e validazioni. (dove, come, quando...)

    Esempio:

     :
    Ma ripeto, le ricerche si possono fare in diversi modi, tutto dipende dal contesto, dallo specifico scenario.
    Se non sei esaustivo in questo, è impossibile dare una risposta corretta e adeguata.

  • Re: Aiuto su istruzione Range().find

    Ciao ByFranco.

    Ho sempre adoperato, per la ricerca, dei cicli For Next e dopo aver trovato il dato, Exit For.

    Ho letto che Range().find era più veloce. Non avendolo mai utilizzato, volevo provarci ma mi sono scontrato con le date.

    Ora che mi confermi che si possono avere problemi a gestirle con Find(), lascio perdere.

    In sintesi ho dei fogli di lavoro in cui, verticalmente nella colonna A ho degli orari ( A1=00,01 - a2=00,02 ecc fino a ...=23,59).

    Orizontalmente ho delle date progressive (ES: B1=OGGI() - C2=dato1 - D2=dato2 - E2=dato 3 - F1=OGGI()+1 - G2= dato1 - ecc ) che coprono un mese.

    Nella ricerca devo trovare il giorno del viaggio da programmare, la vettura o autista da impegnare, l'orario di partenza e quello ipotizzato di arrivo.

    Questo per gestire, in un foglio, la disponibilità delle vetture e in un altro degli autisti. 

    "Dato" sta per il nome delle vetture o degli autisti. Numero vetture 15 e autisti 30.

    La ricerca degli orari e dei giorni l'ho risolta poi semplicemente con un calcolo matematico essendo dati progressivi sempre uguali.

    Mi rimaneva solo il nome degli autisti e vetture che ho risolto con find(), ma prima usavo for next e funzionava uguale.

    Il tutto poi è gestito nel primo foglio di programmazione viaggi che esclude, inserito il giorno e l'orario del viaggio da programmare, le vetture e gli autisti già impegnati in altri viaggi nell'arco di un mese.

    Tutto ok funziona bene. 

    Ciao e grazie ancora.

  • Re: Aiuto su istruzione Range().find

    Ciao ByFranco.

    Se ti può interessare ho registrato un breve video

    https://drive.google.com/file/d/11_Irq1TTX1-5IN435Qd_Apyz9M50Koca/view?usp=sharing

  • Re: Aiuto su istruzione Range().find

    Ciao,

    Come ho accennato in precedenza, tutto dipende dai vari scenari e contesti.

    Pertanto caso per caso si deve sceglere la tecnica più adatta allo scopo specifico e sempre se sussistono le condizioni.

    Nel caso specifico che hai esposto:

    1. premesso che le celle di un certo range contengono delle date e una formattazione particolare
    2. premesso che il numero di celle da leggere da un certo range è abbastanza contenuto
    3. premesso che la ricerca deve essere di tipo "Esatto" ,deve restituire un valore esattamente uguale a quello ricercato

    :

    • il tipo di ricerca range.find non è consigliato :
      • non consente di controllare le singole celle del range per verificare se il dato è coerente con il tipo Date posto in ricerca.
        • potrebbe andare bene solo se si è al100% sicuri che le celle sono popolate tutte in modo corretto, con lo stesso formato, etc...
    • il tipo di ricerca consigliabile potrebbe essere :
      • un ciclo for each sul range di celle
        • valutare se le celle in lettura contengono un valore di tipo Date
        • convertire il valore delle celle in lettura e della data da ricercare, nello stesso tipo per effettuare un confronto coerente.
          • questo consente di lavorare anche con formattazioni date di qualsiasi tipo, anche diverse tra di loro
            • per esempio: se un giorno si decide di formattare le date in modo diverso, non ci si deve preoccupare di modficare la function con il codice di ricerca.

    :
    In considerazione delle premesse sopra riportate, personalmente agirei in questo modo:

    ' DEMO FIND DATE
    Public Sub MyFindDate()
        Dim valueFind As Variant
        Dim cellRange As Range
        Dim cell As Range
        Dim cellFind As Range
    
        ' Set find value
        valueFind = Range("B2").Value
        ' Set cells range
        Set cellRange = Range("B4:J4")
        
        ' Reset interior color
        cellRange.Interior.ColorIndex = xlNone
        
        ' Check is not valid date
        If Not IsDate(valueFind) Then
            MsgBox "Value to search is not a valid date", vbExclamation
            Exit Sub
        End If
    
        ' Search value
        For Each cell In cellRange
            If IsDate(cell.Value) Then
                If CDate(cell.Value) = CDate(valueFind) Then
                    Set cellFind = cell
                    Exit For
                End If
            End If
        Next cell
    
        ' Display result
        If Not cellFind Is Nothing Then
            ' Set interior color
            cellFind.Interior.Color = vbYellow
            ' Message show
            MsgBox cellFind.Address & " - " & cellFind.Value, vbInformation
        Else
            MsgBox "No Match", vbCritical
        End If
        
    End Sub

    E' un semplicissimo esempio in Demo dove si evidenzia alcuni controlli di validazione prima di eseguire la ricerca e all'interno della ricerca stessa:

    • si effettua la ricerca solo se il valore da ricercare corrisponde a un tipo Date : If Not IsDate(valueFind)
    • si effettua il controllo nel ciclo for each se la cella in fase di lettura è di tipo Date : If IsDate(cell.Value) Then
    • si effettua il confronto convertendo la data da ricercare e il valore della cella in fase di lettura, nello stesso tipo : If CDate(cell.Value) = CDate(valueFind) Then
    • alla fine della ricerca :
      • se cellFind, oggetto range, risulta popolato vuol dire che la ricerca è andata a buon fine : restituisce l'oggetto range dove poter prelevare il Valore, l'Indirizzo, etc...
      • se cellFind, oggetto range, NON risulta popolato vuol dire che la ricerca è fallita : l'oggetto range restituisce Nothing 

    :
    N.B. 
    La Sub di esempio può essere trasformata in una Function parametrizzata che restituisce un oggetto range per valutare l'esito della ricerca
    Esempio:

    Function di ricerca   (viene riportata nel moduloo di codice vba MyModSearch dell'excel Demo)

    ' SEARCH DATE CELLS
    Public Function MySearchDate(ByVal cellRange As Range, ByVal valueFind As Variant) As Range
        Dim cell As Range
        ' Check is not valid date
        If Not IsDate(valueFind) Then
            MsgBox "Value to search is not a valid date", vbExclamation
            Exit Function
        End If
        ' Search
        For Each cell In cellRange
            If IsDate(cell.Value) Then
                If CDate(cell.Value) = CDate(valueFind) Then
                    ' Function return value
                    Set MySearchDate = cell
                    Exit Function
                End If
            End If
        Next cell
    End Function
    

    Come richiamare la Function di ricerca... esempio:

            ' Search execute
            Dim resultSearch As Range
            Set resultSearch = MySearchDate(Me.Range("B2:J2"), Me.Range("B10"))
            
            ' Retrieve return value
            If Not resultSearch Is Nothing Then
                Me.Range("B12").Value = resultSearch.Value
                Me.Range("B13").Value = "Cell Range: " & resultSearch.Address
            Else
                Me.Range("B12").Value = "No Match"
                Me.Range("B13").Value = ""
            End If

    Questo esempio si trova nel Foglio3 dell'excel Demo e nel Modulo di Codice Vba  MyModSearch ...
    inserendo una data da ricercare, viene ritornato il range dove si trova la corrispondenza (la data in valore e l'indirizzo della relativa cella:

    Qui si può scaricare l'excel con i tre metodi di ricerca, quest'ultimo e quelle illustrate in precedenza :
    https://www.transfernow.net/dl/20250527QoxBRah8

    Note:
    Fare attenzione, sono solo degli esempi, le stesse cose possono essere realizzate con metodi e tecniche diverse, per il proprio utilizzo verificare e implementare eventuali controlli.

  • Re: Aiuto su istruzione Range().find

    By65Franco sei stato chiarissimo.

    Prenderò esempio dal tuo codice anche per progetti futuri.

    L'istruzione range().find qui non viene utilizzata su date e i dati da ricercare (Vetture e Autisti volontari) non sono inseriti manualmente ma scelti da una lista.

    Sia il valore da ricercare sia la serie di dati su cui si fà la ricerca derivano da una lista comune pre-inserita quindi si ha la certezza che il dato esista.

    GRAZIE ancora per l'impegno (anche troppo) e il tempo che mi hai dedicato.

    Ciao.

  • Re: Aiuto su istruzione Range().find

    Nota extra:

    La function riportata nella demo, nel precedente post, può essere tranquillamente anche usata nelle formule.

    In questo esempio: 

    • si scrive in una cella la formula =MySearchDate(B2:J2;B10)   
    • come parametri si passa :
      • il range di celle dove effettuare la ricerca:  B2:J2
      • la cella dove reperire la data da ricercare :  B10
    • e la Function restituisce alla cella il valore che ha trovato

    :
    N.B.
    Non conviene ovviamente, esistono ben altre funzioni per effettuare le ricerche... vale solo come esempio.  ;-)

  • Re: Aiuto su istruzione Range().find

    27/05/2025 - Premuroso ha scritto:

    L'istruzione range().find qui non viene utilizzata su date e i dati da ricercare (Vetture e Autisti volontari) non sono inseriti manualmente ma scelti da una lista.

    Sia il valore da ricercare sia la serie di dati su cui si fà la ricerca derivano da una lista comune pre-inserita quindi si ha la certezza che il dato esista.

    Ottimo direi...

    la cosa importante è capire quando conviene utilizzare una tecnica oppure un altra secondo il contesto.

    Gli esempi possono sempre essere utili, fanno accendere un idea alla quale non si pensava fino a poco prima.

    Ma alla fine, come in tutte le cose, è importante prevenire qualsiasi tipo di errore, intercettare eventuali problemi prima che si possano verificare. 
    Vedo molti che si affidano al OnError Go To e altri che non lo prendono assolutamente in considerazione. 

    Personalmente cerco di usare il meno possibile OnError, solo in certe situazioni dove non potresti farne a meno in assenza di alternative... 
    preferisco effettuare controlli preventivi prima di usare oggetti e variabili.

    Nel tuo caso avendo solo scelte da effettuare con valori già preconfezionati, già hai molti vantaggi rendendo il progetto sempre più stabile e robusto.

    Buon lavoro ...  alla prox.

Devi accedere o registrarti per scrivere nel forum
15 risposte