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 MEDOvviamente, 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 SubCon 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