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