Oi, Priscila. Vou explicar usando o if
porque talvez seja mais didático. E no lugar do MinhaGlobal
do tipo inteiro, vou usar uma variável global denominada ProximaMacro
onde ela vai guardar uma string (texto) que indicará qual macro será executada. O nome da função que executa o clique agora é SelecionaMacro_click
.
Você só precisa de uma variável global de controle para guardar a indicação de qual macro será executada, seja indicando qual macro foi executada, seja indicando qual será a próxima macro que será executada. Não importa! No meu caso, isto é, no meu código, usei a global para representar qual a próxima a ser executada.
Public ProximaMacro As String
ProximaMacro = "Macro1"
Private Sub SelecionaMacro_Click()
If ProximaMacro = "Macro1" Then
ProximaMacro = "Macro2"
Call macro1
ElseIf ProximaMacro = "Macro2" Then
ProximaMacro = "Macro3"
Call macro2
ElseIf ProximaMacro = "Macro3" Then
ProximaMacro = "Macro1"
Call macro3
End If
End Sub
Observe que `ProximaMacro" só terá os seguintes valores possíveis:
O valor que esta variável representa, indicará onde no ìfa condição será atendida e, como consequência, qual macro será executada. A execução da macro propriamente dita se dá com o comando
call. Mas antes de chamar a macro, eu altero o valor da
ProximaMacropara que, da próxima vez que o botão for clicado, ele atenda ou parte do
if` e, assim, executará outra macro e não a anterior.
Então observe o passo a passo de execução:
- Inicialmente, o vba lê a declaração da global
ProximaMacro
e atribui o valor Macro1
para ela; - Quando o usuário clica no botão, a função
SelecionaMacro_clck()
será executada pela primeira vez; - Dentro desta função há um
if
que verifica qual o valor da global ProximaMacro
. ProximaMacro
é igual a Macro1
? Sim! (veja o passo 1). Então ele executa o que está dentro desta parte do if
; - Nesta parte do
if
, ele modifica o valor da global ProximaMacro
para Macro2
; - Em seguida, executa a sua
macro1
(eu não coloquei no código porque não sei quais são suas três macros que quer executar de forma alternada); - Não tendo mais o que fazer no
if
, nem na função, encerra-se o algoritmo.
Agora imagine se o usuário clicar novamente no botão. O que acontecerá?
- Ele não vai executar novamente a declaração da
ProximaMacro
e atribuir o valor Macro1
para ela. Isto só é feito no início da execução da macro e somente uma vez! A variável global ProximaMacro
já é reconhecida pelo vba e, inclusive, agora ela já está com o novo valor Macro2
que foi modificado no primeiro clique do botão. - Ao entrar no
if
, verificará se o valor de ProximaMacro
é igual a Macro1
(Macro2
= Macro1
, retorna FALSE
). É igual? NÃO!, pois ProximaMacro
é igual a Macro2
; - Então, ainda na parte do
if
, ele vai testar o primeiro ElseIf
e testar ProximaMacro = "Macro2
. São iguais? SIM! Então ele modifica o valor de ProximaMacro
para Macro3
e executará o call macro2
que executa a sua segunda macro; - Ele sai do
if
e depois da função do clique do botão;
Se, mais uma vez, o usuário clicar no botão, quem será executado será a macro3
. Mas antes disso, ele atribui valor Macro1
para ProximaMacro
indicando que se o usuário clicar novamente, ele vai executar a macro1
.
Então, há sempre esta ordem de execução:
macro1 -> macro2 -> macro3 -> macro1 -> macro2 -> macro3 -> macro1 -> ...