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
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"