excel-vba
Localización de valores duplicados en un rango
Buscar..
Introducción
En ciertos puntos, estará evaluando un rango de datos y necesitará ubicar los duplicados en ellos. Para conjuntos de datos más grandes, hay una serie de enfoques que puede utilizar que utilizan el código VBA o funciones condicionales. Este ejemplo utiliza una condición simple if-then dentro de dos bucles anidados para ver si cada celda del rango tiene el mismo valor que cualquier otra celda del rango.
Encuentra duplicados en un rango
Las siguientes pruebas van del A2 al A7 para valores duplicados. Observación: este ejemplo ilustra una posible solución como un primer acercamiento a una solución. Es más rápido usar una matriz que un rango y uno podría usar colecciones o diccionarios o métodos xml para verificar si hay duplicados.
Sub find_duplicates()
' Declare variables
Dim ws As Worksheet ' worksheet
Dim cell As Range ' cell within worksheet range
Dim n As Integer ' highest row number
Dim bFound As Boolean ' boolean flag, if duplicate is found
Dim sFound As String: sFound = "|" ' found duplicates
Dim s As String ' message string
Dim s2 As String ' partial message string
' Set Sheet to memory
Set ws = ThisWorkbook.Sheets("Duplicates")
' loop thru FULLY QUALIFIED REFERENCE
For Each cell In ws.Range("A2:A7")
bFound = False: s2 = "" ' start each cell with empty values
' Check if first occurrence of this value as duplicate to avoid further searches
If InStr(sFound, "|" & cell & "|") = 0 Then
For n = cell.Row + 1 To 7 ' iterate starting point to avoid REDUNDANT SEARCH
If cell = ws.Range("A" & n).Value Then
If cell.Row <> n Then ' only other cells, as same cell cannot be a duplicate
bFound = True ' boolean flag
' found duplicates in cell A{n}
s2 = s2 & vbNewLine & " -> duplicate in A" & n
End If
End If
Next
End If
' notice all found duplicates
If bFound Then
' add value to list of all found duplicate values
' (could be easily split to an array for further analyze)
sFound = sFound & cell & "|"
s = s & cell.Address & " (value=" & cell & ")" & s2 & vbNewLine & vbNewLine
End If
Next
' Messagebox with final result
MsgBox "Duplicate values are " & sFound & vbNewLine & vbNewLine & s, vbInformation, "Found duplicates"
End Sub
Dependiendo de sus necesidades, el ejemplo puede modificarse; por ejemplo, el límite superior de n puede ser el valor de la fila de la última celda con datos en el rango, o la acción en caso de una condición True If puede editarse para extraer el duplicado valor en otro lugar. Sin embargo, la mecánica de la rutina no cambiaría.
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow