PDA

View Full Version : Excel: leggi, confronta, esprimi le differenze...


Gannjunior
16-06-2009, 20:33
Ciao,

nel titolo ho piu o meno riassunto la funzione che mi servirebbe.

problema: due colonne affiancate con dei nomi (composti anche da piu parole). Vorrei costruire una funzione che mi legga i dati di una colonna e dell'altra. Li confronti. E mi evidenzi in ciascuna colonna le differenze (magari con colori differenti). Cioè deve evidenziare nella prima colonna quello che non è contenuto nella seconda. Idem dall'altra parte.

Cioè


COLONNA 1 COLONNA 2

a a
b g
c c
d f
e e
.... ......


In pratica voglio che la funzione nella colonna 1 mi evidenzi b, d che non ci sono nella colonna2. E che nella colonna2 mi evidenzi g ed f che non sono contenuti nella colonna1.

Spero di essere stato chiaro.
Riuscite ad aiutarmi?

Grazie!

zuper
16-06-2009, 23:43
prova ad usare questa macro

Sub Differenze()
Dim col_a As Integer
Dim col_b As Integer

range("a1:a15").Interior.ColorIndex = 3
range("b1:b15").Interior.ColorIndex = 4
For col_a = 1 To 15
For col_b = 1 To 15
Set curcell_a = Worksheets("Sheet1").Cells(col_a, 1)
Set curcell_b = Worksheets("Sheet1").Cells(col_b, 2)
If curcell_b.Text = curcell_a.Text Then curcell_b.Interior.ColorIndex = 2
Next col_b
Next col_a

For col_b = 1 To 15
For col_a = 1 To 15
Set curcell_a = Worksheets("Sheet1").Cells(col_a, 1)
Set curcell_b = Worksheets("Sheet1").Cells(col_b, 2)
If curcell_a.Text = curcell_b.Text Then curcell_a.Interior.ColorIndex = 2
Next col_a
Next col_b


End Sub

Gannjunior
17-06-2009, 00:06
ciao!!
grazie della risposta intanto!

la sto provando, mi da errore alla riga 9.

john_revelator
17-06-2009, 00:13
Non ho provato la macro di zuper (che saluto :) ) ma io la risolverei con un semplice conta.se


Sub Differenze()
Dim cella As Range
Dim contaSE As Integer
Range("a1:b10").Interior.ColorIndex = xlNone
For Each cella In Range("a1:a10")
contaSE = Application.WorksheetFunction.CountIf(Range("b1:b10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 3
End If
Next cella

For Each cella In Range("b1:b10")
contaSE = Application.WorksheetFunction.CountIf(Range("a1:a10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 4
End If
Next cella

End Sub

Gannjunior
17-06-2009, 00:24
grazie anche a te john!

l'ho provata funziona!!

scusate ragazzi ma se volessi imparare un pochino a tradurre ciò che voglio fare in questo linguaggio e farlo come avete fatto voi come posso fare?

grazie!!

john_revelator
17-06-2009, 00:29
IMHO per iniziare la cosa migliore da fare è svolgere normalmente le azioni che fai su excel e tramite il registratore di macro osservare il codice che viene generato. In questo modo impari i nomi dei metodi, delle proprietà, eccetera. Poi se fai una ricerca su google usando come chiave di ricerca "excel vba" trovi materiale a iosa.

Inoltre non puoi fare a meno dell'msdn della microsoft

http://msdn.microsoft.com/en-us/library/dd627239.aspx

:)

zuper
17-06-2009, 08:05
ciao!!
grazie della risposta intanto!

la sto provando, mi da errore alla riga 9.

beh nella riga 9 c'è specificato il foglio di lavoro...il mio era sheet1..lo standard in inglese....dovevi solo adattarlo :)

Non ho provato la macro di zuper (che saluto :) ) ma io la risolverei con un semplice conta.se


Sub Differenze()
Dim cella As Range
Dim contaSE As Integer
Range("a1:b10").Interior.ColorIndex = xlNone
For Each cella In Range("a1:a10")
contaSE = Application.WorksheetFunction.CountIf(Range("b1:b10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 3
End If
Next cella

For Each cella In Range("b1:b10")
contaSE = Application.WorksheetFunction.CountIf(Range("a1:a10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 4
End If
Next cella

End Sub


ehehehe ricambio il saluto :)

come molte volte capita in excel ci sono + soluzioni per molti dei problemi...dipende solo da quella che si pensa prima...e molte volte nn si pensa alla + semplice...come in questo caso il contase :D

Gannjunior
17-06-2009, 09:00
ok zuper, funziona adesso!

però ho un problema ragazzi. la vostra funzione di fatto fa questo: se la a25 è diversa dalla b25 allora lo segnala. in realtà deve verificare se l'esatto contenuto della cella a25 è contenuto nell'altra colonna, a prescindere dal fatto che si trovi o meno in b25. Quindi devo anche poter confrontare una colonna1 lunga che so 100 contro una colonna2 lunga 105...

Fatemi sapere, grazie! :)

zuper
17-06-2009, 09:11
ok zuper, funziona adesso!

però ho un problema ragazzi. la vostra funzione di fatto fa questo: se la a25 è diversa dalla b25 allora lo segnala. in realtà deve verificare se l'esatto contenuto della cella a25 è contenuto nell'altra colonna, a prescindere dal fatto che si trovi o meno in b25. Quindi devo anche poter confrontare una colonna1 lunga che so 100 contro una colonna2 lunga 105...

Fatemi sapere, grazie! :)

ho dato una letta veloce alla macro di john e credo che il "problema" sia lo stesso della mia:
abbiamo usato come RANGE a1:a10 e b1:b10

con la mia, ma mi pare di vedere anche con la sua, devi solo modificare questo range fino a dove vuoi! :) nella mia devi anche modificare:
For col_a = 1 To 15 e tutti gli altri chiaramente fino al numero che + ti aggrada ;)


la mia fa un check di ogni singola cella della colonna a con tutte le celle della colonna b e viceversa, quindi indipendentemente dal fatto che a25 sia in b25 e così via.

quella di john esegue un banale contase...quindi anche la sua le controlla tutte :)

zuper
17-06-2009, 09:26
Non ho provato la macro di zuper (che saluto :) ) ma io la risolverei con un semplice conta.se


Sub Differenze()
Dim cella As Range
Dim contaSE As Integer
Range("a1:b10").Interior.ColorIndex = xlNone
For Each cella In Range("a1:a10")
contaSE = Application.WorksheetFunction.CountIf(Range("b1:b10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 3
End If
Next cella

For Each cella In Range("b1:b10")
contaSE = Application.WorksheetFunction.CountIf(Range("a1:a10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 4
End If
Next cella

End Sub


sorry john :D:D
stavo provando la tua macro per curiosità e ho visto che fa i check anche sulle celle vuote :D:D

e mi PERMETTO di fare una piccolissima aggiunta :D

Sub Differenze()
Dim cella As Range
Dim contaSE As Integer
Range("a1:b10").Interior.ColorIndex = xlNone
For Each cella In Range("a1:a10")
If cella.Value <> "" Then
contaSE = Application.WorksheetFunction.CountIf(Range("b1:b10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 3
End If
End If
Next cella

For Each cella In Range("b1:b10")
If cella.Value <> "" Then
contaSE = Application.WorksheetFunction.CountIf(Range("a1:a10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 4
End If
End If
Next cella

End Sub

john_revelator
17-06-2009, 11:03
sorry john :D:D
stavo provando la tua macro per curiosità e ho visto che fa i check anche sulle celle vuote :D:D

e mi PERMETTO di fare una piccolissima aggiunta :D

Sub Differenze()
Dim cella As Range
Dim contaSE As Integer
Range("a1:b10").Interior.ColorIndex = xlNone
For Each cella In Range("a1:a10")
If cella.Value <> "" Then
contaSE = Application.WorksheetFunction.CountIf(Range("b1:b10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 3
End If
End If
Next cella

For Each cella In Range("b1:b10")
If cella.Value <> "" Then
contaSE = Application.WorksheetFunction.CountIf(Range("a1:a10"), cella.Value)
If contaSE = 0 Then
cella.Interior.ColorIndex = 4
End If
End If
Next cella

End Sub

Non avevo considerato quell'eventualità. Giusta osservazione. ;)

ses4
17-06-2009, 21:20
Ciao,

nel titolo ho piu o meno riassunto la funzione che mi servirebbe.

problema: due colonne affiancate con dei nomi (composti anche da piu parole). Vorrei costruire una funzione che mi legga i dati di una colonna e dell'altra. Li confronti. E mi evidenzi in ciascuna colonna le differenze (magari con colori differenti). Cioè deve evidenziare nella prima colonna quello che non è contenuto nella seconda. Idem dall'altra parte.

Cioè


COLONNA 1 COLONNA 2

a a
b g
c c
d f
e e
.... ......


In pratica voglio che la funzione nella colonna 1 mi evidenzi b, d che non ci sono nella colonna2. E che nella colonna2 mi evidenzi g ed f che non sono contenuti nella colonna1.
...

Il problema si può risolvere con la formattazione condizionale:
- seleziona l'intervallo di colonna 1 da controllare
- dalla barra dei menù seleziona Formato>Formattazione condizionale>La formula è
- nella casella di testo insersci questa formula adattanto ovviamente i riferimenti alle tue esigenze:
=CONTA.SE($B$1:$B$7;$A1)
-scegli la formattazione, per es. carattere rosso, e dai l'ok
tutte le parole di colonna 1 contenute in colonna 2 diventeranno rosse
seleziona l'intervallo di colonna 2 che ti interessa e fa lo stesso, ovviamente la formula ora sarà:
=CONTA.SE($A$1:$A$7;$B1)
Ciao

zuper
17-06-2009, 21:55
Il problema si può risolvere con la formattazione condizionale:
- seleziona l'intervallo di colonna 1 da controllare
- dalla barra dei menù seleziona Formato>Formattazione condizionale>La formula è
- nella casella di testo insersci questa formula adattanto ovviamente i riferimenti alle tue esigenze:
=CONTA.SE($B$1:$B$7;$A1)
-scegli la formattazione, per es. carattere rosso, e dai l'ok
tutte le parole di colonna 1 contenute in colonna 2 diventeranno rosse
seleziona l'intervallo di colonna 2 che ti interessa e fa lo stesso, ovviamente la formula ora sarà:
=CONTA.SE($A$1:$A$7;$B1)
Ciao

sembra ok ;)

la provo! :D