Vba Find



  • Vba Find
    di Raffaele_53 (utente non iscritto) data: 09/01/2013 09:19:12

    Un saluto a Voi
    1) Non sono certo, sembrerebbe che il FIND qualche volta sbagli. Lo una lista composta da Utente1,Utente2,Utente3, ecc ecc Utente20 .
    In un ciclo For se cerco Utente1 alcune volte trova l'Utente15, altre Utente17.
    C'è un opzione da mettere per trovare proprio il valore esatto.
    2) Se invece di Utente1 ci fosse una formula che mi dà il risultato Utente1, la macro va in errore Tipo 91.

    Grazie mille
     
    Set Lista = Range(Cells(7, 22), Cells(riga2, 22))
    NomeA = Cells(x, 16).Value
    rigaA = Lista.Find(NomeA).Row



  • di Luca.Donati data: 09/01/2013 09:42:21

    Ciao.
    Mi vengono in mente due cose:

    1)
    Ho letto un giorno che il comando Find non restituisce un valore, ma un indirizzo. Se non trova il valore preciso si ferma non so più se l'ultimo precedente o il primo successivo...
    Insomma, forse non è "proprio" così, ma qualcosa del genere.
    Sta di fatto che invece di usare Find "direttamente" lo si può "sviare" ed usarlo indirettamente.

    2)
    se nella cella hai una formula, magari bisogna specificare a Find di cercare nel valore restituito

    Garda il pezzetto di codice qui sotto se ti può servire come suggerimento.
    Buona fortuna e fai sapere.
     
    Set risp = .Find(cosacerco, LookIn:=xlValues)
    If Not risp Is Nothing Then
    Fadd = risp.Address
    ' bla bla bla...
    end if



  • di HarryBosch data: 09/01/2013 11:08:51

    Se cerchi sulla guida "metodo Find", potrai conoscere tutti gli argomenti di cui dispone tale metodo:
    espressione.Find(Trova, Dopo, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, FormatoRicerca)

    Se utilizzi delle formule ti ha detto bene Luca, si deve aggiungere l'argomento "LooKIn" per dirgli appunto di verificare i valori.
    Se devi cercare un valore per intero allora dovresti aggiungere anche l'argomento "LookAt:=xlWhole" per dirgli di confrontare l'intero contenuto della cella.

    Per gestire un eventuale errore, dovuto al fatto che find non trovi alcuna corrispondenza, l'idea di Luca va bene se imposti la variabile rigaA come Range; che non ferma l'errore nel modo in cui lo hai utilizzato, dove invece si potrebbe inserire un ResumeNext prima dell'istruzione (se non trova nulla passa all'istruzione successiva)
    Vedi i due esempi sotto.
     
    Set Lista = Range(Cells(7, 22), Cells(riga2, 22))
    NomeA = Cells(x, 16).Value
    On Error Resume Next
    rigaA = Lista.Find(NomeA, LookIn:=xlValues, LookAt:=xlWhole).Row
    
    
    'oppure:
    Set Lista = Range(Cells(7, 22), Cells(riga2, 22))
    NomeA = Cells(x, 16).Value
    set rigaA = Lista.Find(NomeA, LookIn:=xlValues, LookAt:=xlWhole)
    If rigaA Is Nothing Then 
    	MsgBox "nessuna corrispondenza"
    Else
    	r = rigaA.Row
    Endif
    



  • di Raffaele_53 (utente non iscritto) data: 09/01/2013 11:17:09

    Perfetto con
    rigaA = Lista.Find(NomeA, LookIn:=xlValues, LookAt:=xlWhole).Row
    Sia formule che valore esatto (non erano problemi di mancanza nomi)
    Di nuovo grazie.....(eppure l'avevo provato)



  • di Raffaele_53 (utente non iscritto) data: 10/01/2013 15:24:21

    Non saprei..., forse devo dire RISOLTO????
    Comunque GRAZIE a TUTTI



  • di HarryBosch data: 10/01/2013 15:32:02

    Si se ritieni conclusa la discussione.
    Eventualmente apri un nuovo thread per un altro argomento



  • di Raffaele_53 (utente non iscritto) data: 18/01/2013 12:35:05

    Scusatemi, c'è ancora due cose che non capisco...
    1) La macro funziona bene, come mai se nascondo (cioe se rimpicciolisco al riga) per non vederla la macro non funziona più (nessun errore)

    2) Ammettiamo in A1=1/1/2013
    In A2 = A1+1
    in A3 = A2+1
    ecc ecc
    Se cerco la data 4/1/2013 non la trova. Se in A4 metto 4/1/2013 la trova?
    Devo forse cercare il 41278 equivalente a 4/1/2013. Però non sò come?

    Grazie nuovamente



  • di Vecchio Frac data: 18/01/2013 13:26:30

    Usa DateValue:
    [A:A].Find(datevalue("04/01/2013")).select
    seleziona la cella contenente quella data, se c'è.





  • di Raffaele_53 (utente non iscritto) data: 18/01/2013 14:05:59

    Grazie ....
    In merito alla prima domanda che si riferiva al post iniziale.
    Mi sapresti dire il motivo che se nascondo la colonna/riga la macro non funziona?
    Di nuovo, un grosso saluto.



  • di Vecchio Frac data: 18/01/2013 14:22:43

    Il metodo Find è il corrispondente della finestra Trova, che fallisce (cioè non trova i dati cercati) se la riga/colonna sono nascoste.
    Per cercare qualcosa all'interno di righe o colonne nascoste puoi utilizzare un ciclo For per scandire il range e controllare il contenuto cella per cella.





  • di Raffaele_53 (utente non iscritto) data: 18/01/2013 22:15:47

    Scusami ancora,
    non riesco ad adattarlo
    NON CAPISCO COSA ABBIA IN TESTA CHE NON VA
     
    Sub Salva_Pulizia2()
    Application.ScreenUpdating = False
    Dim Ricerca1 As Range, Ricerca2  As Range, DData As Date
    Dim Dove1, Dove2, R1, R2, Nomi1, Nomi2, Nome, y, x, riga
    Sheets("DATI").Select
    Set Ricerca1 = Sheets("PULIZIA").Range("H1:IP1")
    Set Ricerca2 = Sheets("PULIZIA").Range("H69:IP69")
    Set Nomi1 = Sheets("PULIZIA").Range("A4:A19")
    Set Nomi2 = Sheets("PULIZIA").Range("A72:A87")
    riga = Range("Z" & Rows.Count).End(xlUp).Row
    For y = 29 To 56
    DData = Cells(1, y).Value' esempio 22/2/2013
    For x = 2 To riga
    If Cells(x, y) <> "" Then
    Nome = ""
    Nome = Cells(x, 26)
    Dove1 = 0
    Dove2 = 0
    R1 = 0
    R2 = 0
    On Error Resume Next
    Dove1 = Ricerca1.Find(DData, LookIn:=xlValues, LookAt:=xlWhole).Column
    Dove2 = Ricerca2.Find(DData, LookIn:=xlValues, LookAt:=xlWhole).Column
    If Dove1 <> 0 Then
    R1 = Nomi1.Find(LookIn:=xlValues, LookAt:=xlWhole).Row
    Sheets("PULIZIA").Cells(R1, Dove1) = Sheets("Dati").Cells(x, y)
    End If
    If Dove2 <> 0 Then
    R2 = Nomi2.Find(Nome, LookIn:=xlValues, LookAt:=xlWhole).Row
    Sheets("PULIZIA").Cells(R2, Dove2) = Sheets("Dati").Cells(x, y)
    End If
    End If
    Next x
    Next y
    MsgBox "Inserimento effettuato"
        Application.ScreenUpdating = True
    End Sub



  • di Raffaele_53 (utente non iscritto) data: 19/01/2013 10:53:55

    Risolto
    Dove1 = Ricerca1.Find(DateValue(DData), .....
    e mi mancava Nome1 in
    R1 = Nomi1.Find(LookIn:=.............
    Grazie lo stesso