Macro para listar fechas por mes sin sábado y domingo

Como puedo realizar macro para listar fechas por mes excluyendo sábado y domingo

2 respuestas

Respuesta
2

Usando FÓRMULAS excel:

Solo tendrías que teclear la fecha del primer día del mes en la celda A3 (en amarillo) y automáticamente te rellena todo lo demás:

Fórmulas en las celdas:

B3 :  =FIN.MES(A3;0)

B5 : =TEXTO($A$3;"mmmm")

B6 :  =$A$3

B7 hasta el final (arrastrando): 

=SI(B6>=$B$3;"";SI(DIASEM(B6;2)=5;B6+3;SI(DIASEM(B6;2)=6;B6+2;B6+1)))

Para los días de la semana (columna A):

A6 hasta el final:  =TEXTO(B6;"dddd")

.

Prueba y me dices.

Respuesta
1

¿Esta incompleto tu requerimiento quieres calcular las fechas excluyendo sábados y domingos dentro del mismo mes es decir todo Enero por ejemplo o bien quieres calcular la fecha de varios meses?, la macro que te paso elimina sábado y domingos y te crea un listado de fechas sin estas dos días, lo único que tienes que teclear es una fecha inicial en A2 y la macro se encarga de lo demás, nota el nombre de los días no va incluido en la macro solo es una referencia para mi de que la macro hace lo que debe,

esta isntruccion fin_mes = CDate(Format(WorksheetFunction.EoMonth(fecha, 1), "dd/mm/yyyy")), es la que calcula el fin de mes de acuerdo a la fecha inicial 0 es para 1 mes, 1 es para dos meses, 2 es para tres meses y asi sucesivamente, puedes poner este numero en b2 para definir el alcance y modificar esta instruccion agregando la variable fmes=range("b2") y luego cambiando fin_mes = CDate(Format(WorksheetFunction.EoMonth(fecha, fmes), "dd/mm/yyyy"))
asi no tendras que cambiar la macro cuando decidas cambiar el alcance del listado.

esta es la macro

Sub lista_fechas()
fecha = Range("a2")
fin_mes = CDate(Format(WorksheetFunction.EoMonth(fecha, 1), "dd/mm/yyyy"))
dias = fin_mes - fecha
Set MDIAS = Range("a4").Resize(dias)
With MDIAS
X = 1
    For I = 1 To dias
        If I = 1 Then fecha = fecha
        If I > 1 Then fecha = fecha + 1
        ndia = UCase(Format(fecha, "dddd"))
        If ndia = "SÁBADO" Or ndia = "DOMINGO" Then GoTo SIGUIENTE
        MDIAS.Cells(X, 1) = fecha
        X = X + 1
SIGUIENTE:
    Next I
End With
Set DATOS = Nothing
End Sub

[Hola james bond, gracias por la rápida atención, funciona perfecto pero quisiera que mostrara todos los meses de año  en columnas. por ejemplo colA"ENERO", colB "FEB", etc.

¿Algo así?

esta es la macro

Sub calcular_fechas()
fecha = Date: y = Year(fecha)
For i = 1 To 12
    inicio = CDate("01/" & i & "/" & y)
    fin = Val(Format(WorksheetFunction.EoMonth(inicio, 0), "dd"))
    If i = 1 Then codigo = 0: Set ames = Range("a2").Resize(fin, 1)
    If i > 1 Then codigo = codigo + 1: Set ames = ames.Columns(ames.Columns.Count + 1).Resize(fin, 1)
    x = 1
    For j = 1 To fin
        If j = 1 Then inicio = inicio
        If j > 1 Then inicio = inicio + 1
        DIA = UCase(Format(inicio, "dddd"))
        If DIA = "SÁBADO" Or DIA = "DOMINGO" Then GoTo sig
        ames.Cells(x, 1) = inicio:        x = x + 1
sig:
    Next j
    With ames.Cells(0, 1)
        .Value = UCase(MonthName(Month(inicio)))
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
    End With
Next i
Set ames = Nothing
End Sub

¡Gracias eres un pro!

Haber si me permite agregar algo más, en la columna P tengo fechas de días festivos, quisiera que recorra la columna y quite también esos días

Esta macro al momento de calcular la fecha busca en la columna P y si la encuentra la descarta junto con sábados y domingos

estos son los cambios que le hice a la macro

Sub calcular_fechas()
fecha = Date: y = Year(fecha)
Set festivos = Range("p2").CurrentRegion
For i = 1 To 12
    inicio = CDate("01/" & i & "/" & y)
    fin = Val(Format(WorksheetFunction.EoMonth(inicio, 0), "dd"))
    If i = 1 Then codigo = 0: Set ames = Range("a2").Resize(fin, 1)
    If i > 1 Then codigo = codigo + 1: Set ames = ames.Columns(ames.Columns.Count + 1).Resize(fin, 1)
    x = 1
    For j = 1 To fin
        If j = 1 Then inicio = inicio
        If j > 1 Then inicio = inicio + 1
        DIA = UCase(Format(inicio, "dddd"))
        With festivos
            Set busca = .Find(inicio)
            If busca Is Nothing Then
                festivo = False
            Else
                festivo = True
            End If
        End With
        If DIA = "SÁBADO" Or DIA = "DOMINGO" Or festivo = True Then GoTo sig
        ames.Cells(x, 1) = inicio:        x = x + 1
sig:
    Next j
    With ames.Cells(0, 1)
        .Value = UCase(MonthName(Month(inicio)))
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
    End With
Next i
Set ames = Nothing
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas