Macro che si attiva all'uscita dal foglio

Anonimo
2013-03-07T23:30:53+00:00

Buonasera vorrei capire le istruzioni da assegnare ad una macro che si attivi all'uscita da quel singolo foglio.

Questa ad esempio si attiva prima di chiudere la cartella di lavoro, a me invece serve quando esco dal foglio e torno a dun altro foglio della stessa cartella.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ORDINA IL FOGLIO PRIMA DI USCIRE DALLO STESSO

With Me.Worksheets("DbDipendenti")

Columns("A:A").Select

ActiveWorkbook.Worksheets("dbDipendenti").Sort.SortFields.Clear

ActiveWorkbook.Worksheets("dbDipendenti").Sort.SortFields.Add Key:=Range( _

"A2:A200"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _

xlSortNormal

ActiveWorkbook.Worksheets("dbDipendenti").Sort.SortFields.Add Key:=Range( _

"B2:B200"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _

xlSortNormal

With ActiveWorkbook.Worksheets("dbDipendenti").Sort

.SetRange Range("A1:I200")

.Header = xlYes

.MatchCase = False

.Orientation = xlTopToBottom

.SortMethod = xlPinYin

.Apply

End With

Range("A2").Select

End With

End Grazie che non é una istruzione ma un ringraziamento

Bnotte

A

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2013-03-08T08:58:53+00:00

Ciao Andrea22,

da quel che dici quello che ti ho illustrato è proprio ciò di cui hai bisogno, invece. Vediamo perché non lo riconosci...

Forse perché insisti a pensare in termini di "entrare in un foglio"? Non si entra né si esce da un foglio. Si attiva, E, conseguentemente, il precedente si disattiva. Questi sono gli eventi che abbiamo a disposizione e con questi dobbiamo operare.

Inoltre... Parli di una macro presente in ThisWorkbook. Ma in ThisWorkbook non possono essere presenti macro. Le routine in ThisWorkbook, che è un modulo di classe, possono essere soltanto o routine di gestione degli eventi o metodi di ThisWorkbook. Le macro puoi scriverle soltanto in un modulo standard pubblico.

Per prendere confidenza con la cosa prova così, con una cartella di lavoro nuova al cui progetto Visual Basic aggiungerai un modulo:

' ThisWorkbook - Modulo di classe dell'oggetto Workbook

'

Option Explicit

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    MsgBox Sh.Name, vbOKOnly, "SheetActivate"

    aMacro

End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

    MsgBox Sh.Name, vbOKOnly, "SheetDeactivate"

End Sub

' Modulo1 - Modulo standard pubblico

'

Option Explicit

Public Sub aMacro()

    MsgBox "aMacro", vbOKOnly, ThisWorkbook.ActiveSheet.Name

End Sub

La risposta è stata utile?

0 commenti Nessun commento

23 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2013-03-08T12:21:13+00:00

    Non ho inserito l’espressione Option Explicit (né nel this né nel modulo) altrimenti quello che c’è in thisworkbook

    [...]

    Mi manda in tilt questa macro

    [...]

    Ma se non è un problema me la tengo benissimo così.

    Io pensavo che si potevo inserire o una o l’altra espressione, mi riferisco a

    Private Sub Workbook_SheetActivate e Private Sub Workbook_SheetDisActivate; ma ho capito che devono essere inserite entrambe per ottenere il risultato voluto!

    Ciao Andrea22,

    male, malissimo! ;-)

    Option Explicit va sempre usato. Ovvero, ti conviene usarlo. Meglio addirittura impostarlo di default. Così:

    • Strumenti

    Opzioni...

    Editor

    [v] Dichiarazione di variabili obbligatoria

    [ OK ]

    Poi, dove mancano, andranno aggiunte le definizioni di costanti e variabili usate nei moduli e nelle routine. Per esempio:

    Sub PrimaCellaLibera()

    Dim nriga AS Long

    Dim rigalibera As Long

        Application.ScreenUpdating = False

        'per trovare la prima riga libera in un foglio <--- Bugia.

        Range("A2").Select ' <--- A cosa serve?

        nriga = 2

        While Cells(nriga, 1) <> ""

              nriga = nriga + 1

        Wend

        rigalibera = nriga

        Cells(rigalibera, 1).Select

        'fine

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-03-08T11:53:45+00:00

    Bingoooo, Grazie 1000 e mi inchino!

    Non ho inserito l’espressione Option Explicit (né nel this né nel modulo) altrimenti quello che c’è in thisworkbook

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)

        'MsgBox Sh.Name, vbOKOnly, "SheetActivate"

         Macro_Ordina_DbDipendenti

         PrimaCellaLibera

         'End If

     End Sub

    Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

     'MsgBox Sh.Name, vbOKOnly, "SheetDeactivate"

     End Sub

    Mi manda in tilt questa macro

    Sub PrimaCellaLibera()

        Application.ScreenUpdating = False

        'per trovare la prima riga libera in un foglio

        Range("A2").Select

        nriga = 2

        While Cells(nriga, 1) <> ""

    nriga = nriga + 1

        Wend

        rigalibera = nriga

        Cells(rigalibera, 1).Select

        'fine

    End Sub

    Ma se non è un problema me la tengo benissimo così.

    Io pensavo che si potevo inserire o una o l’altra espressione, mi riferisco a

    Private Sub Workbook_SheetActivate e Private Sub Workbook_SheetDisActivate; ma ho capito che devono essere inserite entrambe per ottenere il risultato voluto!

    Merci e buon appetito!

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-03-08T08:25:57+00:00

    Buongiorno Maurizio ho capito le tue indicazioni ma non è esattamente quello che avevo bisogno.

    Mi spiego entro in un file composto di diversi fogli; entro in uno di questi, DbDatabase, aggiungo un nominativo in colonna A ed altri dati, poi cambio/esco  foglio.

    Io vorrei che cambiando foglio la macro, inserita in thisworkbook,  si attivasse e mettendo  in ordine alfabetico la colonna A con le istruzioni del primo post (macro2)

    Ho provato a comporre la macro con le tue istruzioni ma sbaglio qualcosa

    Grazie e buona giornata, 5° giorno di pioggia! ke paXXe

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    If Sh.Name = "DbDipednenti" Then

    ' esegui una macro -oppure- del codice

    macro2

    End If

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2013-03-07T23:56:10+00:00

    Ciao Andrea22,

    "uscire" dal foglio e "tornare" al foglio... Il Modello degli oggetti di Excel mette a disposizione, per la Cartella di lavoro (Workbook) l'intercettazione di due eventi fondamentali, l'attivazione e la disattivazione dei suoi Fogli (Sheets). Cioè:

    • Event SheetActivate(Sh As Object)

        Membro di Excel.Workbook

    • Event SheetDeactivate(Sh As Object)

        Membro di Excel.Workbook

    Dato che, come vedi, sono membri di Excel.Workbook li trovi nel modulo ThisWorkbook del Progetto Visual Basic della Cartella di lavoro.

    L'argomento Sh è un generico Object dato che il Foglio attivato può essere di tipo Foglio di lavoro (Worksheet), Grafico (Chart), ecc.

    Tutti però possiedono la:

    • Property Name As String

        Membro di Excel.<diversi oggetti>

    grazie alla quale potrai distinguere quale Foglio è attivato, o disattivato. Per esempio così:

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)

        If Sh.Name = "Foglio1" Then

          ' esegui una macro -oppure- del codice

        End If

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento