Ciclo for next



  • Ciclo for next
    di rita (utente non iscritto) data: 08/09/2016 08:28:50

    >Ciao a tutti, e' un po che non accedo al sito e ben trovati
    Volevo porre un quesito per poter velocizzare una istruzioe
    mi spiego meglio, in un foglio excel ho un database di dati nelle celle da a1 fino a a150000
    ora in un'altra colonna es. colonna d posso avere da d1 sino a d50000 altri dati
    per trovare ogni singolo cella della colonna a in d utilizzo un ciclo for next (vedi sotto)
    non c'e' un modo per velocizzare un ciclo for next senza che questi si debba analizzare tutte le celle (il problema e' che se non trova tutti i dati nelle celle il ciclo diventa lentissimo)
    grazie



     
    for i = 1 to 150000
    for h _= 1 to 50000
    if range ("a"&I) = range ("d" &H) then
    range ("e"&I) = "trovato"
    end if
    next h
    next i
    



  • di patel data: 08/09/2016 09:01:04

    prova così 
     
    set rng = range("A1:A150000")
    for r= 1 to 50000
      set c =rng.find(range("d" & r) )
       If Not c Is Nothing Then range("E" & r ) = "trovato"
    next
    set rng = nothing
    set c = nothing
    






  • di rita (utente non iscritto) data: 08/09/2016 16:14:06

    Ti ringrazio ed effettivamente provandola su un database abbastanza corposo sembra essere molto piu' veloce
    Volevo chiederti come posso fare ad integrarla in questo modo ossia:
    invece di trovato vorrei che mi venisse riportato il valore della cella b adiacente.
    Mi spiego meglio: avendo dei dati nella colonna a e dei dati nella colonna b se trova il dato della cella a in d, invece di trovato mi deve riportare il valore corrispondente di b in colonna e
    Spero di essere stata chiara
    Grazie della collaborazione



  • di Vecchio Frac data: 08/09/2016 16:54:47

    cit. rita "invece di trovato mi deve riportare il valore corrispondente di b in colonna e "
    --_> Coraggio, un po' di sforzo, immaginazione e temerarietà. Il codice è autoesplicativo e adattarlo è semplicissimo.
    Devi individuare l'istruzione dove si assegna un dato alla cella della riga "r" della colonna "E", poichè "r" non cambia (e rappresenta la riga in cui trovasi il dato cercato), sei già in grado di fare la modifica per leggere il dato contenuto nella cella B della riga medesima.
    Però insomma dai, con un minimo di concentrazione ce la puoi fare :)





  • di Cucù data: 08/09/2016 17:04:42

    I valori della colonna A o quelli della colonna D sono univoci?



  • di rita (utente non iscritto) data: 08/09/2016 19:09:47

    No i valori non sono univoci
    per vecchio frac- ho capito l'istruzione come funziona il problema e' che non riesco ad associare un valore diverso da "a" ossia
    il valore che ho in a1 lo cerco in d e se lo trovo indico trovato in e
    il problema e' che se cerco il valore in a1 e lo trovo in d in e devo inserire il valore che ho in b1
    e' questo che non riesco a fare in quanto con due cicli for e next riesco ma diventa troppo lento
    le ho provate tutte ma qualcosa mi sfugge



  • di patel data: 08/09/2016 19:21:27

    non ho capito cosa vuoi, allega un PICCOLO file di esempio con i dati ed il risultato desiderato





  • di gaetanopr data: 08/09/2016 20:18:18

    Ciao, io userei un dictionary.
    Non ho excel su questo pc e quindi non ho potuto testare la macro.

    Qualcosa del genere dovrebbe funzionare abbastanza velocemente, volendo si potrebbe usare una matrice con i dati delle colonne A e B per velocizzare ancora la macro.
     
    Sub Main
    Dim Dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
       For i = 1 To 150000
          cell = range ("a"&i)
          If Dic.Exists(cell) = False Then 
              Dic.Add Key:= (cell), Item:= range ("b"&i)
            End if   
       Next i
    
    
       For i = 1 To 50000
          cell = range ("d"&i)
          If Dic.Exists(cell) = True Then 
              range ("e"&i).value = Dic.Item(cell)
           End if   
       Next i
     
     end sub 



  • di Rita (utente non iscritto) data: 09/09/2016 08:27:36

    La proposta di Gaetano e' quella dalla quale ottengo quello che mi aspettavo ma e' molto piu' lenta rispetto alla prima che aveva inserito "patel"
    Ti chiederei la cortesia non conoscendo quei comandi se me li potessi spiegare in modo tale da capire quello che fa e se si potesse in qualche modo velocizzare di piu'
    In ogni caso grazie



  • di gaetanopr data: 09/09/2016 09:23:52

    La macro si può velocizzare ma dato che ottieni risultati più veloci tramite il metodo Find ti conviene apportare la modifica alla macro di patel.
    Credo che Vecchio Frac ti abbia dato un indicazione non corretta
    Veccio Frac Cit: "Devi individuare l'istruzione dove si assegna un dato alla cella della riga "r" della colonna "E", poichè "r" non cambia (e rappresenta la riga in cui trovasi il dato cercato), sei già in grado di fare la modifica per leggere il dato contenuto nella cella B della riga medesima."
    La riga della colonna B da leggere in caso di dato trovato è quella corrispondente alla colonna A
    La modifica è semplice al posto di "trovato" devi indicare il dato presente nella colonna B, quindi sostituisci trovato con

     
    Range("b" & c.Row)



  • di rita (utente non iscritto) data: 09/09/2016 09:51:47

    Mi sono accorta di un qualcosa che non va ossia
    con find cerco un valore contenuto all'interno di una cella dentro il valore di un'altra
    invece per far si che l'evento sia ok le celle che si comparano devono essere dello stesso contenuto
    infatti se una cella ha 8 ed un'altra ha 88 queste per me sono sono uguali invece find cerca l'otto in 88 e mi dice ok va bene



  • di gaetanopr data: 09/09/2016 10:10:43

    Con il metodo Find è bene indicare sempre tutti gli argomenti in modo da evitare situazioni del genere, modifica così in modo da effettuare una ricerca esatta.
     
     
    Set c = Rng.Find(Range("d" & r), LookIn:=xlValues, LookAt:=xlWhole)