lunedì 22 settembre 2014

Gestione del menu popup, prima sezione: le routines che decidono per la comparsa del menu al click destro su una cella

Ho aggiustato le routines per la gestione dei Menu.
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 Sub
fa 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 = True
serve 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