SELECCIONAR ARCHIVOS DE UNA CARPETA Y ENVIARLOS POR OUTLOOK SEGÚN CATÁLOGO DE INFORMES

Hola a todos!.

El envío de correos a través de Outlook utilizando VBA es un tema muy visto en manuales, web etc … que se dedican a Excel.

Como ya sabéis, trato de no publicar temas sobre los que la información existente ya es muy abundante. Principalmente porque no aportaría nada nuevo y por otra parte porque así me obligo a buscar alternativas y publicar cosas nuevas o poco publicadas.

En este caso, lo que os propongo es realizar un pequeño proceso mediante el cual vamos a detallar en una hoja una relación de nombres de archivos que normalmente enviamos a nuestros clientes y que luego vamos a seleccionar de la carpeta en la que se encuentran para finalmente enviarlos por Outlook.

Imaginad que tenemos una carpeta con una serie de informes:

SELECCIONAR ARCHIVOS Y ENVIARLOS POR OUTLOOK

Y queremos que seleccionando la carpeta EJEMPLOS se adjunten y se envíen por correo Outlook. Esto lo vamos a especificar de la siguiente manera en nuestro archivo Excel:

SELECCIONAR ARCHIVOS Y ENVIARLOS POR OUTLOOK_1

Como véis debemos indicar el nombre del archivo EXACTAMENTE igual que el que tenemos en la carpeta y sin la extensión.

Una vez que lo tenemos, ejecutaremos el siguiente código, compuesto por una macro que ejecuta una función:

Sub ENVIAR_CORREOS()
'Declaramos variables
Dim sFSO As Object, Directorio As String
Dim dir_Archivo As Variant
'Abrimos ventana de diálogo para seleccionar carpeta
Set dir_Archivo = Application.FileDialog(msoFileDialogFolderPicker)
dir_Archivo.Show
'Si no seleccionamos nada salimos del proceso
If dir_Archivo.SelectedItems.Count = 0 Then
Exit Sub
End If
'Capturamos el directorio
Directorio = dir_Archivo.SelectedItems(1)
'Creamos objeto y ejecutamos función Carpeta
Set sFSO = CreateObject("Scripting.FileSystemObject")
CARPETA sFSO.GetFolder(Directorio)
End Sub

Function CARPETA(ByVal nCarpeta)
'Declaramos variables
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Dim fin As Long, i As Long, File As Variant
Dim adjunto As String, nFile As String
Dim olMailItem As Variant, Celda As Variant
'Iniciamos función
With Sheets("Hoja1")
fin = Application.CountA(.Range("A:A"))
'recorremos hoja y celda para comprobar si hace
'referencia a varios archivos.
For i = 2 To fin
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.CreateItem(olMailItem)
For Each Celda In Split(.Cells(i, 1), "|")
For Each File In nCarpeta.Files
adjunto = File
nFile = Left(File.Name, InStr(File.Name, ".") - 1)
If Celda = nFile Then
'Destinatario
olMail.To = .Cells(i, 2)
'Con copia a
olMail.CC = .Cells(i, 3)
'Con copia oculta
olMail.BCC = .Cells(i, 4)
'Asunto
olMail.Subject = .Cells(i, 1)
'Cuerpo de correo
olMail.HTMLBody = "Buenos días:
Les enviamos los archivos solicitados.
Atentamente."
' Adjuntamos archivo y dejamos correo en bandeja de salida
olMail.Attachments.Add (adjunto)
'Para enviar debéis utilizar Send en lugar de Display
'olMail.Send
olMail.Display
End If
Next File
Next Celda
olMail: Close
olApp: Close
Next i
End With
Set olMail = Nothing
Set olApp = Nothing
End Function

La macro principal selecciona la carpeta y la función recorre todos los archivos que contiene. En el momento que el archivo de la instrucción for-each es igual al archivo especificado en la hoja, procedemos a realizar el envío con Outlook.

Dado que tenemos también el correo del destinatario, con copia (CC) y con copia oculta (CCO) en la misma línea, podemos indicarlo en la macro para que los incluya.

Si queremos enviar a varios destinatarios a la vez, solo tenéis que indicar el correo electrónico seguido de un punto y como “;” y luego el siguiente email (como lo hacéis en Outlook).

Si lo que queréis es adjuntar varios archivos en un correo, debéis utilizar la barra como delimitador la barra vertical “|”. Por ejemplo en la siguiente imagen, el primer correo adjuntará los archivos “EJEMPLO” y “EJEMPLO_2”:

SELECCIONAR ARCHIVOS Y ENVIARLOS POR OUTLOOK_3

El resultado es el siguiente, los tres correos han sido generados y cada uno con su adjunto:

SELECCIONAR ARCHIVOS Y ENVIARLOS POR OUTLOOK_2

En el ejemplo de la macro los dejo en bandeja de salida, si queréis enviarlos directamente, debéis sustituir: olMail.Display por olMail.Send

Y eso es todo! Espero que os haya resultado de interés.

Descarga el archivo de ejemplo pulsando en: SELECCIONAR ARCHIVOS DE UNA CARPETA Y ENVIARLOS POR OUTLOOK SEGÚN CATÁLOGO DE INFORMES

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡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

Anuncios

CONTAR CARACTERES ESPECÍFICOS EN UN RANGO SELECCIONADO

Hola a todos!.

La semana pasada, por diversos motivos, no me fue posible publicar el post habitual. Pero este sábado lo he podido escribir : )

Como sabéis hay varias fórmulas que nos sirven para contar caracteres determinados o específicos en una celda o un rango. Normalmente se suele trabajar con matriciales o combinación de fórmulas, sin embargo, y dado que con VBA podemos crear nuestras propias funciones, os voy a proponer crear nuestra propia fórmula para contar caracteres.

Vamos a imaginar que tenemos un texto, por ejemplo este:

El azafran silvestre o colchicum autumnale
NO ES EL AZAFRAN COMUN
ES UNA planta muy venenosa
que conviene saber identificar

CONTAR CARACTERES ESPECIFICOS EN UN RANGO SELECCIONADO

Y queremos contar el número de letras “m” que existen en todo el rango que en el que he escrito el texto.

Para ello vamos a usar una función que acabo de crear y que he nombrado como CONTARV:

Option Explicit
Public Function CONTARV(ByVal target As Range, ByVal Caracter As Variant)
'Definimos variables
Dim Celda As Range, nCar As Long, i As Long
Dim nCont As String
'Iniciamos primer loop por cada celda en el rango
For Each Celda In target
'Por cada celda recorremos todos los caracteres
For i = Len(Celda) To 1 Step -1
nCont = Mid(Celda, i, 1)
'Si alguno de los caracteres es igual al seleccionado
'lo contamos
If UCase(nCont) = UCase(Caracter) Then
nCar = nCar + 1
End If
Next i
Next Celda
'Pasamos el resultado al valor de la función
CONTARV = nCar
End Function

Según el ejemplo, aquí vemos el resultado:

CONTAR CARACTERES ESPECIFICOS EN UN RANGO SELECCIONADO_1

Como podéis comprobar, la macro nos ha contado el número de letras m en el texto, sean mayúsculas o minúsculas. Esto lo logramos igualando valores con la función UCase()

If UCase(nCont) = UCase(Caracter) Then

Si queréis que el resultado sea sensible a mayúsculas o minúsculas solo tenéis que borrar la función UCase(U).

El código funciona igual para contenido numérico, sin embargo, con el tema de las tildes, se debe especificar si la lleva o no.

Por otra parte, el segundo argumento de la función, en el que indicamos el caracter a contar, se puede especificar en una celda (como lo tenéis en el ejemplo) o en la función (entre comillas, sea número o texto):

=CONTARV(A3:A7;”m”)

Y eso es todo, como habéis visto, nos hemos creado nuestra propia UDF o función definida por el usuario, para solucionar una posible necesidad.

Espero que os haya resultado interesante  🙂

Descarga el archivo de ejemplo pulsando en: CONTAR CARACTERES ESPECÍFICOS EN UN RANGO SELECCIONADO

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡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

AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA

Hola a todos!, qué tal estáis?

Como continuación al post anterior en el que comentaba cómo se pueden crear fechas utilizando la función DateSerial, en el post de hoy vamos a continuar trabajando con esta función pero para realizar otra tarea, es decir, para añadir o (restar) años, meses y días a una fecha.

Efectivamente, con esta función vamos a poder realizar nuestro objetivo. Imaginad que, como indicamos en el post anterior, hemos creado unas fechas a partir de las columnas de año, mes y día y resulta que vamos a utilizar la columna E para añadir o restar días, meses o años:

AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA

Para realizar esto, lo vamos a poder hacer con DateSerial y también con otra función DateAdd (os dejo los enlaces a Microsoft).

Por lo tanto, vamos a crear dos columnas para los días, meses y año, una para cada función:

AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA_1

Aquí os dejo la macro que realiza nuestro trabajo:

Option Explicit
Sub AÑADE()
'Declaramos variables
Dim Fin As Long, i As Long
With Sheets("Hoja1")
Fin = Application.CountA(.Range("A:A"))
'con un for vamos realizando los cálculos
For i = 2 To Fin
'Componemos fecha con dateserial
.Cells(i, 4) = DateSerial(.Cells(i, 1), .Cells(i, 2), .Cells(i, 3))
'Añadimos días don dateserial y dateadd
.Cells(i, 6) = DateSerial(Year(.Cells(i, 4)), Month(.Cells(i, 4)), Day(.Cells(i, 4)) + .Cells(i, 5))
.Cells(i, 7) = DateAdd("D", .Cells(i, 5), .Cells(i, 4))
'Añadimos meses don dateserial y dateadd
.Cells(i, 8) = DateSerial(Year(.Cells(i, 4)), Month(.Cells(i, 4)) + .Cells(i, 5), Day(.Cells(i, 4)))
.Cells(i, 9) = DateAdd("M", .Cells(i, 5), .Cells(i, 4))
'Añadimos años don dateserial y dateadd
.Cells(i, 10) = DateSerial(Year(.Cells(i, 4)) + .Cells(i, 5), Month(.Cells(i, 4)), Day(.Cells(i, 4)))
.Cells(i, 11) = DateAdd("YYYY", .Cells(i, 5), .Cells(i, 4))
Next i
End With
End Sub

Como podéis observar las dos funciones nos sirven para añadir o restar días, meses o años a nuestra fecha inicial.

Sin embargo, si bien con la función DateSerial podemos sumar en la misma sentencia los días, los meses y los años, (en este ejemplo lo hago por separado):

.Cells(i, 6) = DateSerial(Year(.Cells(i, 4)), Month(.Cells(i, 4)), Day(.Cells(i, 4)) + .Cells(i, 5))

Es decir, podríamos sumar al mismo tiempo los años o los meses. Y esto lo podríamos hacer también con DateAdd, pero programando: AÑADIR AÑOS, MESES Y DÍAS A UNA FECHA EN VBA 

Aunque para este ejemplo, me gustaría tratar el comportamiento de ambas funciones por separado.

En caso de Dateserial, basta con sumar a la función que corresponda los días, los meses o los años.

En al caso de DateAdd debemos especificar si se trata de Años (“YYYY”), meses (“M”) o días “D”.

Como podéis ver en el resultado de la macro, el resultado es idéntico en ambos casos, pero existe una diferencia. Esta la vamos a encontrar en los años bisiestos.

AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA_2

Por ejemplo, para la fecha 29/02/2016 que fue año bisiesto, donde Febrero tuvo 29 días, ambas funciones ofrecen el mismo resultado cuando aplicamos a días y meses, pero en el caso de añadir años, la cosa cambia:

Por ejemplo, si añadimos a esa fecha 1 año, el resultado con DateSerial es 01/03/2017 mientras que con DateAdd es: 28/02/2017 ¿cuál es el correcto?

Si restamos 1 año, con DateSerial el resultado es: 01/03/2015, mientras que con DateAdd es: 28/02/2015 ¿cuál es el correcto?

Si añadimos 365 años, el resultado es 01/03/2381 con DateSerial y 28/02/2381 con DateAdd. ¿Cuál es el correcto?.

Probablemente no se pueda hablar de correcto o incorrecto, sino adecuado y no adecuado. Y en cualquier caso, el resultado que sería más lógico es el que nos devuelve la función DateSerial, es decir el día 1 del mes siguiente, dado que si no se trata de año bisiesto el día 29 de febrero no existe y por lo tanto equivaldría al 1 de marzo.

Sin embargo es más una cuestión de criterio que de resultado, aunque me parece interesante indicarlo en este post y ponerlo de manifiesto para que lo tengáis en cuenta en vuestros cálculos a la hora de añadir años a una fecha y las funciones a emplear.

Descarga el archivo de ejemplo pulsando en: AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡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

CREAR UNA FECHA CON DATESERIAL EN VBA

Hola a todos:

En muchas ocasiones cuando estamos programando en VBA necesitamos crear o componer fechas a partir de columnas independientes en las que se guardan años, meses y días, por ejemplo:

CREAR UNA FECHA CON DATESERIAL EN VBA

Esto lo podemos hacer de dos formas, o bien componemos la fecha y aplicamos formato fecha con la función CDate o bien lo hacemos con DateSerial:

En este código ejecutaremos las dos formas:

Option Explicit
Sub CREAR_FECHA()
'Declaramos variables
Dim Fin As Long, i As Long
With Sheets("Hoja1")
Fin = Application.CountA(.Range("A:A"))
'con un for vamos realizando los cálculos
For i = 2 To Fin
'Componemos fecha y formateamos con Cdate
.Cells(i, 4) = CDate(.Cells(i, 1) & "/" & .Cells(i, 2) & "/" & .Cells(i, 3))
'Componemos fecha con dateserial
.Cells(i, 5) = DateSerial(.Cells(i, 1), .Cells(i, 2), .Cells(i, 3))
Next i
End With
End Sub

Aunque en la práctica el resultado será el mismo, siempre es interesante realizarlo con DateSerial, dado que nos permitirá posteriormente realizar modificaciones en las fechas, como añadir o restar días, meses o años, además de ser más eficiente que la primera.

La función DateSerial, compone la fecha indicando (Año, Mes, Día).

El resultado es el mismo:

CREAR UNA FECHA CON DATESERIAL EN VBA_1

Y eso es todo, espero que os haya resultado útil.

Descarga el archivo de ejemplo pulsando en: CREAR UNA FECHA CON DATESERIAL EN VBA

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡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

FILTRAR POR AÑO EN UN FILTRO CON VBA

Hola a todos!!

Hace unos días publiqué la forma de filtrar por meses utilizando el filtro de Excel con VBA: FILTRAR POR MES EN UN FILTRO CON VBA

Pues bien, hace un par de días un lector me preguntaba cómo podría filtrar pero por años en lugar de meses. La respuesta es que lo podemos hacer, siempre y cuando las opciones del filtro dinámico no nos sean de utilidad (os recomiendo leer el post anterior), dado que podemos filtrar por el año actual, el próximo o el anterior.

Pero si lo que queremos es obtener es todas la fechas en un determinado año, el que sea, entonces lo debemos realizar de forma distinta.

Vamos a emplear la siguiente macro, es importante indicar que para este ejemplo, a diferencia del anterior voy a utilizar un evento de hoja cuando se modifique el contenido de una celda, en la que vamos a especificar el año:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim iDate As Date, fDate As Date, Año As Variant
Dim fin As Long
With Worksheets("Hoja1")
'Si modificamos valor en celda F1, entonces ejecutamos código
If Target.Address = "$F$1" Then
Año = .Range("F1")
'Si la F1 está vacío o no es numérico mostramos
'todos los datos y salimos del proceso
If Año = vbNullString Or Not IsNumeric(Año) Then
AutoFilter.ShowAllData
Exit Sub
End If
'Capturamos inicio y fin del año indicado
iDate = DateSerial(Año, 1, 1)
fDate = DateSerial(Año, 12, 31)
'Filtramos por todas las fechas de ese año
fin = Application.CountA(.Range("A:A"))
.Range("$A$1:$A$" & fin).AutoFilter Field:=1, _
Criteria1:=">=" & iDate, Operator:=xlAnd, Criteria2:="<" & fDate + 1
End If
End With
End Sub

Imaginad estas fechas:

FILTRAR POR AÑO EN UN FILTRO CON VBA

Si aplicamos la macro y en la celda “F1” ponemos, por ejemplo: 2014, se mostrarán todas las fechas que contengan ese año:

FILTRAR POR AÑO EN UN FILTRO CON VBA_1

Tal y como podéis ver en el código, dato que no disponemos de constantes para los años (sería imposible), tenemos que hacerlo construyendo nuestro propio rango de fechas, es decir, del 01/01/ (y el año que indiquemos) y 31/12/(y el año que indiquemos):

iDate = DateSerial(Año, 1, 1)
fDate = DateSerial(Año, 12, 31)

Y con estas dos variables podemos incluirlas en los criterios de nuestro filtro:

.Range("$A$1:$A$" & fin).AutoFilter Field:=1, _
Criteria1:=">=" & iDate, Operator:=xlAnd, Criteria2:="<" & fDate + 1

Es importante hacer notar que el +1 del final es para indicar que la fecha sea menor que 01/01/ (año siguiente al indicado) para conseguir el 31/12/(del año indicado). EL motivo es que el <= no funciona como criterio2 (no he conseguido saber el motivo, pero lo averiguaré).

El resto de la macro sirve para controlar que los datos introducidos no sean alfanuméricos o vacíos (si lo son, se muestran todos los datos). Y para ejecutar la macro si la celda F1 se modifica.

Y eso es todo, espero que os haya resultado de interés y que la duda quede resuelta.

Descarga el archivo de ejemplo pulsando en: FILTRAR POR AÑO EN UN FILTRO CON VBA

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡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

GENERAR SERIE NUMÉRICA CON BUCLES ANIDADOS Y MATRICES. NÚMEROS NATURALES

Hola a todos:

En muchas ocasiones necesitamos generar una serie numérica con los números naturales, es decir: 1, 2, 3, 4 …hasta infinito.

Existen muchas formas de hacerlo, hoy os propongo hacerlo con un bucle anidado y una matriz en la que almacenar los números generados.

Así sería una forma de hacerlo:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Definimos variables
Dim fin As Long, i As Long, celda As String, MiRango As Variant
'Generamos final del rango p. e. de 1 a 25
fin = Application.WorksheetFunction.RandBetween(1, 25)
'Con un for Anidado, incluimos la serie numérica en el array
ReDim MiRango(1 To fin)
For i = 1 To fin:
MiRango(i) = i
Next i
'Capturamos celda en la que nos encontramos
celda = ActiveCell.Address
'pasamos la serie a la hoja transponiendo los datos en vertical.
Range(celda).Resize(fin, 1).Value = Application.Transpose(MiRango)
End Sub

Este código lo creado para generar la serie numérica en un rango aleatorio del 1 a la variable “fin” (aleatoria) y se ejecutará cada vez que hagamos doble clic en la celda en la que nos encontremos.

Por ejemplo:

GENERAR SERIE NUMERICA CON BUCLES ANIDADOS Y MATRICES. NUMEROS NATURALES

Pero no solo es útil para generar este tipo de series, también podríamos generar series por múltiplos, por ejemplo así: MiRango(i) = i + i obtendríamos esto:

GENERAR SERIE NUMERICA CON BUCLES ANIDADOS Y MATRICES. NUMEROS NATURALES_1

Y por poner otro ejemplo, con los cuadrados MiRango(i) = i ^ 2

GENERAR SERIE NUMERICA CON BUCLES ANIDADOS Y MATRICES. NUMEROS NATURALES_2

Como podéis observar podemos crear prácticamente las series que necesitemos. Es un método muy sencillo y rápido.

Lo importante de esta macro es el método, simplemente pasamos la información al array (MiRango) después de generarla en el For.

ReDim MiRango(1 To fin)
For i = 1 To fin:
MiRango(i) = i
Next i

El resto de la macro es necesaria para realizar el ejemplo y mostrar la información en la hoja.

Descarga el archivo de ejemplo pulsando en: GENERAR SERIE NUMÉRICA CON BUCLES ANIDADOS Y MATRICES. NÚMEROS NATURALES

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡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

FILTRAR POR MES EN UN FILTRO CON VBA

Hola a todos:

Hace unas semanas recibí la siguiente consulta:

… tengo una duda: necesito seleccionar de una base datos (p.e. facturación) todos los datos de un mes en concreto de entre varios años sea del año que sea para pasarlos a otra hoja y poder tratarlos. Automáticamente me da el mes como un array (con las fechas de la selección). ¿Cómo puedo decirle en el array el mes “mayo” por ejemplo?”

Y es que aunque parece algo sencillo, el tema de las fechas y el filtro tiene su complicación. Se trata de seleccionar el mes, no una fecha concreta, para lo cual sí podemos utilizar la grabadora de macros y modificar la fecha que necesitamos.

La solución está en trabajar con filtros dinámicos, de esta forma podremos implementar toda una serie de criterios para obtener no solo el mes, sino más elementos.

Por lo tanto, el operador será el filtro dinámico: Operator:=xlFilterDynamic y con él tendremos los siguientes criterios aplicables:

FILTRAR POR MES EN UN FILTRO CON VBA

En este enlace tenéis más información: Criterios

Para este post pondré un ejemplo de una posible funcionalidad, imaginad que tenemos una serie de fechas y las queremos filtros a través del mes que aparezca en un Combobox:

FILTRAR POR MES EN UN FILTRO CON VBA1

Pues bien, aquí os dejo el código completo con el que vamos a realizar el trabajo:

Private Sub ComboBox1_Change()
'Declaramos variables
Dim MiArray As Variant, nMes As String, Criterio As Variant, fin As Long
'Creamos matriz de meses
MiArray = Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre", " ")
'Cargamos meses en Combobox
Sheets("Hoja1").ComboBox1.List = MiArray
'Con una instrucción select case
'pasamos a la variable Criterio la constante que corresponda
nMes = ComboBox1.Value
Select Case nMes
Case "Enero"
Criterio = xlFilterAllDatesInPeriodJanuary
Case "Febrero"
Criterio = xlFilterAllDatesInPeriodFebruray
Case "Marzo"
Criterio = xlFilterAllDatesInPeriodMarch
Case "Abril"
Criterio = xlFilterAllDatesInPeriodApril
Case "Mayo"
Criterio = xlFilterAllDatesInPeriodMay
Case "Junio"
Criterio = xlFilterAllDatesInPeriodJune
Case "Julio"
Criterio = xlFilterAllDatesInPeriodJuly
Case "Agosto"
Criterio = xlFilterAllDatesInPeriodAugust
Case "Septiembre"
Criterio = xlFilterAllDatesInPeriodSeptember
Case "Octubre"
Criterio = xlFilterAllDatesInPeriodOctober
Case "Noviembre"
Criterio = xlFilterAllDatesInPeriodNovember
Case "Diciembre"
Criterio = xlFilterAllDatesInPeriodDecember
End Select
'Filtramos por el mes seleccionado
With Worksheets("Hoja1")
fin = Application.CountA(.Range("A:A"))
.Select
'Si el criterio está vacío, mostramos todos los datos
'y salimos de la rutina
If Criterio = vbNullString Then
AutoFilter.ShowAllData
Exit Sub
End If
.Range("$A$1:$A$" & fin).AutoFilter Field:=1, _
Criteria1:=Criterio, Operator:=xlFilterDynamic
End With
End Sub

Para no dejar en la hoja el listado de los meses y luego cargarlos en el combobox, los he incluido en un array en el código.

Luego con un select case le damos al mes seleccionado en el combobox el valor del criterio.

Finalmente filtramos según el criterio seleccionado:

.Range("$A$1:$A$" & fin).AutoFilter Field:=1, _
Criteria1:=Criterio, Operator:=xlFilterDynamic

Por ejemplo, si filtramos por “mayo” obtendremos el siguiente resultado:

FILTRAR POR MES EN UN FILTRO CON VBA2

y eso es todo, así queda la duda aclarada : )

Espero que os sea de utilidad!
Descarga el archivo de ejemplo pulsando en: FILTRAR POR MES EN UN FILTRO CON VBA

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡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