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 Sub
Metterle 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 Sub
Bene.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 Sub
Usa 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 Sub
E' 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 Sub
Ho 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 Sub
Funziona.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