Hoy es el primer post que escribo después del nacimiento de mi hija Alicia, sin duda la mejor experiencia de mi vida!!. Han sido unos días muy intensos y felices y por fortuna todo ha salido muy bien.

Como comprenderéis no tengo demasiado tiempo últimamente, y ese el motivo de tardar tanto tiempo en publicar una actualización.

El tema de hoy es una consulta que me envían al blog sobre la función “Contar.Si” y la posibilidad de automatizarla en una hoja Excel mediante macros.

Me ha parecido un ejercicio interesante, sobre todo ver la forma en la que podemos introducir una fórmula en el código que vamos a utilizar. ¿Empezamos?

Como viene siendo habitual intentaré ilustrar el proceso con un ejemplo, que es la mejor forma de aprender. Imaginad que tenéis un listado en una columna con 199 nombres, (en el ejemplo he utilizado las bases de datos del INE en donde podéis encontrar, por ejemplo, los nombres más usados en los últimos nacimientos). Estos son los nombres:

FUNCION CONTAR.SI EN VBA

Y nos piden dos consultas:
– Contar las veces que se repiten cada uno de los nombres y colocar el resultado en la columna B.
– Contar las veces que se repiten unos nombres en particular, y colocar el resultado en la columna C.

Para la primera consulta utilizaremos la siguiente macro:

Sub ContarSi()
Dim i As Double
Dim final As Double
'Limpiamos los contenidos de la columna B
Worksheets("DATOS").Range("B2:B65000").Select
Selection.ClearContents
'Calculamos el rango de los datos en la columna A
Worksheets("DATOS").Select
final = Application.CountA(Worksheets("DATOS").Range("a:a"))
For i = 2 To final
'Contamos las veces que se repiten cada uno de los nombres en el rango seleccionado
Nombres = Worksheets("DATOS").Cells(i, 1).Value
Worksheets("DATOS").Cells(i, 2).Value = Application.CountIf(Worksheets("DATOS").Range("A1:A" & final), Nombres)
Next
End Sub

Como podéis apreciar, incluimos la función Contar.Si mediante la siguiente sentencia:

Application.CountIf(Worksheets("DATOS").Range("A1:A" & final), Nombres)

De esta forma hacemos referencia a la sintaxis del rango establecido en el que contaremos Range(«A1:A» & final) y el criterio que es «Nombres» y que es igual a Worksheets(«DATOS»).Cells(i, 1).Value

El resultado de la macro lo colocaremos en la segunda columna, quedando así la información:

FUNCION CONTAR.SI EN VBA_1

Para la segunda consulta utilizaremos la siguiente macro:

Sub ContarSiV()
Dim i As Double
Dim final As Double
'Limpiamos los contenidos de la columna C
Worksheets("DATOS").Range("C2:C65000").Select
Selection.ClearContents
'Calculamos el rango de los datos en la columna A
Worksheets("DATOS").Select
final = Application.CountA(Worksheets("DATOS").Range("a:a"))
For i = 2 To final
Nombres = Worksheets("DATOS").Cells(i, 1).Value
'Mediante una condición contamos las veces que se repiten los nombres elegidos
If Nombres = "IGNACIO" Or Nombres = "MARIA" Or Nombres = "TERESA" Then
Worksheets("DATOS").Cells(i, 3).Value = Application.CountIf(Worksheets("DATOS").Range("A1:A" & final), Nombres)
End If
Next
End Sub

En este caso estamos delimitando que la función solamente cuente aquellos nombres que hemos establecido en la condición (IGNACIO, MARIA Y TERESA), el resto quedan en blanco. El resultado es el siguiente:

FUNCION CONTAR.SI EN VBA_2

Para facilitar las pruebas os he colocado dos botones para ejecutar cada uno de los códigos por separado.

Este ejemplo también puede ser muy útil para introducir cualquier tipo de función, tan solo tendréis que adaptar la sintaxis a VBA, por ejemplo: sumar.si, sumaproducto, contar.si.conjunto … etc.

Espero que os haya resultado de utilidad y que lo podáis integrar con éxito en vuestros proyectos de VBA

Descarga el archivo de ejemplo pulsando en: FUNCION CONTAR.SI EN VBA