Logo_Access_global_380x114Favicon_Access_global_180x180Logo_Access_global_380x114Logo_Access_global_380x114
  • Home
  • University
    • Destellos formativos
  • Labs
  • TV
  • Secciones
    • El mundo de Access
    • Explorando VBA
      • Artículos sobre VBA
      • Un trocito de código
    • Entrevistas
      • Profesionales de Access
    • El rincón de Excel
    • Bases de datos
      • MS SQL
      • MySQL
      • postgreSQL
      • SQLite
    • Clases magistrales
    • Utilidades hechas con Access
  • Access en el mundo
  • ¿Quiénes somos?
  • Cómo colaborar
  • Eventos
✕
            No hay resultados Mostrar todos los resultados
            Diseño: crea tu propio icono de ratón
            24/03/2022
            VBA: cabecera de módulo
            25/03/2022
            Mostrar todos

            Obtener la fecha del primer día de la semana o último día de la semana en Access VBA

            Publicado por Rafael Andrada
            Categorías
            • Un trocito de código
            Etiquetas
            • Fecha
            • primer día de semana
            • último día de semana

            Obtener la fecha que corresponda al inicio de la semana (lunes) según una fecha dada. También se puede obtener la fecha del último día de la semana (domingo)


            Nivel: Medio

            Código:
            Public Function mcdtmFindDateFirstOrLastDayOfTheWeek(ByVal dtmDateSearched As Date, ByVal bytQuarterInterval As Integer, ByVal blnFirstDay As Boolean, Optional ByVal blnDifferentiateMonth As Boolean) As Date
                
            '-----------------------------------------------------------------------------------------------------------------------------------------------
            ' Fuente            : https://access-global.net/obtener-la-fecha-del-primer-dia-de-la-semana-o-ultimo-dia-de-la-semana-en-access-vba/
            '-----------------------------------------------------------------------------------------------------------------------------------------------
            ' Título            : Obtener la fecha del primer día de la semana o último día de la semana en Access VBA
            ' Autor             : Rafael Andrada .:McPegasus:. | BeeSoftware
            ' Actualizado       : 24/03/2022
            ' Propósito         : Obtener la fecha que corresponda al inicio de la semana (lunes) según una fecha dada. También se puede obtener la fecha del último día de la semana (domingo)
            ' Retorno           : Un valor de tipo Date que nos indica la fecha de inicio de semana o último día según los parámetros indicados.
            ' Argumento/s       : La sintaxis del procedimiento o función consta de/los siguiente/s argumento/s:
            '                     Parte                 Modo           Descripción
            '-----------------------------------------------------------------------------------------------------------------------------------------------
            '                     dtmDateSearched           Obligatorio             El valor Date especifica la fecha desde la que se parte para conseguir el día solicitado según el parámetro blnFirstDay.
            '                     bytQuarterInterval        Obligatorio             El valor Integer especifica el intervalo de tiempo en meses que se desea obtener. 0 es para el mismo mes.
            '                     blnFirstDay               Obligatorio             El valor Boolean especifica si se desea encontrar el primer o último día del periodo según el parámetro bytQuarterInterval.
            '                     blnDifferentiateMonth     Obligatorio/Opcional    El valor String especifica el SUSTITUIR_POR_UNA_BREVE_DESCRIPCIÓN_DEL_PARÁMETRO
            '-----------------------------------------------------------------------------------------------------------------------------------------------
            ' Importante        : La primera fecha que se obtiene es la del mismo año, no del año anterior ni tampoco del año postarior. Si el día pasado es 03/01/2025, se obtiene como primer día de la semana 01/01/2025 y como último 05/01/2025.
            '-----------------------------------------------------------------------------------------------------------------------------------------------
            'Test:              : Para adaptar este código en tu aplicación puedes basarte en este procedimiento test. Copiar todo el procedimiento desde el Sub hasta el End Sub
            '                     al portapapeles y pega en el editor de VBA de tu aplicación MS Access. Descomentar todas las líneas que nos interese (se aconseja seleccionar
            '                     todas las líneas del ejemplo y utilizar el botón 'Bloque sin comentarios' de la barra de herramientas 'Edición').
            '                     Pulsar F5 para ver su funcionamiento.
            '-----------------------------------------------------------------------------------------------------------------------------------------------
            '
            'Sub mcdtmFindDateFirstOrLastDayOfTheWeek_test()
            '   En el procedimiento adjunto se puede obtener diversos ejemplos de funcionamiento.
            '
            'End Sub
            '-----------------------------------------------------------------------------------------------------------------------------------------------
                
                Dim intWork                                     As Integer
                
                Dim intAño                                      As Integer
                Dim intAñoOtro                                  As Integer
                
                Dim intMes                                      As Integer
                Dim intMesOtro                                  As Integer
                
                Dim dtmDíaSemanaOtroAño                         As Date
                
                
                'Conocer el día de la semana de la fecha pasada por parámetro.
                intWork = Weekday(dtmDateSearched, vbMonday)
                
                If blnFirstDay Then
                    dtmDíaSemanaOtroAño = DateAdd("d", -intWork + 1, dtmDateSearched)
                
                Else
                    dtmDíaSemanaOtroAño = DateAdd("d", 7 - intWork, dtmDateSearched)
                
                End If
                
                intAño = Year(dtmDateSearched)
                intAñoOtro = Year(dtmDíaSemanaOtroAño)
                
                intMes = Month(dtmDateSearched)
                intMesOtro = Month(dtmDíaSemanaOtroAño)
                
                If blnFirstDay Then
                    'Obtener el primer día de la semana.
                    If intAño = intAñoOtro Then
                        If blnDifferentiateMonth Then
                            If intWork = 1 Then
                                intWork = 0
                                
                            Else
                                'En caso de retornar el primer día de la ultima semana del propio mes.
                                If intMes = intMesOtro Then
                                    intWork = (intWork - 1) * -1
                                    
                                Else
                                    intWork = Weekday(DateSerial(intAño, intMes, 1), vbMonday) - intWork
                    
                                End If
                            End If
                        Else
                            If intWork = 1 Then
                                intWork = 0
                                
                            Else
                                intWork = (intWork - 1) * -1
                    
                            End If
                        End If
                    Else
                        'En caso de ser la primera semana del año, el primer día es posible que sea del año anterior. Hay que obtener el día de la semana del siguiente al 31.
                        intWork = intWork - (Weekday(DateSerial(intAñoOtro, 12, 31), vbMonday) + 1)
                        intWork = intWork * -1
                
                    End If
                Else
                    'Obtener el primer día de la semana.
                    If intAño = intAñoOtro Then
                        If blnDifferentiateMonth Then
                            'En caso de retornar el último día de la ultima semana del propio mes.
                            If intMes = intMesOtro Then
                                '24/03/2022.
                                'En caso de ser la última semana de un mes, retornar el último día del mes al que pertenece el día según criterio.
                                intWork = 7 - intWork
                            
                            Else
                                '24/03/2022.
                                'En caso de ser la última semana de un mes, retornar el último día del mes al que pertenece el día según criterio.
                                intWork = Weekday(DateSerial(intAño, intMes + 1, 1), vbMonday) - intWork - 1
                            
                            End If
                        Else
                            '24/03/2022.
                            'En caso de ser la última semana de un mes, retornar el último día del mes al que pertenece el día según criterio.
                            intWork = 7 - intWork
                
                        End If
                    Else
                        '24/03/2022.
                        'En caseo de ser la última semana del año, el último día es posible que sea del año siguiente. Hay que obtener el día de la semana que corresponde al 31.
                        'Obtener el número de día del último día del año.
                        intWork = (Weekday(DateSerial(intAño, 12, 31), vbMonday)) - intWork
                    
                    End If
                End If
                
                mcdtmFindDateFirstOrLastDayOfTheWeek = DateAdd("d", intWork, dtmDateSearched)
            
            End Function
            
            Sub mcdtmFindDateFirstOrLastDayOfTheWeek_test()
            
            'Fechas de la primera semana del años en la que el primer día puede estar en un año diferente. En este caso el primer día de la semana es el 1.
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#1/1/2024#, 0, True, True)         '01/01/2024         'El primer día es lunes.
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#1/1/2024#, 0, True, False)        '01/01/2024         'El primer día es lunes.
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#1/1/2024#, 0, False, True)        '07/01/2024
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#1/1/2024#, 0, False, False)       '07/01/2024
            
            'Fechas de la última semana del año donde el último día puede estar en un año diferente. En este caso el último día de la semana es 31.
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#12/31/2024#, 0, True, True)       '30/12/2024         'El último día es martes.
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#12/30/2024#, 0, False, True)      '31/12/2024
            
            'Fechas con días de febrero para comprobar los días 28 y 29.
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#2/28/2023#, 0, True, True)        '27/02/2023         'El último día es martes.
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#2/27/2023#, 0, False, True)       '28/02/2023
            '
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#2/28/2024#, 0, True, True)        '26/02/2023         'El último día es martes.
            '    Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#2/27/2024#, 0, False, True)       '29/02/2023
            
            'Otras fechas cualesquiera.
                Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#8/15/2024#, 0, True, True)        '12/08/2024
                Debug.Print mcdtmFindDateFirstOrLastDayOfTheWeek(#8/16/2024#, 0, False, True)       '18/08/2024
            
            
            End Sub
            Ver en el repositorio
            Compartir
            1
            Rafael Andrada
            Rafael Andrada

            Entradas relacionadas

            19/03/2023

            Función que convierte cualquier carácter a texto puramente ASCII (Access VBA)


            Leer más
            11/03/2022

            Actualizar una conexión ODBC en tiempo de ejecución


            Leer más
            28/02/2022

            Crear un acceso directo personalizado en el escritorio


            Leer más

            Deja una respuesta Cancelar la respuesta

            Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

            ETIQUETAS

            Access API BD Botones ComboBox Consultas CountOfLines CStr Diseño DoCmd Excel Exportar Fecha FileSystemObject Filtros For Each...Next Formulario Formularios Funciones Funciones de dominio GetFolder GetWindowRect Google maps Informes InStr Kill Left Listbox Mid Módulos Node ProcCountLines Procedimientos ProcOfLine References Replace Ribbon RunCommand Seguridad Split SysCmd Tablas TreeView VBA VBIDE

            ÚLTIMAS ENTRADAS

            • 0
              Tratamiento de errores: otras herramientas útiles
              31/03/2023
            • 0
              Tratamiento de errores: compilación condicional
              30/03/2023

            ¿QUIERES PUBLICITAR TU EMPRESA AQUÍ?

            SUSCRÍBETE A NUESTRO
            NEWSLETTER

            Recibirás información puntual sobre el mundo de Access y VBA

            ¡Próximamente!

            Promovemos el uso de Access y de la programación en VBA en todo el mundo

            Centro de conocimiento


            Toda la sabiduría de los mejores programadores de Access y VBA a tu alcance.

            Legal

            Política de privacidad

            Condiciones de uso

            Condiciones del redactor

            ®Access Global 2021 | All right reserved
                      No hay resultados Mostrar todos los resultados