30 julio, 2021

MOSTRAR RELACIÓN DE FECHAS ENTRE DOS FECHAS

Hola a todos!.

Hace unos días me hacían una consulta a través de LinkedIn que trataba sobre cómo se podía generar automáticamente todas las fechas comprendidas entre dos fechas (inicial y final).

Aunque esto es posible realizarlo mediante fórmulas, creo que lo más oportuno es hacerlo con VBA, ya no solo por la rapidez sino por todas las posibilidades que ofrece para luego poder pasar estos datos a un formulario con cuadros de lista o combos.

Para este ejercicio voy a plantear dos situaciones, una en la que queremos obtener todas las fechas y otra en la que queremos obtener solo los días hábiles y omitiendo también festivos.

Veamos la primera, obtener todas las fechas, para ello imaginad que tenemos las siguiente fechas en nuestra hoja Excel:

MOSTRAR RELACION DE FECHAS ENTRE DOS FECHAS

y queremos obtener todas las fechas que comprenden desde el 01/05/2018 hasta el 15/05/2018. Para poder hacerlo vamos a utilizar esta macro:

Sub obtener_fechas()
'Declaramos variables
Dim inicio As Date, fin As Date, nCont As Date
Dim sCadena As String, fsem As String
Dim matriz As Variant, j As Double
With Sheets("FECHAS")
'Indicamos las celdas con la fecha inicio y fin
inicio = .Cells(1, 2)
fin = .Cells(2, 2)
'Mediante un loop añadimos un día a la fecha inicial
'y guardamos fechas en la variable sCadena
Do While inicio < fin - 1
nCont = DateAdd("w", 1, inicio)
inicio = nCont
sCadena = sCadena & " " & inicio
Loop
'pasamos la información de la matriz a la hoja
matriz = Split(sCadena, " ")
For j = 1 To UBound(matriz)
.Cells(j, 3) = Format(matriz(j), "mm/dd/yyyy")
Next j
End With
End Sub

Como podéis observar, mediante un loop vamos añadiendo días a la fecha inicial de forma que vamos componiendo cada fecha hasta llegar a la fecha final. Esos datos los guardamos en una variable string como una cadena de texto que luego pasaremos a una matriz y finalmente a la hoja, este es el resultado:

MOSTRAR RELACION DE FECHAS ENTRE DOS FECHAS1

Ahora vamos con la segunda situación, es decir, queremos obtener sólamente los días hábiles y excluir festivos, para ello utilizaremos la misma macro pero con unas modificaciones:

Sub obtener_fechas_dias_lab()
'Declaramos variables
Dim inicio As Date, fin As Date, nCont As Date, dfest As Date
Dim sCadena As String, fsem As String, j As Double
Dim matriz As Variant
With Sheets("FECHAS")
'Indicamos las celdas con la fecha inicio y fin
inicio = .Cells(1, 2)
fin = .Cells(2, 2)
'Mediante un loop añadimos un día a la fecha inicial
'y guardamos fechas en la variable sCadena
Do While inicio < fin - 1
nCont = DateAdd("w", 1, inicio)
inicio = nCont
fsem = Format(inicio, "ddd")
dfest = CDate(.Cells(3, 2))
'Si el día es un sábado o domingo o un festivo no guardamos fecha
If fsem <> "sá." And fsem <> "do." And <> inicio dfest Then
sCadena = sCadena & " " & inicio
End If
Loop
'pasamos la información de la matriz a la hoja
matriz = Split(sCadena, " ")
For j = 1 To UBound(matriz)
.Cells(j, 4) = Format(matriz(j), "mm/dd/yyyy")
Next j
End With
End Sub

Para poder excluir los sábados y los domingos es necesario que podamos detectar los días en las fechas que vamos generando en el loop, esto lo hacemos con:

Format(inicio, "ddd")

Donde los sábados se representan como: "sá." y los domingos como "do.", es obvio que si estamos trabajando con otros idiomas debemos modificar e introducir los datos correspondientes . Con un condicional excluimos los sábados y los domingos y también la fecha del día festivo, finalmente la información es la siguiente:

MOSTRAR RELACION DE FECHAS ENTRE DOS FECHAS2

Y con esto ya hemos finalizado el ejercicio, ya podemos obtener los días entre dos fechas y listarlos, (con o sin días laborales).

Espero que os resulte de utilidad!.

Descarga el archivo de ejemplo pulsando en: MOSTRAR RELACION DE FECHAS ENTRE DOS FECHAS

¿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

Comparte este post

8 comentario en “MOSTRAR RELACIÓN DE FECHAS ENTRE DOS FECHAS

  1. Hola Estimado, serias tan amable de ayudarme a poder crear un proceso para poder ingresar los datos necesarios para las cuentas contables de una factura al momento de ingresar solo los datos de la factura por ejemplo: Si he ingresado estos datos en la factura de venta, las cuentas contables que estarían en otra tabla deberían ser las siguientes. De antemano muchas gracias por el tiempo que dedicas a enseñarnos a usar esta maravillo herramienta como ACCESS
    Saludos

    FACTURA DE VENTA

    Fecha : 04/06/2018 TIPO DE PAGO : Al contado - Al crédito
    Numero : 00035
    Patente : WR-6589
    Cliente : Pedro Inostroza

    DESCRIPCIÓN CUENTA COSTO VALOR U. CANTIDAD VALOR T.

    filtro de aceite mercadería 1800 2500 1 2500
    bidón de aceite mercadería 9500 14300 2 28600
    cambiar aceite y filtro ingresos por venta del giro 0 5000 1 5000

    SUB TOTAL : 36100
    IVA : 6859
    TOTAL : 42959

    CUENTAS CONTABLES POR FACTURA REALIZADA DEBERÍAN SER ESTAS

    FACTURA CÓDIGO DE CUENTA CUENTA TIPO DE PAGO DEBE HABER

    00035 1.1.50.1 mercadería Al contado 11300
    00035 4.2.10.1 costos por ventas del giro Al contado 11300
    00035 2.1.170.1 iva débito Al contado 6859
    00035 4.1.10.1 ingresos por ventas del giro Al contado 36100
    00035 1.1.10.1 caja Al contado 42959

    1. Hola Manuel:

      Sí te puedo ayudar, pero no puedo hacer todo el proyecto dado que no tendo tiempo suficiente. Lo que sí pudo es ayudarte en consultas puntuales. Intenta comenzar y cuando te surja una duda, me comentas y te ayudo.

      Saludos.

  2. Hola Segu,

    he encontrado tu articulo y lo encuentro muy útil en mi situación. Trabajo en turismo y nos han cambiado sistema en que trabajo y no me trae los datos adecuados a las tablas que tengo. Por tanto estoy buscando métodos de sacar los datos necesarios para mis tablas en lugar de crear nuevas tablas. De allí tengo duda, me sirve el primer macro que has expuesto en articulo, pero necesito hacer par de modificaciones: que las fechas consecutivas empiezan desde la fecha de inicio (habrá que quitar el loop, pero me da error constante, así que algo estoy haciendo mal jeje; y otra modificación esta sobre la disposición de las fechas, se puede ponerlos horizontal, ya que las fechas de inicio y fin el sistema me lo trae en tablas horizontales? Me puedes ayudar para hacer estas modificaciones, es que no entiendo como hacerlos.

    Mil gracias,
    Nelly

    1. Por ejemplo así:

      Y sin necesidad de modificar el loop.

      Sub obtener_fechas_dias_lab()
      'Declaramos variables
      Dim inicio As Date, fin As Date, nCont As Date, dfest As Date
      Dim sCadena As String, fsem As String, j As Double
      Dim matriz As Variant
      With Sheets("FECHAS")
      'Indicamos las celdas con la fecha inicio y fin
      inicio = DateSerial(Year(.Cells(1, 2)), Month(.Cells(1, 2)), Day(.Cells(1, 2)) - 1)
      fin = DateSerial(Year(.Cells(2, 2)), Month(.Cells(2, 2)), Day(.Cells(2, 2)) + 1)
      'Mediante un loop añadimos un día a la fecha inicial
      'y guardamos fechas en la variable sCadena
      Do While inicio < fin - 1
      nCont = DateAdd("w", 1, inicio)
      inicio = nCont
      fsem = Format(inicio, "ddd")
      dfest = CDate(.Cells(3, 2)) 'Si el día es un sábado o domingo o un festivo no guardamos fecha
      If fsem <> "sá." And fsem <> "do." And inicio <> dfest Then
      sCadena = sCadena & " " & inicio
      End If
      Loop
      'pasamos la información de la matriz a la hoja
      matriz = Split(sCadena, " ")
      For j = 1 To UBound(matriz)
      .Cells(1, j) = Format(matriz(j), "mm/dd/yyyy")
      Next j
      End With
      End Sub

      1. Hola Segu, gracias por su respuesta, pero me da error, lo copio tal como es, pero da error, lo puedes chequear?

        muchas garcias,
        un saludo
        nelly

        1. El código no tiene ningún problema, solo que al pegarlo en los comentarios el formato en HTML junta varias líneas de código por eso cuando pegas se ve color rojo (error). Ya lo editado con algunos "br" y ya lo puedes pegar.

  3. Hola Segu, perdona por retrasos. Te agradezco tu ayuda. Aunque no entiendo nada en Visual Basic y macros para mi es un poco mistero al limite con magia, he hecho un pequeño cambio en tu code y se quedo así:

    Sub obtener_fechas_dias_lab()
    'Declaramos variables
    Dim inicio As Date, fin As Date, nCont As Date, dfest As Date
    Dim sCadena As String, fsem As String, j As Double
    Dim matriz As Variant
    With Sheets("FECHAS")
    'Indicamos las celdas con la fecha inicio y fin
    inicio = DateSerial(Year(.Cells(3, 7)), Month(.Cells(3, 7)), Day(.Cells(3, 7)) - 1)
    fin = DateSerial(Year(.Cells(3, 8)), Month(.Cells(3, 8)), Day(.Cells(3, 8)) + 1)
    'Mediante un loop añadimos un día a la fecha inicial
    'y guardamos fechas en la variable sCadena
    Do While inicio < fin - 1
    nCont = DateAdd("w", 1, inicio)
    inicio = nCont
    sCadena = sCadena & " " & inicio
    Loop
    'pasamos la información de la matriz a la hoja
    matriz = Split(sCadena, " ")
    For j = 9 To UBound(matriz)
    .Cells(3, j) = Format(matriz(j), "mm/dd/yyyy")
    Next j
    End With
    End Sub

    pero tengo siguiente problema, que los datos aparecen en la columna incorrecta, necesito que aparezcan en la columna 9 y supongo que había que estipular la igualdad de J, pero lo he cambiado a 9 y solo me trae la fecha final, pero no las demás. No puedo añadirte aquí la foto, ni documento para que sea mas visual?

    Otra duda, como lo aplico a toda la tabla, hasta fin de datos, ya que la son dinámicos y se acumulan (tabla crece cada dia)?

    Muchas gracias,
    Un slaudo,
    Nelly

    1. Para indicar la columna es así:

      .Cells(1, j + 9) = Format(matriz(j), "mm/dd/yyyy")

      Le tienes que sumar un 9

      para aplicar a toda la tabla tienes que aplicar todo el proceso dentro de un loop.

      Saludos

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies