Te invito a SUSCRIBIRTE a mi canal de YouTube:
Excel y Macros
Ahí encontrarás más sobre Excel y Macros:
https://www.youtube.com/channel/UCs644-v3ti4SF7zE_bt_YXA
Comparte los enlaces en tus redes sociales.
Es un requerimiento largo, pero te entrego todas las peticiones.
Pon tus fechas festivas en la celda G2 y hacia abajo.
La macro "insertar" verifica los días festivos, sábados y domingos, si escribes "Laborables".-
Pon la siguiente macro en un módulo:
Sub Insertar()
'Por Dante Amor
Dim sh As Worksheet
Dim i As Long, lr As Long, iRow As Long
Dim rng_festivos As Range, c As Range
Dim LstObj As ListObject
Dim addNew As Boolean
Dim fecN As Long, dia As Long
'
Set sh = Sheets("Inicio")
'Establecemos un objeto para la Tabla1
Set LstObj = Sheets("Registros").ListObjects("Tabla1")
'Establecemos un rango para los días festivos
lr = sh.Range("G" & Rows.Count).End(3).Row
If lr > 1 Then
Set rng_festivos = sh.Range("G2:G" & lr)
End If
'
'VALIDACIONES
If sh.Range("C6").Value = "" Or sh.Range("C8").Value = "" Or sh.Range("C10").Value = "" Or _
Not IsDate(sh.Range("C6").Value) Or Not IsDate(sh.Range("C8").Value) Then
MsgBox "Revisa los datos"
Exit Sub
End If
If sh.Range("C6").Value > sh.Range("C8").Value Then
MsgBox "La fecha inicial es mayor a la final, corregir las fechas"
Exit Sub
End If
'
For i = sh.Range("C6").Value To sh.Range("C8").Value
addNew = True
If sh.Range("C12").Value = "Laborables" Then
'días festivos
fecN = i & ""
For Each c In rng_festivos
dia = c.Value
If dia = fecN Then
addNew = False
End If
Next
'sábados y domingos
If Weekday(i, vbMonday) = 6 Or Weekday(i, vbMonday) = 7 Then
addNew = False
End If
End If
If addNew = True Then
LstObj.ListRows.Add AlwaysInsert:=True
iRow = LstObj.DataBodyRange.Rows.Count
LstObj.DataBodyRange(iRow, 2).Value = i 'fecha
LstObj.DataBodyRange(iRow, 3).Value = sh.Range("C10").Value 'desc
LstObj.DataBodyRange(iRow, 4).Value = sh.Range("C12").Value 'tipo
End If
Next
'
MsgBox "Fechas copiadas"
End Sub
Pon el siguiente código en los eventos de la hoja "Resultados"
Private Sub Worksheet_Change(ByVal Target As Range)
'Por Dante Amor
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
'
Dim shR As Worksheet
Dim fec As String
Dim lr As Long
'
Application.ScreenUpdating = False
'
Set shR = Sheets("Registros")
'
If Target.Address(0, 0) = "D5" Then
Range("C10:E" & Rows.Count).ClearContents
fec = Format(Target.Value, "mm/dd/yyyy")
'filtra los valores que cumplen con la fecha
shR.ListObjects("Tabla1").Range.AutoFilter Field:=2, _
Operator:=xlFilterValues, Criteria2:=Array(2, fec)
lr = shR.Range("C:C").Find("*", , xlValues, xlWhole, xlByRows, xlPrevious).Row
If lr > 5 Then
'los copia de Registros a Resultados
shR.Range("C6:E" & lr).Copy
Range("C10").PasteSpecial xlPasteValues
Else
MsgBox "No existen registros con esa fecha"
End If
shR.ListObjects("Tabla1").Range.AutoFilter
Range("D5").Select
End If
Application.ScreenUpdating = True
End Sub
Te comparto el archivo.
https://docs.google.com/spreadsheets/d/1VePC2pDtZNXQMu4JqHi-WQGCEpffimr1/edit?usp=sharing&ouid=103060997651612915482&rtpof=true&sd=true
Comparte los enlaces en tus redes sociales.
sal u dos