metodo Find o analogo



  • metodo Find o analogo.
    di Luca_niubbo (utente non iscritto) data: 24/02/2015 12:51:17

    Rieccomi, con un dubbio proprio sul funzionamento del metodo FIND che mi avevate consigliato nella mia precedente richiesta di aiuto.

    L'obiettivo è verificare se all'interno di una cella specifica, è presente una data parola.

    Ho provato diversi tentativi, con 0 risultati :(

    1)con il primo esempio la variabile booleana "presenza_tuta" non viene mai valorizzata a true

    2)con il secondo esempio mi da questo errore-->variabile oggetto o variabile del blocco with non impostata

    3)analogo del punto 2



    please.
     
    1) 
    
     If CellaA.Offset(0, 3).Value Like "%tuta%" Then
        presenza_tuta = True
      Else
       presenza_tuta = False
      End If
    ###################
     
    2)
      If CellaA.Offset(0, 3).Find("%tuta%", LookIn:=xlValues) Then
        presenza_tuta = True
      Else
        presenza_tuta = False
      End If
    
    3)  presenza_tuta = CellaA.Offset(0, 3).Find("%tuta%", LookIn:=xlValues)
     If presenza_tuta = True Then
      sh1.Range("M1").Value = "trovata"
     Else
      sh1.Range("M2").Value = "non trovata"
     End If
    



  • di scossa data: 24/02/2015 14:24:01

    In VBA il carattere "jolly" è * non %, quindi "*tuta*"


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Luca_niubbo (utente non iscritto) data: 24/02/2015 14:51:13

    temo di essermi perso in un bicchiere d'acqua! grazie per l'hint!

    Però sono comunque curioso su come si può utilizzare il metodo Find...



  • di lepat (utente non iscritto) data: 24/02/2015 15:38:20

    il metodo find come lo hai usato tu restituisce un oggetto range, quindi non puoi verificare se è vero o falso, ma se esiste oppure no, cerca gli esempi sull'help



  • di scossa data: 24/02/2015 21:02:11

    cit. lepat : "il metodo find come lo hai usato tu restituisce un oggetto range"

    Ciao lepat,
    quello che dici non è corretto, nel senso che CellaA.Offset(0, 3).Find("%
    *tuta*", LookIn:=xlValues) in
    If CellaA.Offset(0, 3).Find("*tuta*", LookIn:=xlValues) Then

    restituisce la proprietà di default dell'oggetto range (.value), quindi - ammesso che ci sia una cella che contiene tuta - resituruirà quel valore, che non essendo un valore "VERO" verrà considerato dall'IF come "FALSO".

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Vecchio Frac data: 25/02/2015 09:57:21

    cit "restituisce la proprietà di default dell'oggetto range (.value)"
    ---> Strano, a me non accade così su questo Excel 2007. Scritta così l'istruzione, tenta di restituire proprio un oggetto Range, non il suo .Value, quindi il test non è sul vero o falso ma sull'esistenza o meno dell'oggetto (is nothing). Che è in fondo quello che diceva lepat.





  • di Luca_niubbo (utente non iscritto) data: 25/02/2015 11:21:44

    Ragazzi, grazie per le risposte, ma credo di essermi un po' perso.

    In ogni caso, ora il mio problema è diverso. Vorrei usare il metodo find per verificare il numero di occorrenze di una data parola in un range specificato.

    Purtroppo non mi sono neanche avvicinato al mio obiettivo visto che ho un problema sulla definizione di una variabile .row, che, usando l'option explicit come mi avevate consigliato, devo definire per forza.

    Al momento quindi mi da errore su: "Set ultimariga = sh1.Range("D65536").End(xlUp).Row" dicendomi "necessario oggetto".

    Perchè?
     
    Sub analisi_integrità()
     
      Dim sh1 As Worksheet
      Dim range_da_usare As Range
      Dim ultimariga As Integer
      Dim numero_tute As Integer
      
      Set sh1 = Worksheets("anagrafica")
      Set ultimariga = sh1.Range("D65536").End(xlUp).Row
      Set range_da_usare = sh1.Range("D2:" & ultimariga)
      
      
      Set numero_tute = sh1.range_da_usare.Find("*tuta*", LookIn:=xlValues).Count
      
      sh1.Range("P1").Value = numero_tute
     
    End Sub



  • di lepat (utente non iscritto) data: 25/02/2015 12:30:05

    basta eliminare Set



  • di lepat (utente non iscritto) data: 25/02/2015 12:33:31

    Set si usa con gli oggetti, un numero di riga non è un oggetto, ma una variabile



  • di scossa data: 25/02/2015 13:27:56

    cit. VF: "....tenta di restituire proprio un oggetto Range, non il suo .Value, quindi il test non è sul vero o falso "

    Non direi, o meglio: se Find trova una corrispondenza restituisce la proprietà di default (.value), a meno che non sia all'interno di una istruzione Set
    Set miavraibile = Cells.Find(.......)

    Se invece Find non trova una corrispondenza restituisce sempre Nothing.

    Fate una prova con questo semplice codice (dopo aver scritto alfa in una cella del foglio attivo):

    Sub prova()
    MsgBox Cells.Find("*lf*", LookIn:=xlValues)
    If Cells.Find("*lf*", LookIn:=xlValues) = "alfa" Then MsgBox "ok"
    Debug.Print Cells.Find("*bf*", LookIn:=xlValues) Is Nothing 'ERRORE
    End Sub


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Vecchio Frac data: 25/02/2015 13:45:41

    Non è una medaglia diversa, è una faccia diversa della stessa medaglia.
    Alla fine è solo un problema di conversione implicita. Il compilatore tenta di restituire il Value se può restituire l'oggetto range che espone questa proprietà.
    E se trovo "alfa" (perchè c'è alfa in una cella) l'ultima riga dell'esempio restituisce comunque Vero, non dà errore. Mentre se non c'è alfa nel foglio, ottengo errore sulle prime due righe. Proprio perchè non esiste l'oggetto cercato.
    Ma non stiamo dicendo cose diverse.





  • di scossa data: 25/02/2015 14:16:07

    Che il metodo Find restituisca un oggetto range lo so pure io (è scritto perfino nell'help), ma tu sai meglio di me che per attribuire un oggetto ad una variabile devi usare l'istruzione Set; altrimenti viene restituita, o se preferisci "esposta", la proprietà di default.

    Quindi visto che patel aveva detto: "il metodo find come lo hai usato tu restituisce un oggetto range" mentre l'uso che ne ha fatto l'OP non era all'interno di un'istruzione Set l'affermazione di patel è errata.

    P.S.:
    Nel mio esempio l'ultima riga doveva essere
    Debug.Print Cells.Find("*bf*", LookIn:=xlValues) 'ERRORE
    come si evinceva dal commento 'ERRORE, errore che come hai giustamente fatto notare non si presentava.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)




  • di Vecchio Frac data: 25/02/2015 14:51:43

    cit. "Che il metodo Find restituisca un oggetto range lo so pure io"
    ---> LOL





  • di Luca_niubbo (utente non iscritto) data: 25/02/2015 15:09:14

    grazie lepat per il suggerimento, ora va!

    Relativamente al find, non sono sicuro di aver capito tutto, però, considerando che io devo associato il risultato della find ad una variabile, credo di dover usare l'istruzione Set.

    Ora però mi dice: "impossibile trovare il metodo o il membro dei dati", evidenziando range_da_usare. Non capisco perchè non lo trova però...
     
    Sub analisi_integrità()
    
      Dim sh1 As Worksheet
      Dim range_da_usare As Range
      Dim ultimariga As Integer
      Dim numero_tute As Integer
      
      Set sh1 = Worksheets("anagrafica")
      ultimariga = sh1.Range("D65536").End(xlUp).Row
      Set range_da_usare = sh1.Range("D2:" & ultimariga)
      
      
      Set numero_tute = sh1.range_da_usare.Find("*tuta*", LookIn:=xlValues).Count
      
      sh1.Range("P1").Value = numero_tute
     
    End Sub



  • di lepat (utente non iscritto) data: 25/02/2015 16:14:12

    probabilmente non trova count, sei certo che sia una proprietà corretta per un range ?



  • di lepat (utente non iscritto) data: 25/02/2015 16:17:07

    scusa, avevo letto male, Set range_da_usare = sh1.Range("D2:" & ultimariga) non è corretto dovresti scrivere
     
    Set range_da_usare = sh1.Range("D2:D" & ultimariga)



  • di Luca_niubbo (utente non iscritto) data: 25/02/2015 17:11:57

    thx, effettivamente avevo scritto male. Purtroppo anche cambiandolo, l'errore è lo stesso.

    Range().Count esiste, non so se magari la sto usando male io per qualche motivo...



  • di scossa data: 25/02/2015 18:15:38

    cit.: "Set numero_tute = sh1.range_da_usare.Find("*tuta*", LookIn:=xlValues).Count"

    Set si usa per assegnare un oggetto ad una variabile, ma se tu in quella variabile vuoi memorizzare il valore di una proprietà (.Count) allora non devi usare Set.

    Quindi o usi la sintassi
    Set numero_tute = sh1.range_da_usare.Find("*tuta*", LookIn:=xlValues)
    oppure
    numero_tute = sh1.range_da_usare.Find("*tuta*", LookIn:=xlValues).Count
    avendo ovviamente dimensionato a coerenza la variabile nureo_rate (as Range nel primo caso, as Long nel secondo)




    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Luca_niubbo (utente non iscritto) data: 27/02/2015 10:47:29

    Ho optato per la seconda opzione, ma qualcosa non va. Sempre lo stesso errore ("impossibile trovare il metodo o il membro dei dati"), evidenziando proprio la variabile "range_da_usare"

    :(
     
    Option Explicit
    
    Sub analisi_integrità()
     
     Dim sh1 As Worksheet
      Dim range_da_usare As Range
      Dim ultimariga As Integer
      Dim numero_tute As Long
      
      Set sh1 = Worksheets("anagrafica")
      ultimariga = sh1.Range("D65536").End(xlUp).Row
      Set range_da_usare = sh1.Range("D2:D" & ultimariga)
      
      
     numero_tute = sh1.range_da_usare.Find("*tuta*", LookIn:=xlValues).Count
      
     
     sh1.Range("P1").Value = numero_tute
     
    End sub



  • di Luca_niubbo (utente non iscritto) data: 02/03/2015 11:15:42

    Nessuno?

    L'alternativa sarebbe fare un ciclo for, confrontare ogni cella e usare poi un contatore, ma vorrei proprio capire come usare questo find!



  • di Vecchio Frac data: 02/03/2015 11:33:55

    "impossibile trovare il metodo o il membro dei dati" ---> hai già qualificato "range_da_usare", non riqualificarlo durante il Find (cioè togli "sh1" davanti a "range_da_usare", vedi sotto).

     
    numero_tute = range_da_usare.Find("*tuta*", LookIn:=xlValues).Count






  • di Luca_niubbo (utente non iscritto) data: 02/03/2015 14:19:31

    Grazie per la risposta. Ora purtoppo da un altro messaggio di errore.

    "Variabile oggetto o variabile del blocco with non impostata", evidenziando questa riga "numero_tute = range_da_usare.Find("*tuta*", LookIn:=xlValues).Count"

    Non capisco: num_tute è definita, e non gli serve il Set...



     
    Option Explicit
    
    Sub analisi_integrità()
    
      Dim sh1 As Worksheet
      Dim range_da_usare As Range
      Dim ultimariga As Integer
      Dim numero_tute As Long
      
      Set sh1 = Worksheets("anagrafica")
      ultimariga = sh1.Range("D65536").End(xlUp).Row
      Set range_da_usare = sh1.Range("D2:D" & ultimariga)
      
      
      numero_tute = range_da_usare.Find("*tuta*", LookIn:=xlValues).Count
      
     
     sh1.Range("P1").Value = numero_tute
     
    End Sub



  • di Vecchio Frac data: 02/03/2015 15:21:44

    Accade perchè Find non trova alcuna corrispondenza e si arrabbia :)
    Preferibile quindi verificare se l'oggetto restituito da Find esiste oppure no.

    Comunque tu vuoi il conteggio degli elementi trovati... il codice visto finora non fa questo.
    Find ha bisogno di essere reiterato nel range (FindNext) e ha purtroppo la particolarità per cui si ferma solo quando ricomincia all'inizio del range di ricerca, perciò la prima riga deve essere ignorata perchè verrebbe conteggiata di due volte.
    Il codice seguente lavora bene (nota xlPart al posto degli asterischi).
    Ti lascio il gusto di studiarlo (non è complicato ed è uno schema che puoi riusare) ;)


     
    Option Explicit
    
    Sub analisi_integrità()
    
    Dim sh1 As Worksheet
    Dim range_da_usare As Range
    Dim ultimariga As Integer
    Dim item_found As Range, first_found As String, numero_tute As Long
      
        Set sh1 = Worksheets("anagrafica")
        ultimariga = sh1.Range("D65536").End(xlUp).Row
        Set range_da_usare = sh1.Range("D2:D" & ultimariga)
        
        numero_tute = 0
        With range_da_usare
            Set item_found = .Find("tuta", LookIn:=xlValues, LookAt:=xlPart)
            If Not item_found Is Nothing Then
                first_found = item_found.Address
                Do
                    Set item_found = .FindNext(item_found)
                    numero_tute = numero_tute + 1
                Loop While Not item_found Is Nothing And item_found.Address <> first_found
            End If
        End With
        
        sh1.Range("P1").Value = numero_tute
     
    End Sub






  • di Luca_niubbo (utente non iscritto) data: 03/03/2015 16:49:02

    Ti ringrazio molto per la tua risposta Vecchio Frac.

    Ho deciso di studiarmela, ma mi sembra che vada un po' oltre le mie conoscenze, quindi penso che proverò anche a realizzare la stessa cosa come dicevo prima, con un ciclo for confrontandoe ogni cella e usando poi un contatore, con istruzioni che già conosco.

    Mi ci vorrà un poco perchè causa problemi di salute devo rallentare con l'uso del pc. A prestissimo!



  • di Vecchio Frac data: 03/03/2015 18:40:20

    In bocca al lupo per la salute, ma ti rassicuro, niente id magico o misterioso. Solo il metodo Find applicato e reiterato.
    A presto!