Ho lasciato nel modulo della cartella soltanto la routine che gestisce l'evento click destro sul foglio, che ovviamente non può stare da nessun'altra parte, e ho messo tutto il resto in un modulo chiamato gestoreMenu.
Questo il codice del modulo ThisWorkbook:
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) If IsDate(Sh.Name) = False Then Exit Sub Cancel = True avvioMenu Target End SubLa riga:
If IsDate(Sh.Name) = False Then Exit Subfa sì che se il nome del foglio non corrisponde a una data, ossia se non è uno dei fogli calendario dei mesi, la gestione finisce qui.
Cancel = Trueserve a evitare che compaia il menu contestuale di default.
Quindi viene chiamata la routine avvioMenu con il parametro Target, ossia il range che è stato cliccato col destro:
avvioMenu Target
Il resto si svolge nel modulo gestoreMenu:
Questa è la routine avvioMenu che accetta il range per parametro, alla quale viene passato Target.
Sub avvioMenu(bers As Range) If campoConMenu(bers) = True Then Set Bersaglio = bers showMenu End If End SubSe il campo è uno di quelli per i quali al click destro deve apparire un menu, allora nella variabile oggetto Bersaglio viene copiato il range Target passato come parametro alla routine (ossia la cella cliccata, sulla quale deve apparire la scritta), e viene chiamata la routine showMenu.
Se il campo è di quelli per cui deve apparire un menu, viene stabilito dalla funzione campoConMenu
Function campoConMenu(campo As Range) As Boolean If Intersect(campo, Range("TurnoNotte")) Is Nothing = False Then campoConMenu = True If Intersect(campo, Range("TurnoGiorno")) Is Nothing = False Then If festivo(campo.Offset(0, -1).FormulaR1C1) Then campoConMenu = True End If End FunctionQuesta stabilisce due condizioni per cui il campo debba possedere un menu che appare al click destro:
1) Il campo appartine al campo TurnoNotte;
If Intersect(campo, Range("TurnoNotte")) Is Nothing = False Then campoConMenu = True
2) Il campo appartiene al range TurnoGiorno e il valore della data che appare alla colonna 1 in corrispondenza della riga del campo rappresenta un giorno festivo
If Intersect(campo, Range("TurnoGiorno")) Is Nothing = False Then If festivo(campo.Offset(0, -1).FormulaR1C1) Then campoConMenu = True End If
Se il giorno è festivo, viene stabilito da questa funzione:
Function festivo(valore As String) As Boolean If Weekday(CDate(Val(valore) & " " & ActiveSheet.Name)) = 1 Then festivo = True End Function
Quindi, in sintesi, abbiamo tre routines che decidono se al click destro su una cella debba apparire il menu tramite la routine showMenu:
Sub avvioMenu(bers As Range) If campoConMenu(bers) = True Then Set Bersaglio = bers showMenu End If End Sub Function campoConMenu(campo As Range) As Boolean If Intersect(campo, Range("TurnoNotte")) Is Nothing = False Then campoConMenu = True If Intersect(campo, Range("TurnoGiorno")) Is Nothing = False Then If festivo(campo.Offset(0, -1).FormulaR1C1) Then campoConMenu = True End If End Function Function festivo(valore As String) As Boolean If Weekday(CDate(Val(valore) & " " & ActiveSheet.Name)) = 1 Then festivo = True End Function
Nessun commento:
Posta un commento