Primera version refactorizada

This commit is contained in:
Miguel 2025-03-01 13:37:31 +01:00
commit 65f67ddd82
11 changed files with 1017 additions and 0 deletions

22
Constants.vba Normal file
View File

@ -0,0 +1,22 @@
' Module: Constants
' Description: Contains application-wide constants
' Sheet Names
Public Const SHEET_HORAS As String = "Horas"
Public Const SHEET_FDL_1 As String = "FDL_1"
Public Const SHEET_FDL_2 As String = "FDL_2"
Public Const SHEET_FDL_3 As String = "FDL_3"
Public Const SHEET_NOTA As String = "Nota"
Public Const SHEET_FOGLIO_1 As String = "Foglio 1"
Public Const SHEET_COMMESSE As String = "Commesse"
' Row Constants
Public Const PRIMERA_FILA_FDL As Integer = 17
Public Const MAX_ENTRIES_PER_FDL As Integer = 14
Public Const MAX_TOTAL_ENTRIES As Integer = 42
' File Paths
Public Const PYTHON_EXE_PATH As String = "C:\Users\migue\miniconda3\envs\general\python.exe"
Public Const SCRIPT_PATH As String = "d:\Proyectos\Scripts\Horarios\InicioApagadoToExcel\LeerLogsToExcel.py"
Public Const LOG_FILE_PATH As String = "d:\Proyectos\Scripts\Horarios\InicioApagadoToExcel\python_log.txt"
Public Const LOG_EXCEL_PATH As String = "D:\Proyectos\Scripts\Horarios\InicioApagadoToExcel\LogEncendidoApagado.xlsx"

227
ConsultarFechas.vba Normal file
View File

@ -0,0 +1,227 @@
Dim b_Export As Boolean
Private Sub b_completar_Click()
b_Export = False
CopiarCeldas
Unload Me
End Sub
Private Sub b_completar_exportar_Click()
b_Export = True
CopiarCeldas
Unload Me
End Sub
Sub CopiarCeldas()
Dim wsHoras As Worksheet, wsFdl As Worksheet
Dim fechaDesde As Date, fechaHasta As Date
Dim ultimaFilaConDatos As Long, ultimaFilaHoras As Long
Dim i As Long, j As Long, k As Integer
Dim respuesta As VbMsgBoxResult
Dim nombreHojaHoras As String, nombreHojaFdl_1 As String, nombreHojaFdl_2 As String, nombreHojaFdl_3 As String, nombreHojaNota As String
Dim pdfExportado As Boolean
Const PrimeraFilaFDL = 17
' Nombres de las hojas en variables estáticas
nombreHojaHoras = "Horas"
nombreHojaFdl_1 = "FDL_1"
nombreHojaFdl_2 = "FDL_2"
nombreHojaFdl_3 = "FDL_3"
nombreHojaNota = "Nota"
' Establecer referencias a las hojas de trabajo
Set wsHoras = ThisWorkbook.Sheets(nombreHojaHoras)
Set wsFdl = ThisWorkbook.Sheets(nombreHojaFdl_1)
ultimaFilaHoras = wsHoras.Cells(Rows.Count, 5).End(xlUp).Row
' Leer fechas desde los TextBox del formulario
On Error Resume Next
fechaDesde = GetDateFromForm(ConsultarFechas.t_desde.value)
fechaHasta = GetDateFromForm(ConsultarFechas.t_hasta.value)
' Escribir el numero de factura
ThisWorkbook.Sheets(nombreHojaNota).Cells(6, 3).value = ConsultarFechas.frm_factnro.value
' Validar que las fechas son correctas
If IsEmpty(fechaDesde) Or IsEmpty(fechaHasta) Then
MsgBox "Por favor, ingrese fechas válidas."
Exit Sub
End If
On Error GoTo 0
' Validar que las fechas son correctas
If IsEmpty(fechaDesde) Or IsEmpty(fechaHasta) Then
MsgBox "Por favor, ingrese fechas válidas."
Exit Sub
End If
' Comprobar que el rango de fechas no excede los 31 días
If fechaHasta - fechaDesde > 31 Then
MsgBox "El rango de fechas no puede exceder los 31 días."
Exit Sub
End If
' Preguntar al usuario si desea borrar el contenido selectivo de FDL_1
'respuesta = MsgBox("¿Desea borrar el contenido selectivo de la hoja FDL ?", vbYesNo)
'If respuesta = vbYes Then
wsFdl.Range("A17:P44").ClearContents
ThisWorkbook.Sheets(nombreHojaFdl_2).Range("A17:P44").ClearContents
ThisWorkbook.Sheets(nombreHojaFdl_3).Range("A17:P44").ClearContents
'End If
' Iniciar variable para la fila de destino
j = PrimeraFilaFDL ' Puesto que quieres empezar desde la fila 17 en FDL_1
k = 0
' Recorrer cada fila en la hoja "Horas"
For i = 3 To ultimaFilaHoras
If CDate(wsHoras.Cells(i, 5).Value2) >= fechaDesde And CDate(wsHoras.Cells(i, 5).Value2) <= fechaHasta Then
' Copiar la celda a la hoja "FDL_1/2/3"
wsFdl.Cells(j, 1).Value2 = wsHoras.Cells(i, 5).Value2
wsFdl.Cells(j, 3).value = Format(wsHoras.Cells(i, 6).value, "hh:mm")
wsFdl.Cells(j, 4).value = wsHoras.Cells(i, 7).value
wsFdl.Cells(j, 5).value = wsHoras.Cells(i, 8).value
wsFdl.Cells(j, 6).value = wsHoras.Cells(i, 9).value
If wsHoras.Cells(i, 14).value > 0 Then wsFdl.Cells(j, 7).value = wsHoras.Cells(i, 14).value
If wsHoras.Cells(i, 15).value > 0 Then wsFdl.Cells(j, 8).value = wsHoras.Cells(i, 15).value
wsFdl.Cells(j, 10).value = wsHoras.Cells(i, 2).value
j = j + 2: k = k + 1
pdfExportado = False
If k = 14 Then
ExportarAsPDF wsFdl, Format(fechaDesde, "dd-MM"), Format(wsFdl.Cells(j - 2, 1).Value2, "dd-MM")
Set wsFdl = ThisWorkbook.Sheets(nombreHojaFdl_2)
j = PrimeraFilaFDL
pdfExportado = True
End If
If k = 28 Then
ExportarAsPDF wsFdl, Format(wsFdl.Cells(PrimeraFilaFDL, 1).Value2, "dd-MM"), Format(wsFdl.Cells(j - 2, 1).Value2, "dd-MM")
Set wsFdl = ThisWorkbook.Sheets(nombreHojaFdl_3)
j = PrimeraFilaFDL
pdfExportado = True
End If
' Si j supera 42, salir del bucle
If k > 42 Then Exit For
End If
Next i
If Not pdfExportado Then
ExportarAsPDF wsFdl, Format(wsFdl.Cells(PrimeraFilaFDL, 1).Value2, "dd-MM"), Format(fechaHasta, "dd-MM")
End If
' Exportar la factura
ExportarAsPDF ThisWorkbook.Sheets(nombreHojaNota), "Fattura_" & Format(fechaDesde, "dd-MM"), Format(fechaHasta, "dd-MM")
' Exportar la factura
ExportarAsPDF ThisWorkbook.Sheets("Foglio 1"), "Expenses_" & Format(fechaDesde, "dd-MM"), Format(fechaHasta, "dd-MM")
ExportarAsXLS "Expenses_" & Format(fechaDesde, "dd-MM"), Format(fechaHasta, "dd-MM")
' Limpiar objetos
Set wsFdl = Nothing
End Sub
Private Sub ExportarAsPDF(wsFdl As Worksheet, fechaDesde As String, fechaHasta As String)
Dim rutaPDF As String
Dim nombreArchivo As String
If b_Export Then
' Construir el nombre del archivo PDF basado en las fechas
nombreArchivo = "fdl_" & fechaDesde & " al " & fechaHasta & ".pdf"
' Mostrar el cuadro de diálogo "Guardar como" y obtener la ruta seleccionada
rutaPDF = Application.GetSaveAsFilename(InitialFileName:=nombreArchivo, _
FileFilter:="PDF Files (*.pdf), *.pdf", Title:="Guardar como PDF")
' Comprobar si el usuario ha cancelado el cuadro de diálogo
If (rutaPDF <> "False") And (rutaPDF <> "Falso") Then
' Exportar la hoja como PDF
wsFdl.ExportAsFixedFormat Type:=xlTypePDF, Filename:=rutaPDF, _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
End If
End If
End Sub
Private Sub ExportarAsXLS(fechaDesde As String, fechaHasta As String)
Dim rutaPDF As String
Dim nombreArchivo As String
If b_Export Then
' Construir el nombre del archivo PDF basado en las fechas
nombreArchivo = "fdl_" & fechaDesde & " al " & fechaHasta & ".xlsx"
' Mostrar el cuadro de diálogo "Guardar como" y obtener la ruta seleccionada
rutaPDF = Application.GetSaveAsFilename(InitialFileName:=nombreArchivo, _
FileFilter:="XLS Files (*.xlsx), *.xlsx", Title:="Guardar como XLS")
' Comprobar si el usuario ha cancelado el cuadro de diálogo
If (rutaPDF <> "False") And (rutaPDF <> "Falso") Then
' Exportar la hoja como PDF
Dim Hoja1 As Worksheet, Hoja2 As Worksheet, Hoja3 As Worksheet, Hoja4 As Worksheet, Hoja5 As Worksheet
Dim NuevoLibro As Workbook
' Ajusta los nombres de las hojas a los que necesitas
Set Hoja1 = ThisWorkbook.Sheets("Nota")
Set Hoja2 = ThisWorkbook.Sheets("FDL_1")
Set Hoja3 = ThisWorkbook.Sheets("FDL_2")
Set Hoja4 = ThisWorkbook.Sheets("FDL_3")
Set Hoja5 = ThisWorkbook.Sheets("Foglio 1")
' Copia las hojas a un nuevo libro
Hoja1.Copy
Set NuevoLibro = ActiveWorkbook
' Con el nuevo libro activo, copia la segunda hoja
Hoja2.Copy After:=NuevoLibro.Sheets(1)
Hoja3.Copy After:=NuevoLibro.Sheets(2)
Hoja4.Copy After:=NuevoLibro.Sheets(3)
Hoja5.Copy After:=NuevoLibro.Sheets(4)
' Guarda el nuevo libro como archivo .xls
' Cambia la ruta de archivo y el nombre según necesites
NuevoLibro.SaveAs rutaPDF, FileFormat:=xlWorkbookDefault
' Cierra el nuevo libro sin guardar cambios
NuevoLibro.Close SaveChanges:=False
End If
End If
End Sub
Public Function GetDateFromForm(value As String) As Date
Dim partesFecha() As String
' Leer fecha desde el TextBox t_desde
partesFecha = Split(value, "/")
On Error Resume Next
GetDateFromForm = DateSerial(CInt(partesFecha(2)), CInt(partesFecha(1)), CInt(partesFecha(0)))
On Error GoTo 0
End Function

135
DataProcessor.vba Normal file
View File

@ -0,0 +1,135 @@
' Module: DataProcessor
' Description: Core data processing functions
Public Sub ProcessWorkHourData(fechaDesde As Date, fechaHasta As Date, exportResults As Boolean, facturaNum As String)
Dim wsHoras As Worksheet, wsFdl As Worksheet
Dim ultimaFilaHoras As Long
Dim i As Long, j As Long, k As Integer
Dim pdfExportado As Boolean
' Update invoice number
ThisWorkbook.Sheets(SHEET_NOTA).Cells(6, 3).Value = facturaNum
' Validate date range
If Not ValidateDateRange(fechaDesde, fechaHasta) Then
Exit Sub
End If
' Clear existing content in FDL sheets
ClearFDLSheets
' Set references to worksheets
Set wsHoras = ThisWorkbook.Sheets(SHEET_HORAS)
Set wsFdl = ThisWorkbook.Sheets(SHEET_FDL_1)
ultimaFilaHoras = wsHoras.Cells(Rows.Count, 5).End(xlUp).Row
' Initialize variables for destination row and entry count
j = PRIMERA_FILA_FDL
k = 0
' Process each row in Horas sheet
For i = 3 To ultimaFilaHoras
If CDate(wsHoras.Cells(i, 5).Value2) >= fechaDesde And CDate(wsHoras.Cells(i, 5).Value2) <= fechaHasta Then
' Copy data to current FDL sheet
CopyRowToFDL wsHoras, wsFdl, i, j
j = j + 2: k = k + 1
pdfExportado = False
' Handle sheet transitions at MAX_ENTRIES_PER_FDL entries
If k = MAX_ENTRIES_PER_FDL Then
If exportResults Then
ExportToPDF wsFdl, Format(fechaDesde, "dd-MM"), Format(wsFdl.Cells(j - 2, 1).Value2, "dd-MM")
End If
Set wsFdl = ThisWorkbook.Sheets(SHEET_FDL_2)
j = PRIMERA_FILA_FDL
pdfExportado = True
End If
' Handle sheet transitions at MAX_ENTRIES_PER_FDL * 2 entries
If k = MAX_ENTRIES_PER_FDL * 2 Then
If exportResults Then
ExportToPDF wsFdl, Format(wsFdl.Cells(PRIMERA_FILA_FDL, 1).Value2, "dd-MM"), Format(wsFdl.Cells(j - 2, 1).Value2, "dd-MM")
End If
Set wsFdl = ThisWorkbook.Sheets(SHEET_FDL_3)
j = PRIMERA_FILA_FDL
pdfExportado = True
End If
' Exit if we exceed maximum entries
If k > MAX_TOTAL_ENTRIES Then Exit For
End If
Next i
' Export final sheet if not already exported
If exportResults And Not pdfExportado Then
ExportToPDF wsFdl, Format(wsFdl.Cells(PRIMERA_FILA_FDL, 1).Value2, "dd-MM"), Format(fechaHasta, "dd-MM")
End If
' Export additional documents if needed
If exportResults Then
ExportToPDF ThisWorkbook.Sheets(SHEET_NOTA), "Fattura_" & Format(fechaDesde, "dd-MM"), Format(fechaHasta, "dd-MM")
ExportToPDF ThisWorkbook.Sheets(SHEET_FOGLIO_1), "Expenses_" & Format(fechaDesde, "dd-MM"), Format(fechaHasta, "dd-MM")
ExportToExcel Format(fechaDesde, "dd-MM"), Format(fechaHasta, "dd-MM")
End If
End Sub
Private Sub CopyRowToFDL(wsSource As Worksheet, wsTarget As Worksheet, sourceRow As Long, targetRow As Long)
' Copy data from source row to target row in FDL sheet
wsTarget.Cells(targetRow, 1).Value2 = wsSource.Cells(sourceRow, 5).Value2
wsTarget.Cells(targetRow, 3).Value = Format(wsSource.Cells(sourceRow, 6).Value, "hh:mm")
wsTarget.Cells(targetRow, 4).Value = wsSource.Cells(sourceRow, 7).Value
wsTarget.Cells(targetRow, 5).Value = wsSource.Cells(sourceRow, 8).Value
wsTarget.Cells(targetRow, 6).Value = wsSource.Cells(sourceRow, 9).Value
' Set optional values only if they're greater than 0
If wsSource.Cells(sourceRow, 14).Value > 0 Then
wsTarget.Cells(targetRow, 7).Value = wsSource.Cells(sourceRow, 14).Value
End If
If wsSource.Cells(sourceRow, 15).Value > 0 Then
wsTarget.Cells(targetRow, 8).Value = wsSource.Cells(sourceRow, 15).Value
End If
wsTarget.Cells(targetRow, 10).Value = wsSource.Cells(sourceRow, 2).Value
End Sub
Private Sub ClearFDLSheets()
' Clear content in all FDL sheets
ThisWorkbook.Sheets(SHEET_FDL_1).Range("A17:P44").ClearContents
ThisWorkbook.Sheets(SHEET_FDL_2).Range("A17:P44").ClearContents
ThisWorkbook.Sheets(SHEET_FDL_3).Range("A17:P44").ClearContents
End Sub
Public Sub RunPythonLogProcessor()
Dim objShell As Object
' Create shell object
Set objShell = VBA.CreateObject("WScript.Shell")
' Execute Python script
objShell.Run "cmd /c " & PYTHON_EXE_PATH & " " & SCRIPT_PATH & " > " & LOG_FILE_PATH & " 2>&1", 0, True
Set objShell = Nothing
End Sub
Public Sub RefreshLogData()
Dim wb As Workbook
' Open log Excel file
Set wb = Workbooks.Open(LOG_EXCEL_PATH)
' Refresh all connections
wb.RefreshAll
' Wait for refresh to complete
Application.Wait Now + TimeValue("00:00:05")
' Close without saving
wb.Close SaveChanges:=False
' Refresh current workbook
ThisWorkbook.RefreshAll
End Sub

63
DateUtils.vba Normal file
View File

@ -0,0 +1,63 @@
' Module: DateUtils
' Description: Functions for date manipulation and validation
Public Function GetDateFromString(value As String) As Date
Dim partesFecha() As String
' Parse date from string in format dd/mm/yyyy
partesFecha = Split(value, "/")
On Error Resume Next
GetDateFromString = DateSerial(CInt(partesFecha(2)), CInt(partesFecha(1)), CInt(partesFecha(0)))
On Error GoTo 0
End Function
Public Function ValidateDateRange(fechaDesde As Date, fechaHasta As Date) As Boolean
' Check if dates are valid
If IsEmpty(fechaDesde) Or IsEmpty(fechaHasta) Then
MsgBox "Por favor, ingrese fechas válidas."
ValidateDateRange = False
Exit Function
End If
' Check that date range doesn't exceed 31 days
If fechaHasta - fechaDesde > 31 Then
MsgBox "El rango de fechas no puede exceder los 31 días."
ValidateDateRange = False
Exit Function
End If
ValidateDateRange = True
End Function
Public Function GetDefaultEndDate() As Date
Dim wsHoras As Worksheet
Dim ultimaFilaConDatos As Long
' Get last date from Horas sheet
Set wsHoras = ThisWorkbook.Sheets(SHEET_HORAS)
ultimaFilaConDatos = wsHoras.Range("F:M").Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
GetDefaultEndDate = wsHoras.Cells(ultimaFilaConDatos, 5).Value2
End Function
Public Function GetDefaultStartDate(fechaHasta As Date) As Date
' Default to 28 days before end date
GetDefaultStartDate = DateAdd("d", -28, fechaHasta)
End Function
Public Function SumarPorMes(rangoFechas As Range, mes As Integer, rangoSuma As Range) As Double
Dim sumaTotal As Double
Dim i As Integer
On Error Resume Next
sumaTotal = 0
' Sum values where month matches
For i = 1 To rangoFechas.Count
If Month(rangoFechas.Cells(i).Value2) = mes Then
sumaTotal = sumaTotal + rangoSuma.Cells(i).Value2
End If
Next i
SumarPorMes = sumaTotal
End Function

120
ExportUtils.vba Normal file
View File

@ -0,0 +1,120 @@
' Module: ExportUtils
' Description: Functions for exporting data to different formats
Public Function ExportToPDF(ws As Worksheet, fechaDesde As String, fechaHasta As String) As Boolean
Dim rutaPDF As String
Dim nombreArchivo As String
' Construct PDF filename based on the dates
nombreArchivo = "fdl_" & fechaDesde & " al " & fechaHasta & ".pdf"
' Show "Save As" dialog and get the selected path
rutaPDF = Application.GetSaveAsFilename(InitialFileName:=nombreArchivo, _
FileFilter:="PDF Files (*.pdf), *.pdf", Title:="Guardar como PDF")
' Check if user cancelled the dialog
If (rutaPDF <> "False") And (rutaPDF <> "Falso") Then
' Export sheet as PDF
ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=rutaPDF, _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
ExportToPDF = True
Else
ExportToPDF = False
End If
End Function
Public Function ExportToExcel(fechaDesde As String, fechaHasta As String) As Boolean
Dim rutaPDF As String
Dim nombreArchivo As String
' Construct Excel filename based on dates
nombreArchivo = "fdl_" & fechaDesde & " al " & fechaHasta & ".xlsx"
' Show "Save As" dialog and get the selected path
rutaPDF = Application.GetSaveAsFilename(InitialFileName:=nombreArchivo, _
FileFilter:="XLS Files (*.xlsx), *.xlsx", Title:="Guardar como XLS")
' Check if user cancelled the dialog
If (rutaPDF <> "False") And (rutaPDF <> "Falso") Then
Dim Hoja1 As Worksheet, Hoja2 As Worksheet, Hoja3 As Worksheet, Hoja4 As Worksheet, Hoja5 As Worksheet
Dim NuevoLibro As Workbook
' Set references to sheets
Set Hoja1 = ThisWorkbook.Sheets(SHEET_NOTA)
Set Hoja2 = ThisWorkbook.Sheets(SHEET_FDL_1)
Set Hoja3 = ThisWorkbook.Sheets(SHEET_FDL_2)
Set Hoja4 = ThisWorkbook.Sheets(SHEET_FDL_3)
Set Hoja5 = ThisWorkbook.Sheets(SHEET_FOGLIO_1)
' Copy sheets to new workbook
Hoja1.Copy
Set NuevoLibro = ActiveWorkbook
' Copy remaining sheets
Hoja2.Copy After:=NuevoLibro.Sheets(1)
Hoja3.Copy After:=NuevoLibro.Sheets(2)
Hoja4.Copy After:=NuevoLibro.Sheets(3)
Hoja5.Copy After:=NuevoLibro.Sheets(4)
' Save and close
NuevoLibro.SaveAs rutaPDF, FileFormat:=xlWorkbookDefault
NuevoLibro.Close SaveChanges:=False
ExportToExcel = True
Else
ExportToExcel = False
End If
End Function
Public Function ExportComessaToExcel() As Boolean
Dim rutaPDF As String
Dim nombreArchivo As String
Dim wsComesse As Worksheet
Dim fechaDesde As Date
Dim n As Integer
' Set reference to Commesse sheet
Set wsComesse = ThisWorkbook.Sheets(SHEET_COMMESSE)
' Find the date to use in filename
For n = 1 To 7
If wsComesse.Cells(8, 2 * n).Value2 <> 0 Then
fechaDesde = wsComesse.Cells(2, 2 * n).Value2
End If
Next n
' Build filename
nombreArchivo = "C:\Users\migue\OneDrive\Miguel\CSA - Trabajo\2024\Angelo Comesse\" + _
"Ore " & Format(fechaDesde, "dd-MM") & " Vera Miguel.xlsx"
' Show Save dialog
rutaPDF = Application.GetSaveAsFilename(InitialFileName:=nombreArchivo, _
FileFilter:="XLS Files (*.xlsx), *.xlsx", Title:="Guardar como XLS")
If (rutaPDF <> "False") And (rutaPDF <> "Falso") Then
Dim NuevoLibro As Workbook
Dim NuevaHoja As Worksheet
' Create new workbook and copy data
Set NuevoLibro = Workbooks.Add
Set NuevaHoja = NuevoLibro.Sheets(1)
wsComesse.Cells.Copy
With NuevaHoja.Cells
.PasteSpecial Paste:=xlPasteValues
.PasteSpecial Paste:=xlPasteFormats
End With
Application.CutCopyMode = False
' Save the new workbook
NuevoLibro.SaveAs rutaPDF, FileFormat:=xlWorkbookDefault
' Close the new workbook
NuevoLibro.Close SaveChanges:=False
ExportComessaToExcel = True
Else
ExportComessaToExcel = False
End If
End Function

152
Funciones.vba Normal file
View File

@ -0,0 +1,152 @@
Public Sub CargarFDL()
Dim wsHoras As Worksheet
Dim fechaDesde As Date, fechaHasta As Date
Dim ultimaFilaConDatos As Long, ultimaFilaHoras As Long
Dim i As Long, j As Long
Dim nombreHojaHoras As String, nombreHojaFdl_1 As String, nombreHojaNota As String
Dim rangoSeleccionado As Range
' Nombres de las hojas en variables estáticas
nombreHojaHoras = "Horas"
nombreHojaNota = "Nota"
' Establecer referencias a las hojas de trabajo
Set wsHoras = ThisWorkbook.Sheets(nombreHojaHoras)
' Verificar si hay un rango seleccionado en la hoja "Horas" y en la columna E
If Not Application.Selection Is Nothing Then
Set rangoSeleccionado = Application.Selection
If rangoSeleccionado.Worksheet.Name = "Horas" And rangoSeleccionado.EntireColumn.Address = wsHoras.Columns("E").Address Then
' Si es así, usar las fechas en el rango seleccionado
fechaDesde = rangoSeleccionado.Cells(1, 1).Value2
fechaHasta = rangoSeleccionado.Cells(rangoSeleccionado.Rows.Count, 1).Value2
End If
End If
' Si no hay una selección apropiada, utilizar otro método para determinar las fechas
If fechaDesde = 0 Or fechaHasta = 0 Then
' Encontrar la última fila con datos en las columnas F:M en la hoja "Horas"
ultimaFilaConDatos = wsHoras.Range("F:M").Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
ultimaFilaHoras = wsHoras.Cells(Rows.Count, 5).End(xlUp).Row
' Establecer la fechaDesde y fechaHasta según la última fila con datos en la columna E
fechaHasta = wsHoras.Cells(ultimaFilaConDatos, 5).Value2
fechaDesde = DateAdd("d", -28, fechaHasta)
End If
' Establecer las fechas por defecto en los TextBox
ConsultarFechas.t_hasta.value = Format(fechaHasta, "dd/mm/yyyy")
ConsultarFechas.t_desde.value = Format(fechaDesde, "dd/mm/yyyy")
' Obtener ultimo numero de Factura
ConsultarFechas.frm_factnro.value = ThisWorkbook.Sheets(nombreHojaNota).Cells(6, 3).value
ConsultarFechas.Show
End Sub
' C:/Users/migue/miniconda3/envs/general/python.exe d:/Proyectos/Scripts/InicioApagadoToExcel/LeerLogsToExcel.py
Sub RunLeerLogsToExcel()
Python_ActualizarLogsHorarios
ActualizarDatos
End Sub
Sub AbrirLogsHorarios()
Dim wb As Workbook
' Abre el libro de trabajo especificado
Set wb = Workbooks.Open("D:\Proyectos\Scripts\Horarios\InicioApagadoToExcel\LogEncendidoApagado.xlsx")
' Actualiza todas las conexiones del libro de trabajo abierto
wb.RefreshAll
End Sub
Sub Python_ActualizarLogsHorarios()
Dim objShell As Object
Dim PythonExePath As String
Dim PythonScriptPath As String
' Define la ruta del ejecutable de Python
PythonExePath = "C:\Users\migue\miniconda3\envs\general\python.exe"
' Define la ruta de tu script de Python
PythonScriptPath = "d:\Proyectos\Scripts\Horarios\InicioApagadoToExcel\LeerLogsToExcel.py"
' Define la ruta del archivo donde se guardarán los logs
Dim LogFilePath As String
LogFilePath = "d:\Proyectos\Scripts\Horarios\InicioApagadoToExcel\python_log.txt"
' Crear un objeto Shell
Set objShell = VBA.CreateObject("WScript.Shell")
' Ejecutar el script de Python
objShell.Run "cmd /c " & PythonExePath & " " & PythonScriptPath & " > " & LogFilePath & " 2>&1", 0, True
Set objShell = Nothing
End Sub
Sub ActualizarDatos()
Dim wb As Workbook
' Abre el libro de trabajo especificado
Set wb = Workbooks.Open("D:\Proyectos\Scripts\Horarios\InicioApagadoToExcel\LogEncendidoApagado.xlsx")
' Actualiza todas las conexiones del libro de trabajo abierto
wb.RefreshAll
' Espera un tiempo específico para que se completen las actualizaciones
' Por ejemplo, espera 5 segundos. Ajusta este tiempo según sea necesario
Application.Wait Now + TimeValue("00:00:05")
' Cierra el libro de trabajo sin guardar los cambios
wb.Close SaveChanges:=False
' Actualiza todas las conexiones del libro de trabajo actual (opcional)
ThisWorkbook.RefreshAll
End Sub
Sub SaveComessas()
Menu.b_gen_hoja_comessas_Click
End Sub
Public Sub CargarMENU()
Menu.Show
End Sub
Public Function SumarPorMes(rangoFechas As Range, mes As Integer, rangoSuma As Range) As Double
Dim sumaTotal As Double
Dim i As Integer
On Error Resume Next
sumaTotal = 0
' Recorre el rango de fechas y suma los valores si el mes coincide
For i = 1 To rangoFechas.Count
If Month(rangoFechas.Cells(i).Value2) = mes Then
sumaTotal = sumaTotal + rangoSuma.Cells(i).Value2
End If
Next i
SumarPorMes = sumaTotal
End Function
Public Sub Test()
Dim resultado As Double
resultado = SumarPorMes(Sheets("Horas").Range("E3:E367"), 9, Sheets("Horas").Range("O3:O367"))
Debug.Print "La suma para el mes 9 es: " & resultado
End Sub

74
MainModule.vba Normal file
View File

@ -0,0 +1,74 @@
' Module: MainModule
' Description: Main entry points for the application
Public Sub ShowMenu()
' Display the main menu form
Menu.Show
End Sub
Public Sub ProcessLogs()
' Update logs and refresh data
RunPythonLogProcessor
RefreshLogData
End Sub
Public Sub GenerateInvoice()
' Generate invoice by showing date selection form
ShowDateSelectionForm
End Sub
Public Sub ExportCommessaSheet()
' Export Comesse sheet to Excel
ExportComessaToExcel
End Sub
' Helper function to display date selection form
Private Sub ShowDateSelectionForm()
Dim wsHoras As Worksheet
Dim fechaDesde As Date, fechaHasta As Date
Dim rangoSeleccionado As Range
' Set reference to Horas sheet
Set wsHoras = ThisWorkbook.Sheets(SHEET_HORAS)
' Check if there's a selected range in Horas sheet and column E
If Not Application.Selection Is Nothing Then
Set rangoSeleccionado = Application.Selection
If rangoSeleccionado.Worksheet.Name = SHEET_HORAS And _
rangoSeleccionado.EntireColumn.Address = wsHoras.Columns("E").Address Then
' Use dates from selected range
fechaDesde = rangoSeleccionado.Cells(1, 1).Value2
fechaHasta = rangoSeleccionado.Cells(rangoSeleccionado.Rows.Count, 1).Value2
End If
End If
' If no appropriate selection, use default date calculation
If fechaDesde = 0 Or fechaHasta = 0 Then
fechaHasta = GetDefaultEndDate()
fechaDesde = GetDefaultStartDate(fechaHasta)
End If
' Set default values in the form
ConsultarFechas.t_hasta.Value = Format(fechaHasta, "dd/mm/yyyy")
ConsultarFechas.t_desde.Value = Format(fechaDesde, "dd/mm/yyyy")
' Set invoice number
ConsultarFechas.frm_factnro.Value = ThisWorkbook.Sheets(SHEET_NOTA).Cells(6, 3).Value
' Show form
ConsultarFechas.Show
End Sub
Public Sub RunDiagnostic()
' Run a diagnostic test
Debug.Print "System Diagnostics:"
Debug.Print "-------------------"
Debug.Print "Python Path: " & PYTHON_EXE_PATH
Debug.Print "Script Path: " & SCRIPT_PATH
Debug.Print "Log Path: " & LOG_FILE_PATH
Debug.Print "Excel Log Path: " & LOG_EXCEL_PATH
Dim testResult As Double
testResult = SumarPorMes(Sheets(SHEET_HORAS).Range("E3:E367"), Month(Date), Sheets(SHEET_HORAS).Range("O3:O367"))
Debug.Print "Test sum for current month: " & testResult
End Sub

73
Menu.vba Normal file
View File

@ -0,0 +1,73 @@
Private Sub b_cargar_logs_Click()
RunLeerLogsToExcel
Unload Me
End Sub
Private Sub b_gen_factura_Click()
CargarFDL.CargarFDL
Unload Me
End Sub
Public Sub b_gen_hoja_comessas_Click()
Dim rutaPDF As String
Dim nombreArchivo As String
Dim wsComesse As Worksheet
Dim fechaDesde As Date, fechaHasta As Date
Dim nombreComesseHoras As String
Dim n As Integer
' Nombres de las hojas en variables estáticas
nombreHojaHoras = "Horas"
nombreComesseHoras = "Commesse"
' Establecer referencias a las hojas de Comesse
Set wsComesse = ThisWorkbook.Sheets(nombreComesseHoras)
For n = 1 To 7
If wsComesse.Cells(8, 2 * n).Value2 <> 0 Then
' Establecer la fechaDesde y fechaHasta según la última fila con datos en la columna E
fechaDesde = wsComesse.Cells(2, 2 * n).Value2
End If
Next n
' Construir el nombre del archivo PDF basado en las fechas - Ore 16-09 Vera Miguel.xlsx
nombreArchivo = "C:\Users\migue\OneDrive\Miguel\CSA - Trabajo\2024\Angelo Comesse\" + "Ore " & Format(fechaDesde, "dd-MM") & " Vera Miguel.xlsx"
' Mostrar el cuadro de diálogo "Guardar como" y obtener la ruta seleccionada
rutaPDF = Application.GetSaveAsFilename(InitialFileName:=nombreArchivo, _
FileFilter:="XLS Files (*.xlsx), *.xlsx", Title:="Guardar como XLS")
' Comprobar si el usuario ha cancelado el cuadro de diálogo
If (rutaPDF <> "False") And (rutaPDF <> "Falso") Then
Dim Hoja1 As Worksheet
Dim NuevoLibro As Workbook
Dim NuevaHoja As Worksheet
' Ajusta los nombres de las hojas a los que necesitas
Set Hoja1 = ThisWorkbook.Sheets(nombreComesseHoras)
' Crea un nuevo libro
Set NuevoLibro = Workbooks.Add
Set NuevaHoja = NuevoLibro.Sheets(1)
' Copia las celdas como valores desde la hoja original a la nueva hoja
Hoja1.Cells.Copy
With NuevaHoja.Cells
.PasteSpecial Paste:=xlPasteValues
.PasteSpecial Paste:=xlPasteFormats
End With
Application.CutCopyMode = False
' Guarda el nuevo libro como archivo .xls
' Cambia la ruta de archivo y el nombre según necesites
NuevoLibro.SaveAs rutaPDF, FileFormat:=xlWorkbookDefault
' Cierra el nuevo libro sin guardar cambios
NuevoLibro.Close SaveChanges:=False
End If
Unload Me
End Sub

View File

@ -0,0 +1,29 @@
' Form module: ConsultarFechas
' Description: Date selection form with refactored code
Dim b_Export As Boolean
Private Sub b_completar_Click()
' Process data without exporting
b_Export = False
ProcessFormData
Unload Me
End Sub
Private Sub b_completar_exportar_Click()
' Process data and export
b_Export = True
ProcessFormData
Unload Me
End Sub
Private Sub ProcessFormData()
Dim fechaDesde As Date, fechaHasta As Date
' Parse dates from form inputs
fechaDesde = GetDateFromString(Me.t_desde.Value)
fechaHasta = GetDateFromString(Me.t_hasta.Value)
' Process the work hour data
ProcessWorkHourData fechaDesde, fechaHasta, b_Export, Me.frm_factnro.Value
End Sub

58
RefactoredMenu.vba Normal file
View File

@ -0,0 +1,58 @@
' Form module: Menu
' Description: Main application menu with refactored code
Private Sub b_cargar_logs_Click()
' Process logs and update data
RunPythonLogProcessor
RefreshLogData
Unload Me
End Sub
Private Sub b_gen_factura_Click()
' Show the date selection form
ShowDateSelectionForm
Unload Me
End Sub
Public Sub b_gen_hoja_comessas_Click()
' Export Comesse to Excel
ExportComessaToExcel
Unload Me
End Sub
' Helper method to display the date selection form
Private Sub ShowDateSelectionForm()
Dim wsHoras As Worksheet
Dim fechaDesde As Date, fechaHasta As Date
Dim rangoSeleccionado As Range
' Set reference to Horas sheet
Set wsHoras = ThisWorkbook.Sheets(SHEET_HORAS)
' Check if there's a selected range in Horas sheet and column E
If Not Application.Selection Is Nothing Then
Set rangoSeleccionado = Application.Selection
If rangoSeleccionado.Worksheet.Name = SHEET_HORAS And _
rangoSeleccionado.EntireColumn.Address = wsHoras.Columns("E").Address Then
' Use dates from selected range
fechaDesde = rangoSeleccionado.Cells(1, 1).Value2
fechaHasta = rangoSeleccionado.Cells(rangoSeleccionado.Rows.Count, 1).Value2
End If
End If
' If no appropriate selection, use default date calculation
If fechaDesde = 0 Or fechaHasta = 0 Then
fechaHasta = GetDefaultEndDate()
fechaDesde = GetDefaultStartDate(fechaHasta)
End If
' Set default values in the form
ConsultarFechas.t_hasta.Value = Format(fechaHasta, "dd/mm/yyyy")
ConsultarFechas.t_desde.Value = Format(fechaDesde, "dd/mm/yyyy")
' Set invoice number
ConsultarFechas.frm_factnro.Value = ThisWorkbook.Sheets(SHEET_NOTA).Cells(6, 3).Value
' Show form
ConsultarFechas.Show
End Sub

64
readme.txt Normal file
View File

@ -0,0 +1,64 @@
Work Hours Management System
This VBA-based system helps manage work hours, generate reports, and create invoices.
Core Components
1. Menu System (Menu.vba)
Provides the main interface for accessing different functionalities
Features:
Load work logs
Generate invoices
Export work commission sheets ("comesse")
2. Date Query Interface (ConsultarFechas.vba)
Handles date-based operations and report generation
Key features:
Date range selection
PDF export functionality
Excel export functionality
Multi-sheet FDL report generation (FDL_1, FDL_2, FDL_3)
3. Core Module (Modulo.vba)
Contains core functionality including:
FDL report loading
Python script integration for log processing
Monthly sum calculations
Data refresh operations
Key Features
Work Log Management
Automatic log reading and Excel conversion
Integration with Python scripts for log processing
Automated data refresh capabilities
Report Generation
PDF export functionality
Excel workbook export
Support for multiple FDL sheets
Invoice generation
Date Management
Flexible date range selection
Monthly data aggregation
Date validation and error handling
Usage
Opening the System
Generating Reports
Use the menu interface to select desired operation
Choose date ranges when prompted
Select export location for generated files
Working with Logs
Technical Notes
The system supports up to 31-day periods for report generation
Automatically handles multi-page reports (up to 42 entries)
Integrates with external Python scripts for log processing
Supports both PDF and Excel export formats
Dependencies
Excel with VBA support
Python environment (for log processing)
Required Excel sheets:
Horas
FDL_1, FDL_2, FDL_3
Nota
Foglio 1