Estrarre indirizzi cellle da ciclo for

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
andre.274
00martedì 13 settembre 2016 14:27
Buongiorno a Tutti,

Sub Find_Matches()
Dim x, y As Variant
' Set CompareRange equal to the range to which you will
' compare the selection.

Range("B1:B4000").Clear

base = Sheets("Home").Range("A2:A3602")
Dati = Sheets("Dati").Range("AN237:AN686")

For Each x In base 'x encoder
For Each y In Dati
If x = y Then Cells(x + 2, 2) = x
Next y
Next x

End Sub

ho questa macro che mi confronta due collone di dati e mi inserisce i valori uguali in una terza colonna.

è possibili ricavare gli indirizzi delle celle trovate uguali nella colonna "dati".

Grazie mille
Buona giornata
by sal
00martedì 13 settembre 2016 14:43
Ricerca dati
Ciao Andre ti modifico la tua macro

Sub Find_Matches() 
Dim x, y As Variant 
' Set CompareRange equal to the range to which you will 
' compare the selection. 

Range("B1:B4000").Clear 

base = Sheets("Home").Range("A2:A3602") 
Dati = Sheets("Dati").Range("AN237:AN686") 

For Each x In base 'x encoder 
    For Each y In Dati 
        If x = y Then 
            Cells(x + 2, 2) = x 
            Cells(x + 2, 3) = x.row & x.column ' indirizzo foglio Home
            cells(x + 2, 4) = y.row & y.column ' indirizzo foglio dati
       end if
    Next y 
Next x 

End Sub 


l'ho fatta al volo, non ricordo se sia Column oppure Columns, nel caso modifica, scrive le due celle del confronto in C-D se qualcuna non serve, oppure serve invertita Riga-Colonna, fai le correzioni, altrimenti lo dici e le correggo.

Ciao By Sal [SM=x423051]

andre.274
00martedì 13 settembre 2016 14:49
mi da errore qui
dice necessario oggetto.. non è perché x e y sono solo numeri?

ho provato a modificare column

Grazie
patel45
00martedì 13 settembre 2016 15:22
prova a dimensionare x e y as range, se non risolvi allega un file di esempio
andre.274
00martedì 13 settembre 2016 15:30
per ora ho risolto con questa

Sub evidenzia()
                                        'ActiveSheet.Range("A2:A3602").Interior.PatternColorIndex = xlNone

    For Each cella In Sheets("DT1").Range("AN237:AN686")
        With Sheets("Home").Range("A2:A3602")
            Set Rng = .Find(What:=cella, After:=.Cells(.Cells.Count), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
                If Not Rng Is Nothing Then
                    Sheets("Home").Cells(cella + 2, 2) = cella.Address 'cella.Interior.ColorIndex = 3
                End If
            End With
    Next cella
    
End Sub
andre.274
00martedì 13 settembre 2016 15:31
sto cmq cercando delle formule utili che mi aiutino a confrontare due data base. avete trattato già argomenti simili?
scossa
00martedì 13 settembre 2016 15:50
Re: Ricerca dati
by sal, 13/09/2016 14.43:


Sub Find_Matches() 
Dim x, y As Variant 
....
base = Sheets("Home").Range("A2:A3602") 
Dati = Sheets("Dati").Range("AN237:AN686") 

...

            Cells(x + 2, 3) = x.row & x.column ' indirizzo foglio Home

... 





Ciao,

state facendo un mix tra array e range, questo perché non dichiarate correttamente le variabili.

Nel caso in esame x è un elemento dell'array base, mentre y è un elemento dell'array Dati.

se vuoi che base e Dati siano dei range (e quindi poter utilizzare le proprietà row etc) devi usare l'istruzione:

set base = Sheets("Home").Range("A2:A3602")
set Dati = Sheets("Dati").Range("AN237:AN686")

ma tutto il codice è da rivedere in base al tipo di variabile che si decide di usare.


andre.274
00martedì 13 settembre 2016 15:52
si esatto sarebbe perfetto rivederlo potendo usare le proprietà row e via dicendo
andre.274
00martedì 13 settembre 2016 16:15
la macro cosi modificata funziona,

ora vorrei sostituire

Set base = Sheets("Home").Range("A2:A3602")
Set dati = Sheets("DT1").Range("AN237:AN686")

con:

Set base = Sheets("Home").Range("A2:A3602")
Set dati = Sheets("DT1").Range(Cells(2, 40), Cells(15000, 40))


ma non va... da errore
dodo47
00martedì 13 settembre 2016 16:57
Re:
andre.274, 13/09/2016 16.15:


ora vorrei sostituire

Set base = Sheets("Home").Range("A2:A3602")
Set dati = Sheets("DT1").Range("AN237:AN686")

con:

Set base = Sheets("Home").Range("A2:A3602")
Set dati = Sheets("DT1").Range(Cells(2, 40), Cells(15000, 40))

ma non va... da errore



Qual è l'errore?

Ti è già stata ricordata l'importanza del dimensionamento delle variabili.
Dim x, y As Variant equivale a: Dim x, y

2 e 15.000 sono due variabili?, altrimenti che necessità hai di scrivere:
Set dati = Sheets("DT1").Range(Cells(2, 40), Cells(15000, 40))
(che comunque non è errata)
al posto di:
Set dati = Sheets("DT1").Range("N2, N150000").

Posta tutta la routine.

saluti
andre.274
00martedì 13 settembre 2016 17:16
vi posto tutto il file e cerco di spiegarvi cosa deve fare;

io ho due tabelle, una nel foglio HOME e una nel foglio DT1.


nel foglio DT1 nella collona AN ho gli impulsi si un encoder e questi mi fanno da riferimento nel foglio HOME.

Nel foglio HOME nella colonna A ho gli stessi impulsi da 0 a 3600.

la macro cosa fa: per ogni valore di encoder confronta i dati nella tabella HOME con la tabella DT1, divisi per colonna, e se nella tabella DT1 sono diversi li segna di rosso.

ora questa macro è LENTISSIMA... anzi di piu..

io l'ho impostata per lavorare solo con i primi 50 valori.. e ci mette un minuto.. dovrebbe lavorare con 12000.

attenzione dopo l'esecuzione della macro il file passa da 3mb a 30mb

se qualcuno può aiutarmi a velocizzarla mi farebbe un gran favore.


Grazie a Tutti.



andre.274
00martedì 13 settembre 2016 17:26
scossa
00martedì 13 settembre 2016 20:43
Re:
andre.274, 13/09/2016 16.15:


con:

Set base = Sheets("Home").Range("A2:A3602")
Set dati = Sheets("DT1").Range(Cells(2, 40), Cells(15000, 40))


ma non va... da errore




Non posso scaricare il file ora, ma scommetto che il foglio attivo quando esegui la macro è Home, quindi nell'istruzione
 Set dati = Sheets("DT1").Range(Cells(2, 40), Cells(15000, 40))

Cells, senza specificarne la paternità, appartiene al foglio Home (il parent della proprietà Cells), quindi non puoi assegnarlo ad un range del foglio Dati.

LA soluzione quindi è quella di premettere a Cells il riferimento al foglio Dati.
andre.274
00mercoledì 14 settembre 2016 09:28
si di sicuro è per quello!

Buongiorno a Tutti, oggi continuo con lo sviluppo del file e con cercare di velocizzare la macro!

Grazie a Tutti
dodo47
00mercoledì 14 settembre 2016 13:12
Ciao
solo per curiosità, mi spieghi a cosa servono queste due istruzioni? :

Sheets("Home").Cells(x + 2, 3) = riga
Sheets("Home").Cells(x + 2, 4) = colonna ' indirizzo foglio dati

te lo chiedo perché, prendiamo il primo encoder 1711, poiché è ripetuto sia in riga 2 che in riga 3 di dt1, in Home col. C e D riga 1713, al primo passaggio ti trovi 2 e 4, al secondo il 2 e 4 vengono sovrascritti con 3 e 4, e così per tutti gli altri.

Ripeto, è solo una curiosità.

(per evitare che il file cresca a dismisura, togli Pattern da:

Sheets("DT1").Range("A2:ZZ15000").Interior.PatternColorIndex = xlNone

quindi:

Sheets("DT1").Range("A2:ZZ15000").Interior.ColorIndex = xlNone

se non hai problemi in tal senso.

saluti
andre.274
00mercoledì 14 settembre 2016 13:42
ciao dodo47,

nulla quelle due righe scrivono gli indirizzi su cui sta lavorando la macro ma li ho usati solo per verifica che stesse facendo giusto.

ora li tolgo e tolgo anche il Pattern (che non so a cosa serva) :)
andre.274
00mercoledì 14 settembre 2016 14:48
questo è il punto a cui sono arrivato, tralasciando il pulsante importa, la parte critica è sul pulsante confronta
andre.274
00mercoledì 14 settembre 2016 14:50
ora la macro è veloce xke confronta solo 20 righe, il totale dovrebbe essere 15000 righe


        Set dati = wd.Range("AN2:AN20")




in questo punto si va a scrivere AN15000 al posto di AN20


macro "importazione"
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 13:15.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com