Ciao Ale,
prova questo file di test e vedi se fa quello che chiedi.
Questo il link:
https://www.dropbox.com/s/qx3a2lasek1t0ee/identificare%20i%20duplicati%20di%20una%20tabella.xls?dl=0
Questo il codice dove è presente la precedente funzione per verificare il metodo di comparazione e una nuova procedura che dovrebbe assegnare un numero identico ad ogni duplicato (partendo dal primo duplicato che viene incontrato e aumentandolo progressivamente di fronte a ciascun successivo duplicato) e non ai codici "singoli" o agli spazi vuoti presenti nella colonna dei codici.
'---
Option Explicit
Public Function fCompareMode() As Long
'<--- funzione che imposta il metodo di comparazione del testo --->
Dim Wb As Workbook
Dim WsIstruzioni As Worksheet
Dim rngCompareMode As Range
Set Wb = ThisWorkbook
Set WsIstruzioni = Wb.Worksheets("Istruzioni")
Set rngCompareMode = WsIstruzioni.Range("Q5")
If rngCompareMode = True Then
fCompareMode = vbBinaryCompare 'Case Sensitive
Else
fCompareMode = vbTextCompare 'Non Case Sensitive
End If
Set Wb = Nothing
Set WsIstruzioni = Nothing
Set rngCompareMode = Nothing
End Function
Sub NumeraDuplicati()
Const sWsName As String = "Articoli" 'nome foglio articoli
Const HeadRow As Long = 5 'numero riga dove sono presenti le intestazioni di colonna
Const sRngCodArt As String = "U" 'lettera colonna dove sono presenti i codici degli articoli
Const sRngLastRow As String = "AB" 'lettera colonna dove rilevare l'ultimo record
Const sRngColNum As String = "R" 'lettera colonna dove inserire i numeri dei duplicati
Const chrSeparatore As String = "," 'carattere che unisce le righe in cui si trovano i codici articolo rispetto alla matrice
Dim Twb As Workbook
Dim WsArticoli As Worksheet
Dim RngFirstRow As Range
Dim RngLastRow As Range
Dim RngFirstCodArt As Range
Dim RngLastCodArt As Range
Dim rngColNum As Range
Dim ArrayDatiArt() As Variant
Dim ArrayNumDupl() As Variant
Dim i As Long
Dim dictDatiArt As Object
Dim dictObj As Variant
Dim ArrayRigheDupl As Variant
Dim OptCompareMode As Long
Dim valCodArt As Variant
Dim Cont As Long
Set Twb = ThisWorkbook
Set WsArticoli = Twb.Worksheets(sWsName)
With WsArticoli
Set RngFirstRow = .Range(sRngLastRow & HeadRow)
Set RngLastRow = .Range(sRngLastRow & .Cells(.Rows.Count, sRngLastRow).End(xlUp).Row)
If RngLastRow.Row - RngFirstRow.Row <= 1 Then Exit Sub
Set RngFirstCodArt = .Range(sRngCodArt & RngFirstRow.Offset(1).Row)
Set RngLastCodArt = .Range(sRngCodArt & RngLastRow.Row)
Set rngColNum = .Range(.Range(sRngColNum & RngFirstRow.Offset(1).Row), .Range(sRngColNum & RngLastRow.Row))
ArrayDatiArt = .Range(RngFirstCodArt, RngLastCodArt).Value
End With
ReDim ArrayNumDupl(LBound(ArrayDatiArt, 1) To UBound(ArrayDatiArt, 1), 1 To 1)
OptCompareMode = fCompareMode
Set dictDatiArt = CreateObject("Scripting.Dictionary")
dictDatiArt.CompareMode = OptCompareMode
For i = LBound(ArrayDatiArt, 1) To UBound(ArrayDatiArt, 1)
If OptCompareMode = vbBinaryCompare Then
valCodArt = ArrayDatiArt(i, 1)
ElseIf OptCompareMode = vbTextCompare Then
valCodArt = UCase(ArrayDatiArt(i, 1))
End If
If Not dictDatiArt.Exists(valCodArt) Then
dictDatiArt.Add valCodArt, i
Else
dictDatiArt(valCodArt) = dictDatiArt(valCodArt) & chrSeparatore & i
End If
Next i
Cont = 0
For Each dictObj In dictDatiArt.Keys
If dictObj <> "" Then
If UBound(Split(dictDatiArt(dictObj), chrSeparatore)) Then
Cont = Cont + 1
ArrayRigheDupl = Split(dictDatiArt(dictObj), chrSeparatore)
For i = LBound(ArrayRigheDupl) To UBound(ArrayRigheDupl)
ArrayNumDupl(CLng(ArrayRigheDupl(i)), 1) = Cont
Next i
End If
End If
Next dictObj
With WsArticoli
'.Unprotect
rngColNum.Value = (ArrayNumDupl)
'.Protect
End With
End Sub
'---
Spero riesca nell'intento ma lascio a te le verifiche più approfondite in base al tuo reale DB.
ciao