DOPPIO CICLO FOR EACH LENTO
Hai un problema con Excel? 
DOPPIO CICLO FOR EACH LENTO
di nichicanta data: 16/07/2013 16:52:30
Un saluto a tutti gli amici di questo bellissimo forum,ho realizzato questo codice che mi permette di colorare un valore trovato in base ad una condizione, ma il ciclo rallenta molto quando i dati da controllare sono molti.
Vi chiedo se c'è la possibilità di ottenere lo stesso risultato con un codice molto più veloce e che mi confronti il dato della colonna h con quelli presenti dalla colonna A alla G.
P.S. solo per curiosità,(non ho provato poichè devo perfezionare e ottimizzare questo codice) ma una cella colorata in base ad una condizione è cosi visibile in una textbox quando la si scorre su una userform con una barra di scorrimento laterale oppure no?
In attesa di una vostra risposta Vi saluto con simpatia e stima.
Sub prova_colora_celle()
' esegue la ricerca sul foglio sulla base dei dati inseriti nelle colonne
Dim Cl, Cb As Object
Dim zona1, zona2 As Range
Set zona1 = Sheets("Foglio1").Range(("A1"), Range("A1").End(xlDown)) ' l'intervallo dei dati presenti
Set zona2 = Sheets("Foglio1").Range(("b1"), Range("b1").End(xlDown))
For Each Cl In zona1
For Each Cb In zona2
If Cl.Value = Cb.Value Then
MsgBox "uguale"
Cl.Font.ColorIndex = 3
Else
MsgBox "diverso"
Cl.Font.ColorIndex = 0
End If
Next
Next
Set Cl = Nothing
Set Cb = Nothing
Set zona1 = Nothing
Set zona2 = Nothing
End Sub
|
di Vecchio Frac data: 17/07/2013 11:18:27
Io non sono sicuro che il codice funzioni come ti aspetti.
Ad ogni passaggio ogni valore della prima zona viene confrontato con ogni valore della seconda zona.
Quindi anche se ti viene trovato un valore uguale (e viene colorato di rosso), poi i successivi confronti mostrano che quel dato non corrisponde più e quindi viene ricolorato a zero.
La domanda che ti faccio è: vuoi confrontare solo se due valori sulla stessa riga sono uguali? oppure devi controllare che un valore della prima lista sia presente nella seconda lista? L'ottimizzazione passa anche da questa domanda importante ^_^
La risposta al p.s. è no, la textbox non è una rich text box (quindi non permette formattazioni di carattere) e comunque è indipendente dal contenuto del foglio (quel che appare nel foglio non è formattato uguale nell'userform se non lo formatti tu così nello stesso modo via codice).
di nichicanta (utente non iscritto) data: 17/07/2013 11:57:32
Ciao V.F. grazie sempre di tutto.
Vorrei controllare un range di celle ad es.a1:f6500 e colorare la cella che in corrispondenza della stessa riga e nella colonna ad es. h contiene lo stesso valore.
spero die ssere stato chiaro.
Ti saluto.
di Vecchio Frac data: 17/07/2013 13:52:30
Eccoti il codice rivisto.
Dovresti sempre dichiarare esplicitamente le variabili al loro giusto tipo ("dim zona1, zona2 as range" non attribuisce il tipo range a zona1, bensì il tipo variant).
La zona2 non ti serve, come pertanto la variabile Cb.
Il valore di confronto si trova a "n" colonne di scarto dopo quella che si sta esaminando, quindi devi adattare quell'1 nell'Offset a seconda di dove giacciono i dati d confronto rispetto alla colonna A.
Option Explicit
Sub prova_colora_celle()
' esegue la ricerca sul foglio sulla base dei dati inseriti nelle colonne
Dim Cl As Range, zona1 As Range
Set zona1 = Sheets("Foglio1").Range("A1", [A1].End(xlDown)) ' l'intervallo dei dati presenti
For Each Cl In zona1
If Cl = Cl.Offset(, 1) Then 'confronta ogni riga con il valore della colonna a fianco
Cl.Font.ColorIndex = 3 'valore uguale, stessa riga
Else
Cl.Font.ColorIndex = 0 'valore diverso
End If
Next
End Sub |
di nichicanta (utente non iscritto) data: 17/07/2013 15:39:29
Scusami V.F. se non ti ho fatto capire bene la mia esigenza.
Vorrei analizzare il dato presente in un range di celle ( A1:d65000) e confrontarlo con quello presente nella riga corrispondente e presente nella colonna adiacente, in questo caso colonna E.
Una volta trovata la corrispondenza del dato (cioè il duplicato), la cella si dovrebbe colorare di un colore (a scelta).
Ti saluto, perdonatemi se non sono immediatamente comprensibile.
di Vecchio Frac data: 17/07/2013 15:59:59
Quindi una cosa così?
Viene esaminato il range tra A1 e D... (dipende dal numero di righe presenti in colonna A), se viene trovata una corrispondenza con il valore presente nella stessa riga, in colonna E, il testo della cella col valore duplicato diventa di colore rosso.
Option Explicit
Sub prova_colora_celle()
' esegue la ricerca sul foglio sulla base dei dati inseriti nelle colonne
Dim Cl As Range, zona1 As Range
Set zona1 = Sheets("Foglio1").Range("A1", "D1:D" & [A1].End(xlDown).Row) ' l'intervallo dei dati presenti
For Each Cl In zona1
If Cl = Cells(Cl.Row, "E") Then 'confronta ogni cella con il valore della colonna E
Cl.Font.ColorIndex = 3 'valore uguale, stessa riga
Else
Cl.Font.ColorIndex = 0 'valore diverso
End If
Next
End Sub |
di nichicanta (utente non iscritto) data: 17/07/2013 16:19:11
Esattooooo. Grazie infinite V.F.
Un saluto affettuoso e sincero a tutti voi.
A breve contribuirò anch'io al mantenimento di questo forum bellissimo e simpatico (mi riferisco atutti Voi che mi siete diventati simpatici al primo momento)
di Vecchio Frac data: 17/07/2013 16:21:09
Sono contento che ti siamo simpatici... puoi marcare come "Risolta" allora ^_^
di nichicanta (utente non iscritto) data: 17/07/2013 16:22:04
Ok, saluti
Vuoi Approfondire?