Una macro registrata che non funziona

Ultima modifica: 28-05-2016

Tante volte, per non avere la seccatura e la noia di digitare lunghe e difficili procedure, ci affidiamo al registratore di Macro e di seguito, con qualche piccolo ritocco la aggiustiamo secondo le nostre esigenze.

 

Primo test

Proviamo con questa semplice macro registrata e depurata delle cose inutili:

Sub Macro1()
Sheets("Foglio3").Select
Range("A2").Select
End Sub

Abbiniamo questa macro ad un pulsante preso dalla Barra dei Moduli che poniamo sul primo foglio

Facciamo delle prove ed osserviamone il comportamento.

Ci sembra che funzioni correttamente.

 

Secondo test

Eliminiamo ora il pulsante preso dai Moduli ed al suo posto disegniamo un pulsante preso questa volta dalla Barra Strumenti di controllo o Casella degli strumenti (a seconda della versione di Excel che usiamo).

Facendo doppio clic su questo pulsante mentre siamo in modalità progettazione (l'icona con la riga, squadra e matita che si trova nella Barra Strumenti di controllo, è attiva) veniamo trasferiti immediatamente nel modulo relativo al Foglio1 con già la routine iniziata:

Private Sub CommandButton1_Click()

End Sub

In questa routine di evento del pulsante CommandButton1 copiamo la macro precedentemente registrata:

Private Sub CommandButton1_Click()
Sheets("Foglio3").Select
Range("A2").Select
End Sub

Le istruzioni sono le stesse ma andiamo ad osservarne il comportamento.

Con nostro grande rammarico notiamo che la routine non funziona più. Ci restituisce un messaggio di errore: "Errore nel metodo Select per la classe Range."

 

Ci viene da chiedere: come mai questo inatteso errore?

Cerchiamo allora di studiarne il motivo. Prendiamo in esame la routine che sta nel modulo relativo al primo foglio.

Facciamola partire tramite il tasto F8.

Alla terza pressione del tasto F8 il foglio viene cambiato regolarmente

Premendo per la quarta volta il tasto F8 rispunta l'errore.

 

Che cosa possiamo notare? La riflessione è lunga ed infruttuosa. Sintatticamente le istruzioni sono corrette.

Tuttavia col pulsante preso dai Moduli funzionano, ma col pulsante preso dagli Strumenti di controllo o dalla Casella degli strumenti non vuol funzionare.

 

Le soluzioni

E' lunga arrivare alla soluzione. Ma alla fine ce la facciamo. Queste sono le mie conclusioni personali (può darsi che quelli della Microsoft mi tirino le orecchie, ma almeno posso dire che io ci ho provato e ce l'ho fatta!!!)

Per far funzionare il primo pulsante preso dai Moduli, la macro risiede in un modulo che sta al di fuori di qualsiasi foglio e compie il suo lavoro sino in fondo su qualsiasi foglio.

Per far funzionare il pulsante preso dagli Strumenti di controllo o Casella degli strumenti la routine la dobbiamo scrivere nel modulo relativo al primo foglio ed è da questo foglio che vengono eseguite le istruzioni.

Ora succede questo.

Dalla macro residente sul foglio 1 impartiamo due istruzioni:

  1. Sheets("Foglio3").Select
  2. Range("A2").Select

Mentre la prima istruzione viene eseguita senza problemi (il cambio del foglio), la seconda istruzione (la selezione della cella) non può essere eseguita perchè viene interpretata come se la selezione dovesse essere eseguita sul foglio di partenza.

Non ci restano che due soluzioni:

  1. mettere l'istruzione in un Modulo standard
  2. eseguire il comando con una sintassi più completa

Prima soluzione

Nel modulo relativo al Foglio1 richiamiamo una macro che si trova in un modulo standard

Private Sub CommandButton1_Click()
Macro1
End Sub

Nel modulo standard scriviamo le istruzioni che debbono effettuare la selezione al foglio3

Sub Macro1()
Sheets("Foglio3").Select
Range("A2").Select
End Sub

 

Seconda soluzione

Nel modulo relativo al foglio1 ci riferiamo alla cella da selezionare con la sintassi  completa:

Private Sub CommandButton1_Click()
Sheets("Foglio3").Select
Sheets("Foglio3").Range("A2").Select
End Sub

 

Morale: non bisogna scoraggiarsi di fronte agli ostacoli: molte volte dietro ad un ostacolo possono esserci tanti risvolti.

Meditate gente. Meditate.