macro
Faça uma pergunta
FRBR
Para chamar uma macro a partir de outra, vamos ter que distinguir vários casos. A
chamada de um Sub ou de uma função não é feita exatamente da mesma maneira. Além
disso, vamos ter que estudar, separadamente, a chamada de um procedimento de evento
e a chamada de um procedimento contida em outra pasta de trabalho.
Sem configurações
Quando os dois Sub estão no mesmo módulo e não têm parâmetros. A Macro2 chama
a Macro1:
Sub Macro1()
MsgBox "Hello world!"
End Sub
Sub Macro2()
Call Macro1
End Sub
Sub Macro1()
MsgBox "Hello world!"
End Sub
Sub Macro2()
Macro1
End Sub
No entanto, eu não recomendo. Na verdade, esta instrução Call torna o código muito mais
legível. Ao lê-lo, o programador vê, imediatamente, que se trata da chamada de um
procedimento.
Quando os dois Sub estão em módulos diferentes e não têm parâmetros. Não é preciso
especificar o módulo. O exemplo anterior funcionará da mesma forma, porém você deverá
pensar na sua manutenção, desde a criação do seu código. O fato de especificar em que
módulo fica o procedimento chamado, fará com que você não perca tempo com pesquisas
inúteis durante os possíveis desbloqueios. Então, se a Macro1 estiver no Módulo1 e a
Macro2 no Módulo 2:
Sub Macro1()
MsgBox "Hello world!"
End Sub
Sub Macro2()
Call Module1.Macro1
End Sub
Com configurações
O método é o mesmo. Basta adicionar as configurações entre parênteses. No entanto,
cuidado ao digitar essas configurações, para evitar a geração de erro (do tipo 13). Se a
sua função espera um parâmetro digitado em string, não envie uma Dupla dobro:
Sub Macro2()
Call Macro1(18254, 654897)
End Sub
Sub Macro2()
Macro1 18254321, 654897
End Sub
Sub Macro2()
Call Module1.Macro1(918254321, 654897)
End Sub
Exemplo de Function:
Aqui vemos que a nossa Function é declarada como As Double (esta declaração de tipo é
opcional). O valor que ela retorna será do tipo duplo (Double). Como uma função retorna
um valor, você deverá, no Sub que chama, prever o armazenamento desse valor. Isso
pode se dar tanto em uma célula do Excel, como em uma variável (pensar em declarar a
variável no tipo certo), em um controle, etc.
Sub Macro2()
Dim Soma As Double
Soma = Addition(1234.56, 654.32)
MsgBox Soma
End Sub
Sub Macro2()
Dim Soma As Double
Soma = Addition(1234.56, 654.32)
MsgBox Soma
End Sub
Sub Macro2()
Dim Soma As Double
Soma = Addition(1234.56, 654.32)
MsgBox Soma
End Sub
Exemplo:
Gostaríamos que, quando houver uma alteração do valor da célula A1, apareça em
B1, "Nada mal!", se A1 for superior a 10. Para isso, vá no código do Módulo da planilha
em questão e clique direito na guia da planilha > Ver o Código.
Observação: você me dirá: "basta alterar o valor da A1 a partir da nossa macro, e isso
funcionará. Sim, você tem razão. Mas isso é apenas um exemplo.
Sub MaMacro()
Dim minhaLinha As Range
Set minhaLinha = Sheets("Planilha1").Range("A1")
Call Worksheet_Change(minhaLinha)
End Sub
Sub MinhaMacro()
Dim minhaLinha As Range
Set minhaLinha = Sheets("Planilha1").Range("A1")
CallByName Worksheets("Planilha1"), "Worksheet_Change", VbMethod, minhaLinha
End Sub
Outro exemplo:
Ao clicar em um botão do formulário de usuário (UserForm2), eu quero acionar o
evento ComboBox1_Change de uma lista suspensa situada num UserForm1: