sabato 13 settembre 2014

Creazione di un oggetto a parte che formatta il foglio, nel programmino che mi è stato richiesto

Voglio isolare, in un modulo, tutti i metodi che formattano il foglio del mio programma...
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