FUNCION CONTAR.SI EN VBA

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

Anuncios

14 pensamientos en “FUNCION CONTAR.SI EN VBA

  1. Excelente aplicativo estimado……..Le comento se puede adaptar este aplicativo o se puede hacer uno que lo pueda utilizar en consulta de 2 hojas en Excel en el mismo libro y/o dos libros distintos. Gracias

    Me gusta

  2. Hola Jose;

    Pues sí que se puede hacer lo que comentas, puedes verlo en el ejemplo que he subido a Google Drive pinchado en el siguiente enlace:
    https://drive.google.com/folderview?id=0B2MZVcPxjhyPflgtNDB5aHVUSkxPVkd1QzZyME9TZmFKa2FscUJNWTMwVklpblFVcWZ4YTA&usp=sharing

    Encontrarás una carpeta con dos archivos, uno de ellos es FUNCION CONTAR.SI EN VBA contiene las macros y los ejemplos para ir a consultar a otra página dentro del archivo. El otro archivo es parte del ejemplo para que pruebes a contar en “OTRO_LIBRO”.

    Para contar en otro libro, la forma de hacerlo y que me parece la mejor, es traerte la información que quieres contar al archivo, en nuestro caso lo pegaríamos en la pestaña BASE2

    Para traer la información he usado una macro con SQL que copia la info de otro archivo. Lo único que debes hacer es poner en la macro denominada “contarsi_otro_libro()” la ruta en la que guardes el archivo “OTRO_LIBRO”, en la macro he dejado la ruta en mi PC: C:\Users\USUARIO\Documents\FUNCION CONTAR.SI EN VBA\OTRO_LIBRO.xls

    Si no modificas esta ruta en la macro, no funcionará y saltará un error.

    Para tu información, la macro para importar los datos de otro libro está en esta entrada: https://excelsignum.wordpress.com/2015/04/25/realizar-consulta-sql-desde-vba-en-excel-hacer-una-consulta-de-access-en-excel/

    Espero te sirvan de ayuda.

    Saludos.

    Me gusta

  3. Saludos amigo, soy muy novato en el tema de las macros pero recién estoy fascinado con ellas… el caso es esta macro que usted publica en el articulo es “exactamente” lo que estaba buscando salvo que lo que deseo contar son números, usted me podría ayudar con ello, gracias de de antemano

    Me gusta

    • Hola Luis:

      Pues contar números se hace de la misma forma que letras, es decir, en lugar de nombres pon datos numéricos y verás como la macro cuenta cuantas veces se repiten esos números. Solo debes cambiar los datos a contar.

      Saludos.

      Me gusta

  4. Mil gracias por tan pronta respuesta, estoy seguro que así de fácil como usted indica, pero por mas que intento remplazar los nombre por los números no consigo que funcione, le estaría eternamente agradecido si me ayuda con este problema (tome en cuenta que solo tengo una semana en este mundillo) mi problema es que deseco contar las veces que se repite un numero en la columna (M3:M108) y el resultado se refleje en la columna (N3:N108), Nota: los números que me enteriza contar es del 0 al 99, en verdad hermano le estaré muy agradecido si es de su agrado ayudarme.

    Me gusta

  5. pido de su apoyo, todo con lo la Funcion contar esta entendido, pero ahora, como se sacaria el resultado, de esas dos columnas, pero ejemplo, tengo grupos de escuelas de 1ro, 2do y 3er anios, lo mismo pero se repite el en una columna 3 primeros, 2 segundos y 4 terceros, nunca en orden como lo puse separados por el tema de orden de lista, bueno y en otras dos columnas, se encuentran altas y bajas por separado, y en altas hay 3 ninios, en bajas 6 ninios, como saco el resultado por separa de los tres grados en altas y bajas de 1ro, 2do y 3ro

    Me gusta

    • Hola Benjy:

      Para poder contestar a tu pregunta, necesitaría que me enviases un archivo con los datos como los tienes ahora, y en otra hoja que quieres que te queden. Y una explicación detallada de lo que debe realizar la macro. Saludos.

      Me gusta

¿Te ha gustado?, Realiza un comentario.

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s