Primera version refactorizada
This commit is contained in:
commit
65f67ddd82
|
@ -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"
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue