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 Sub
La 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 Sub
Se 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 Function
Questa 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