Si tratta di un oggetto statico, perché le funzioni vanno semplicemente richiamate, senza necessità di istanziare.
Questa è la routine che coordina le varie sezioni che gestiscono il foglio.
Private Sub organizzaFoglio() 'inizializza le variabili colonna e riga, e ne copia i valori iniziali per preservarli, nelle 'variabili PrimaColonna e PrimaRiga Riga = 3 Colonna = 1 PrimaColonna = Colonna PrimaRiga = Riga scriviIntestazioni aggiuntaDate creazioneGriglia scrittaDiCoda impostazioniStampa End SubMetterle su un modulo a parte significa dover definire le variabili in quest'altro modulo.
Dim Riga As Integer
Dim Colonna As Integer
Dim primaRiga As Integer
Dim primaColonna As Integer
Sub gestisciFoglio()
'inizializza le variabili colonna e riga, e ne copia i valori iniziali per preservarli, nelle
'variabili PrimaColonna e PrimaRiga
Riga = 3
Colonna = 1
primaColonna = Colonna
primaRiga = Riga
scriviIntestazioni
aggiuntaDate
creazioneGriglia
scrittaDiCoda
impostazioniStampa
End Sub
Alla funzione va passato il valore di riga e colonna, che è meglio inizializzare prima per tenere in mano il comando di dove si vuole creare il prospetto.
Dim Riga As Integer Dim Colonna As Integer Dim primaRiga As Integer Dim primaColonna As Integer Sub gestisciFoglio(R As Integer, C As Integer) 'inizializza le variabili colonna e riga, e ne copia i valori iniziali per preservarli, nelle 'variabili PrimaColonna e PrimaRiga Riga = R Colonna = C primaRiga = Riga primaColonna = Colonna scriviIntestazioni aggiuntaDate creazioneGriglia scrittaDiCoda impostazioniStampa End SubBene.
Dunque questa routine usa due variabili a livello di modulo, che vengono inizializzate a partire dai parametri passati alla routine.
Ora vediamo le routines che essa chiama.
Copio sul nuovo modulo scriviIntestazioni, che mi pare usi solo le variabili che sono state dichiarate a livello di modulo sul nuovo modulo, ossia Riga e Colonna. Routine scriviIntestazioni
Private Sub scriviIntestazioni() 'ALTEZZA GENERALE DELLE RIGHE Cells.Select Selection.RowHeight = 15 'AGGIUNTA DELL'INTESTAZIONE RIGA 1 Range(Cells(Riga, Colonna), Cells(Riga, Colonna + 3)).Select Selection.Merge Selection.RowHeight = 17 Selection.VerticalAlignment = xlCenter Selection.HorizontalAlignment = xlCenter Selection.Font.bold = True Selection.FormulaR1C1 = "GUARDIA MEDICA AREA FUNZIONALE OMOGENEA" Riga = Riga + 1 'AGGIUNTA DELL'INTESTAZIONE RIGA 2 Range(Cells(Riga, Colonna), Cells(Riga, Colonna + 3)).Select Selection.Merge Selection.RowHeight = 17 Selection.VerticalAlignment = xlCenter Selection.HorizontalAlignment = xlCenter Selection.Font.bold = True Selection.FormulaR1C1 = "MEDICINA-CARDIOLOGIA" Selection.Font.ColorIndex = 48 Riga = Riga + 1 'SCRIVE LE PRIME 2 RIGHE DELLA TABELLA Columns(Colonna).HorizontalAlignment = xlLeft With Cells(Riga, Colonna) .FormulaR1C1 = "DATA" .ColumnWidth = 10 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 1) .FormulaR1C1 = "Nominativo turno" .ColumnWidth = 30 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 2) .FormulaR1C1 = "Unità Operativa" .ColumnWidth = 20 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 3) .FormulaR1C1 = "Nominativo turno" .ColumnWidth = 30 .HorizontalAlignment = xlCenter End With Riga = Riga + 1 With Cells(Riga, Colonna) .FormulaR1C1 = NomeMese .ColumnWidth = 10 .HorizontalAlignment = xlCenter .Font.bold = True End With With Cells(Riga, Colonna + 1) .FormulaR1C1 = "08.00 - 20.00" .ColumnWidth = 30 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 2) .FormulaR1C1 = "" .ColumnWidth = 20 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 3) .FormulaR1C1 = "20.00 - 8.00" .ColumnWidth = 30 .HorizontalAlignment = xlCenter End With Riga = Riga + 1 End SubUsa solo le variabili Riga e Colonna, che sono già dichiarate a livello di modulo.
Altera il valore di Riga, che comunque è già stato salvato nella variabile primaRiga nel suo valore iniziale.
Funziona.
Adesso dobbiamo spostare la routine aggiungiDate.
Vediamo quali variabili usa...
Private Sub aggiuntaDate() Dim dat As Date Dim primoGiorno As Date primoGiorno = CDate("01/" & Month(dataMeseSuccessivo) & "/" & Year(dataMeseSuccessivo)) dat = primoGiorno Do While Month(dat) = Month(primoGiorno) With Cells(Riga, Colonna) .FormulaR1C1 = Day(dat) If WeekdayName(Weekday(dat, vbUseSystemDayOfWeek)) = "domenica" Then .FormulaR1C1 = .FormulaR1C1 & " D" .Font.bold = True End With dat = dat + 1 Riga = Riga + 1 Loop End SubE' un po' rudimentale, dato che ho trovato una miglior sintassi per aggiungere un mese al valore di una data.
Per quanto riguarda le variabili, dichiara e inizializza una variabile locale che forse può anche essere eliminata con la nuova sintassi, e usa le variabili relative al mese e all'anno successivi, che con la nuova sintassi possono anche essere eliminate. Provo a riscriverla.
Private Sub aggiuntaDate() 'stabiliamo la data del mese Dim Dat As Date, primaData As Date Dat = CDate("01/" & Mese & "/" & Anno) With Cells(Riga - 1, Colonna) .FormulaR1C1 = MonthName(Mese) .Font.bold = True End With ActiveSheet.Name = MonthName(Mese) & " " & Anno Do While Month(Dat) = Mese With Cells(Riga, Colonna) .FormulaR1C1 = Day(Dat) If WeekdayName(Weekday(Dat, vbUseSystemDayOfWeek)) = "domenica" Then .FormulaR1C1 = .FormulaR1C1 & " D" .Font.bold = True End With Dat = Dat + 1 Riga = Riga + 1 Loop End SubHo preferito basarmi sulle variabili Mese e Anno, dichiarate a livello di modulo, anziché sul rilevare la data attuale in questa routine, in modo che il modulo possa essere usato in modo più flessibile, non necessariamente sul mese successivo a quello attuale.
Poi aggiungo le altre funzioni che formattano il foglio.
Ecco la struttura completa del mio modulo:
Option Explicit Dim Riga As Integer Dim Colonna As Integer Dim primaRiga As Integer Dim primaColonna As Integer Dim Mese As Integer Dim Anno As Integer Sub gestisciFoglio(R As Integer, C As Integer, M As Integer, Y As Integer) 'inizializza le variabili colonna e riga, e ne copia i valori iniziali per preservarli, nelle 'variabili PrimaColonna e PrimaRiga Riga = R Colonna = C Mese = M Anno = Y primaRiga = Riga primaColonna = Colonna scriviIntestazioni aggiuntaDate creazioneGriglia scrittaDiCoda impostazioniStampa End Sub Private Sub aggiuntaDate() 'stabiliamo la data del mese Dim Dat As Date, primaData As Date Dat = CDate("01/" & Mese & "/" & Anno) With Cells(Riga - 1, Colonna) .FormulaR1C1 = MonthName(Mese) .Font.bold = True End With ActiveSheet.Name = MonthName(Mese) & " " & Anno Do While Month(Dat) = Mese With Cells(Riga, Colonna) .FormulaR1C1 = Day(Dat) If WeekdayName(Weekday(Dat, vbUseSystemDayOfWeek)) = "domenica" Then .FormulaR1C1 = .FormulaR1C1 & " D" .Font.bold = True End With Dat = Dat + 1 Riga = Riga + 1 Loop End Sub Private Sub scriviIntestazioni() 'ALTEZZA GENERALE DELLE RIGHE Cells.Select Selection.RowHeight = 15 'AGGIUNTA DELL'INTESTAZIONE RIGA 1 Range(Cells(Riga, Colonna), Cells(Riga, Colonna + 3)).Select Selection.Merge Selection.RowHeight = 17 Selection.VerticalAlignment = xlCenter Selection.HorizontalAlignment = xlCenter Selection.Font.bold = True Selection.FormulaR1C1 = "GUARDIA MEDICA AREA FUNZIONALE OMOGENEA" Riga = Riga + 1 'AGGIUNTA DELL'INTESTAZIONE RIGA 2 Range(Cells(Riga, Colonna), Cells(Riga, Colonna + 3)).Select Selection.Merge Selection.RowHeight = 17 Selection.VerticalAlignment = xlCenter Selection.HorizontalAlignment = xlCenter Selection.Font.bold = True Selection.FormulaR1C1 = "MEDICINA-CARDIOLOGIA" Selection.Font.ColorIndex = 48 Riga = Riga + 1 'SCRIVE LE PRIME 2 RIGHE DELLA TABELLA Columns(Colonna).HorizontalAlignment = xlLeft With Cells(Riga, Colonna) .FormulaR1C1 = "DATA" .ColumnWidth = 10 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 1) .FormulaR1C1 = "Nominativo turno" .ColumnWidth = 30 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 2) .FormulaR1C1 = "Unità Operativa" .ColumnWidth = 20 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 3) .FormulaR1C1 = "Nominativo turno" .ColumnWidth = 30 .HorizontalAlignment = xlCenter End With Riga = Riga + 1 With Cells(Riga, Colonna + 1) .FormulaR1C1 = "08.00 - 20.00" .ColumnWidth = 30 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 2) .FormulaR1C1 = "" .ColumnWidth = 20 .HorizontalAlignment = xlCenter End With With Cells(Riga, Colonna + 3) .FormulaR1C1 = "20.00 - 8.00" .ColumnWidth = 30 .HorizontalAlignment = xlCenter End With Riga = Riga + 1 End Sub Private Sub creazioneGriglia() 'CREAZIONE DELLA GRIGLIA COI BORDI Range(Cells(primaRiga + 2, primaColonna), Cells(Riga, primaColonna + 3)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With End Sub Private Sub scrittaDiCoda() Riga = Riga + 2 Range(Cells(Riga, primaColonna), Cells(Riga, primaColonna + 3)).Select Selection.Merge Selection.RowHeight = 35 Selection.VerticalAlignment = xlTop Selection.WrapText = True Selection.FormulaR1C1 = "N.B. Gli eventuali cambi turno di Guardia Medica AFO devono essere comunicati, ai fini di riscontro, alla scrivente Direzione Sanitaria, sig.ra XXXXXXXXXXXX, 38*** fax 38***" Cells(1, 5).Select End Sub Private Sub impostazioniStampa() 'IMPOSTAZIONI PER LA STAMPA With ActiveSheet.PageSetup .LeftMargin = Application.InchesToPoints(0.5) .RightMargin = Application.InchesToPoints(0) .PrintArea = "$A$" & primaRiga & ":$D$44" End With End SubFunziona.
Su questo modulo ho un solo metodo "esposto" all'esterno, il quale richiede i parametri Riga, Colonna, Mese e Anno per formattare completamente il foglio.
Così si gestisce meglio il resto.
Nessun commento:
Posta un commento