Mi pare l’ennesima puntata della serie “shit in, shit out” (se non si e’ rigorosi nell’inputazione dei dati fare la loro conciliazione e abbastanza ...complicato).
Ti propongo questa macro:
- Codice: Seleziona tutto
Sub ConfrontaXA()
Dim cArr, dArr, CheckCol As Range, BaseCol As Range
Dim TestSeq, myMatch, OPos As Range
Dim I As Long, J As Long
'
Set OPos = Range("I1") '<<< La prima di 4 colonne LIBERE che saranno usate per il report
'
TestSeq = Array("C", "D", "C", 0, 1)
Range(Range("C2"), Cells(Rows.Count, "D").End(xlUp)).Interior.Color = xlNone 'Toglie colorazione da C e D
OPos.Resize(1, 4).EntireColumn.ClearContents 'Pulisce le colonne da usare per il report
Debug.Print
For J = 0 To 1 'prima C vs D poi D vs C
Set BaseCol = Range(Cells(2, TestSeq(J)), Cells(2, TestSeq(J)).End(xlDown))
Set CheckCol = Range(Cells(2, TestSeq(J + 1)), Cells(2, TestSeq(J + 1)).End(xlDown))
Debug.Print "Check " & BaseCol.Address(0, 0) & " Vs " & CheckCol.Address(0, 0)
cArr = BaseCol.Value
dArr = CheckCol.Value
For I = 1 To UBound(cArr)
myMatch = Application.Match(cArr(I, 1), dArr, False)
If Not IsError(myMatch) Then
'se trovato: cancella (nella matrice) e colora giallo (sul foglio)
dArr(myMatch, 1) = ""
CheckCol.Cells(myMatch, 1).Interior.ColorIndex = 6
Else
'se NON trovato, colora in Rosso sul foglio
BaseCol.Cells(I, 1).Interior.Color = vbRed
End If
Next I
OPos.Offset(1, J * 2 + TestSeq(J + 3)).Resize(UBound(cArr), 1).Value = cArr 'La matrice di origine
OPos.Offset(1, J * 2 + 1 - TestSeq(J + 3)).Resize(UBound(dArr), 1).Value = dArr 'I valori "non cancella"
Next J
OPos.Resize(1, 4).Value = Array("' --C contro D--", "", "' --D contro C--", "")
End Sub
Il caodice va messo in un Modulo standard, e la riga marcata <<< deve puntare alla prima di 4 colonne libere che saranno azzerate e poi compilate dalla macro.
La macro confronta ogni valore di C contro la colonna D; se trova un riscontro colora in Giallo il riscontro su colonna D, se non lo trova colora in Rosso il valore di colonna C. Ovviamente ogni “riscontro” viene eliminato dalla lista in modo da non essere utilizzato più di una volta (e in questo modo, per tornare al valore 2.5 di cui avevo detto nel primo messaggio, rimarranno 5 valori in rosso nella colonna C)
Poi viene ripetuto il controllo (colonna D contro C)
Gli stessi risultati vengono riportati poi in quattro colonne che indicano analiticamente
-tutti i valori di colonna C
-quali valori di colonna D non erano presenti in colonna C
-quali valori di colonna C non erano presenti in colonna D
-tutti i valori di colonna D
Spero che sia di qualche utilità...