sabato 27 settembre 2014

Ripristino dell'aggiunta intelligente di fogli calendario e creazione di menu personalizzati.

Adesso cosa mi rimane da fare?
La signora della direzione sanitaria invia lo scheletro dei turni, con l'attribuzione dei reparti, mentre l'attribuzione dei medici la fa il primario di ogni singolo reparto.
Una volta che ogni reparto ha stabilito i medici per ogni turno, la signora li trascrive e calcola i turni totali per l'attribuzione anche dei turni straordinari.
Predisponiamo i menu, dunque.

Ma prima devo ripristinare quel meccanismo del caricamento di nuovi fogli solo se sono del mese successivo, senza ripetizioni.
Vediamo la routine nel programma vecchio...

Sub main()
    Dim d As Date, nomeFoglio As String
    
    d = DateAdd("m", 1, Date)      'attribuisce alla variabile locale d il valore del mese successivo alla data attuale
    nomeFoglio = MonthName(Month(d)) & " " & Year(d)    'attribuisce alla stringa nomeFoglio mese e anno della variabile locale d
    
    Sheets.Add          'aggiunge un nuovo foglio
    On Error GoTo x     'gestisce l'errore di tentata rinominazione del foglio
    ActiveSheet.Name = nomeFoglio   'rinomina il foglio con la stringa nomeFoglio.
    ActiveSheet.Move after:=Sheets(Sheets.Count) 'sposta alla fine della cartella il nuovo foglio

        
    formattaFoglio Month(d), Year(d)  'formatta il foglio secondo lo schema
    attribuzioneTurni
    Exit Sub
x:     'gestione dell'errore di tentata rinominazione del foglio: elimina il foglio senza suscitare avvisi di eliminazione.
    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True
End Sub
Mi sembra ben congegnata.
Ho fatto l'aggiunta della chiamata alla routine attribuzioneTurni(), e funziona egregiamente!
Bene! In questo modo, in un paio di secondi, la signora si troverà i turni predisposti, da mandare ai reparti perché essi li compilino con i nomi dei singoli medici.

Ora mi devo occupare dei menu.
Per prima cosa, devo definire di quali reparti i medici fanno parte.
E' bene che mi crei un elenco di medici con l'appartenenza ai relativi reparti.

Mario Sistoletti CAR
Giovanni Mitrali CAR
Arnaldo Coronari CAR
Luigi Di Astoli         CAR
Fernando Ventricoli CAR
Lucio Interni         MED
Marco Medici         MED
Luciano Luminari MED
Antonio Scienziatoni MED
Anselmo Nuvoloni MED
Ovviamente, nomi fittizi, stando qui in ambiente pubblico.

Ecco, ho trasferito dal vecchio abbozzo del programma tutto il blocco di codice che gestisce i menu e mi sono trovato anche qui perfettamente rappresentati i menu.
Ma ora devo intervenire per visualizzare solo i cardiologi o solo gli internisti a seconda del reparto che ha il turno.

Devo intervenire su questa routine del modulo gestoreMenu.
Private Sub caricaMenu(menu As CommandBar, rigaIniziale As Integer, col As Integer)
    Dim button As CommandBarButton
    For k = 1 To Range("ListaNomiMese").Rows.Count
        Set button = menu.Controls.Add(Type:=msoControlButton)
        button.Caption = Range("ListaNomiMese").Cells(k, 1).FormulaR1C1
        button.OnAction = "'scrivi """ & button.Caption & """, """ & button.Tag & """'"
    Next k
    Set button = menu.Controls.Add(Type:=msoControlButton)
    button.Caption = ""
    button.OnAction = "'scrivi """ & button.Caption & """, """ & button.Tag & """'"
End Sub
In particolare su quella riga di codice evidenziata.

Mi chiedo se sia possibile selezionare le celle in relazione a un criterio...

Ecco: sembra che sia riuscito a produrre una routine efficiente:
Private Sub caricaMenu(menu As CommandBar, rigaIniziale As Integer, col As Integer)
    Dim SiglaReparto As String
    Dim button As CommandBarButton
    If Intersect(Bersaglio, Range("TurnoNotte")) Is Nothing = False Then
            SiglaReparto = Right(Range("Reparto").Cells(Bersaglio.Row - Range("Reparto").Row + 1, 1).Formula, 3)
        Else
            SiglaReparto = Left(Range("Reparto").Cells(Bersaglio.Row - Range("Reparto").Row + 1, 1).Formula, 3)
        End If
    For k = 1 To Range("ListaNomiMese").Rows.Count
        If Range("ListaNomiMese").Cells(k, 1).Offset(0, 1).Formula = SiglaReparto Then
            Set button = menu.Controls.Add(Type:=msoControlButton)
            button.Caption = Range("ListaNomiMese").Cells(k, 1).FormulaR1C1
            button.OnAction = "'scrivi """ & button.Caption & """, """ & button.Tag & """'"
        End If
    Next k
    Set button = menu.Controls.Add(Type:=msoControlButton)
    button.Caption = ""
    button.OnAction = "'scrivi """ & button.Caption & """, """ & button.Tag & """'"
End Sub
Con questa, se il turno è attribuito alla cardiologia appare solo un menu di cardiologi, mentre se è attribuito alla medicina appare un menu solo di internisti.

Nessun commento:

Posta un commento