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 comandocall. Mas antes de chamar a macro, eu altero o valor daProximaMacropara que, da próxima vez que o botão for clicado, ele atenda ou parte doif` 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 -> ...