eventi personalizzati



  • eventi personalizzati
    di claude (utente non iscritto) data: 12/07/2014 08:51:36

    Salve...
    come faccio a creare degli eventi personalizzati in excel ?
    Mi spiego meglio... ad es. Un evento che si genera quando sposto uno shape sul foglio oppure quando rinomino un foglio di lavoro...
    Grazie a tutti



  • di Vecchio Frac data: 15/07/2014 14:03:00

    Con un artificio si può fare, almeno per quanto riguarda la rinomina del foglio.
    Se rinomini un foglio attivo, quando sposti il cursore o modifichi una cella dovrebbe avvisarti.
     
    'un modulo di classe
    Option Explicit
    
    Private WithEvents xlApp As Application
    Private WithEvents xlSheet As Worksheet
    
    Private CurrSheet As Worksheet
    Private CurrSheetName As String
    
    
    Private Sub Class_Initialize()
        Set xlApp = Excel.Application
        Set CurrSheet = ActiveSheet
        Set xlSheet = ActiveSheet
        CurrSheetName = CurrSheet.Name
    End Sub
    
    Private Sub Class_Terminate()
        Set xlApp = Nothing
    End Sub
    
    
    Private Sub xlApp_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        Call changed_name
    End Sub
    
    Private Sub xlSheet_SelectionChange(ByVal Target As Range)
        Call changed_name
    End Sub
    
    
    Private Sub changed_name()
        If CurrSheetName <> CurrSheet.Name Then
            MsgBox "Nome foglio cambiato da " & CurrSheetName & " a " & CurrSheet.Name
        End If
        Set CurrSheet = ActiveSheet
        CurrSheetName = CurrSheet.Name
    End Sub
    
    
    
    'nel codice di ThisWorkbook
    Option Explicit
    
    Private xlc As Classe1
    
    Sub Workbook_Open()
        Set xlc = New Classe1
    End Sub






  • di claude78 (utente non iscritto) data: 18/07/2014 21:21:56

    Ottimo suggerimento !



  • di scossa (utente non iscritto) data: 18/07/2014 22:36:17

    Ciao a tutti,

    questa discussione mi era sfuggita.

    cit.: "come faccio a creare degli eventi personalizzati in excel ?"

    direi che non puoi, gli eventi non puoi "inventarli" vengono "ereditati": ad esempio per un foglio puoi personalizzare l'evento SelectionChange() (come suggerito da Vecchio Frac) ma non crearti un evento NameChanged().

    In alternativa alla proposta di V.F., se si vuole impedire di rinominare i fogli si può sfruttare il CodeName:



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Nel modulo di classe di ThisWorkbook (Questa_cartella_di_lavoro):
    
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
      Call VerificaNome(Sh)
    End Sub
    
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      Call VerificaNome(Sh)
    End Sub
    
    Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
      Call VerificaNome(Sh)
    End Sub
    
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
      Call VerificaNome(Sh)
    End Sub
    
    
    
    
    In un modulo standard:
    
    Public Sub VerificaNome(ByRef shSUT As Worksheet)
      With shSUT
        If .CodeName <> shSUT.Name Then
          MsgBox "il foglio " & .CodeName & vbCrLf _
            & "era stato rinominato in " & .Name & vbCrLf _
            & "Ho ripristinato il nome originale!"
            .Name = .CodeName
        End If
      End With
    End Sub



  • di Vecchio Frac data: 19/07/2014 14:11:47

    E per completare il discorso direi che la richiesta "Un evento che si genera quando sposto uno shape sul foglio" non è proprio possibile soddisfarla, almeno non con i mezzi normali di cui disponiamo in Excel. Probabilmente si dovrebbe subclassare Excel... è fuori dalla nostra portata.
    Sarebbe carino crearsi dei gestori di evento personalizzati, possiamo solo disporre degli eventi predefiniti dal modello di oggetti esposto (e gli oggetti della classe Shapes non prevedono questa possibilità, nè quelli la classe ShapeRange: non espongono eventi intercettabili).





  • di claude78 (utente non iscritto) data: 19/07/2014 14:36:35

    Un vero peccato e un grosso limite per la programmazione avanzata in Excel...



  • di claude (utente non iscritto) data: 19/07/2014 15:41:44

    Sto leggendo un po' del subclassing... Grande Vecchio Frac il subclassing era proprio quello che cercavo... ma non sapevo come cercavo...



  • di claude (utente non iscritto) data: 20/07/2014 15:19:24

    Qualcuno conosce un buon libro in italiano sul subclassing ?