Hola a todos:
Como estoy a punto de comenzar las vacaciones (ya casi puedo oler el mar), hoy voy a escribir un post para despedirme hasta dentro de unos días.
Para el post de hoy voy a utilizar una consulta de un lector como planteamiento:
Sería posible una UDF que permitiera contar distintos. Es decir, una fórmula similar a SUMAR.SI.CONJUNTO pero que contara solo el valor único y no repetidos. Por si no me he explicado del todo bien, las nuevas tablas dinámicas (vinculadas a un modelo de datos) permiten el «recuento distinto», sería replicar esa posibilidad en una UDF.
Realmente (creo), que lo que se busca es una función que cuente los valores únicos en un rango seleccionado, o lo que es lo mismo, los valores distintos.
Para realizar este ejercicio, lo voy a hacer con datos numéricos, aunque nuestro código siempre tratará la información como un texto, dado que trabajaremos con «string» o cadenas de texto.
Vamos con un ejemplo:
Aquí tenemos una relación de números no repetidos del 1 al 45, en cada celda un número. Es decir que los valores únicos en este caso son «45».
Para obtener este dato vamos a utilizar una función que acabo de crear y que llamaré: «CONTARUNICOS»
Este es el código:
Function CONTARUNICOS(ByVal target As Range)
'Declaramos variables
Dim Cuenta As Long, matriz As Variant
Dim Dato As String, celda As Variant
Dim i As Long, oDic As Object
Dim Unicos As String
'Recorremos todas las celdas incluidas en el rango
For Each celda In target
Dato = Dato & " " & celda
Next celda
'Creamos una matriz con la cadena anterior
matriz = Split(Dato, " ")
'Creamos objeto diccionario para seleccionar solo únicos
Set oDic = CreateObject("scripting.dictionary")
For i = 0 To UBound(matriz)
If Not oDic.Exists(matriz(i)) Then oDic.Add matriz(i), matriz(i)
Next i
'Una vez que tenemos string de únicos, contamos espacios en blanco +1
Unicos = Trim(Join(oDic.Keys, " "))
Cuenta = UBound(Split(Unicos, " ")) + 1
'Pasamos el valor a la función
CONTARUNICOS = Cuenta
End Function
Así, el resultado de la función es:
Si tuviésemos, por ejemplo, la columna D con números del 1 al 45, el resultado sería el mismo:
Si incluimos nuevos datos, que no estén repetidos, la función los contará.
Y eso es todo, espero que con esta función haya respondido la duda del lector y os sirva también en vuestros proyectos.
PD: Nos vemos a la vuelta de las vacaciones : )
Descarga el archivo de ejemplo pulsando en: FUNCIÓN PARA CONTAR VALORES ÚNICOS EN UN RANGO
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies
Muy interesante. Da respuesta a una necesidad que surge con frecuencia. CONTAR.UNICOS debería ser una función integrada en la instalación. Yo lo resolví con una fórmula matricial: http://superalumnos.net/emulando-una-funcion-contarunicos-mediante-formulas-matriciales
Hola Ismael, sí conozco esa fórmula. Esta.muy bien solo solución con fórmula. Saludos
Hola, ¿Cómo adaptar la macro de tal forma que permita contar valores únicos en un rango filtrado? Gracias.
Aquí: https://excelsignum.com/2021/08/12/obtener-unicos-de-un-rango-filtrado-usando-funciones-de-matriz-dinamica/
Puedes hacer lo mismo con CONTARA(UNICOS(rango a contar))
Un saludo,
Sebas.
Ok, el motivo de crear la UDF es que en 2019 no existía la función únicos y ese fue El motivo de hacerlo en vba.
Gracias por la aportación.