Notifications
Clear all

Variável fora de Contexto

10 Posts
3 Usuários
3 Reactions
2,113 Visualizações
Kaleo_rs
(@kaleo_rs)
Posts: 0
Trusted Member
Topic starter
 

Criei um FORMULÁRIO onde inseri os botões de INCLUIR, GRAVAR, CANCELAR e EXCLUIR e toda vez que o mouse passa por um desses botões ele troca de cor e joga em uma variável qual botão esta sendo clicado.

A variável é a primeira coisa a ser declara, porém ela fica fora de contexto dentro de outras SUB

DIM BOTAO_CLICADO as String.

Sub BOTAO_SAIDA_CANCELAR_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   ' ALTERAR A COR DO BOTÃO CANCELAR PARA AMRELO AO PASSAR O MOUSE SOBRE ELE
   BOTAO_SAIDA_CANCELAR.BackColor = &HFFFF&
  BOTAO_CLICADO = "CANCELAR" ' O SISTEMA VAI INTERPRETAR A INTENSÃO DE CANCELAR O(S) LANÇAMENTO(S)
End Sub

Sub UserForm_Initialize()

  BOTAO_CLICADO = ""

End Sub

Sub Teste_Botão

if BOTAO_CLICADO = "CANCELAR" then

.....

End Sub

Ao entrar em outra SUB a variável BOTAO_CLICADO fica fora de contexto, não permitindo fazer nenhuma condição com ela.

Alguma dica como faço para a variável não ficar fora de contexto em todas as SUB do formulário?


Editado pela Moderação. Motivo: Utilize o botão Código (< >) para inserir código VBA ou Fórmulas.

 
Postado : 06/08/2020 6:23 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Bom dia, @kaleo_rs

Se o módulo que vc dimensionou sua Variável for de um Userform ou de Workbook ou de Worksheet, ela só será acessível dentro daquele módulo.

Para mudar seu escopo para ser acessível em todos os lugares, dimensione-a dentro de um módulo comum.

 
Postado : 07/08/2020 11:14 am
Kaleo_rs
(@kaleo_rs)
Posts: 0
Trusted Member
Topic starter
 

@edsonbr

Então, em MÓDULOS no módulo ABERTURA inicie a variável Public BOTAO_CLICADO As String e mesmo assim no formulário ela fica fora de contexto.

 
Postado : 07/08/2020 11:25 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Você pode declarar, em um módulo simples, na área de declarações (antes de qualquer sub), da seguinte forma:

Global Botão_Clicado As String

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 07/08/2020 11:39 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Anexe um modelo para entendermos como está estruturado seu projeto, senão ficaremos só conjecturando o que pode estar acontecendo e esticaremos indefinidamente a solução final.

 
Postado : 07/08/2020 11:47 am
Kaleo_rs
(@kaleo_rs)
Posts: 0
Trusted Member
Topic starter
 

@wagner-morel-vidal-nobre

Bom dia, não funcionou. Estou achando que tem algo  relacionado com a Sub BOTAO_SAIDA_CANCELAR_MouseMove afinal de conta ela tem alguns parâmetros e ao sair dela a variável se anula.  

 
Postado : 07/08/2020 11:53 am
Kaleo_rs
(@kaleo_rs)
Posts: 0
Trusted Member
Topic starter
 

Segue em anexo...

-Clicar no botão SAÍDA para abrir o formulário.

- Ative o debug no Formulário SAIDA crie um pause na Sub BOTAO_SAIDA_CANCELAR_MouseMove

-Clicar no botão INCLUIR.

- Passe o mouse sobre o botão CANCELAR e ao debugar você verá a variável xBotao_ativo vai receber um valor e ao sair da SUB ela ficar fora de contexto.

 
Postado : 07/08/2020 2:34 pm
Kaleo_rs
(@kaleo_rs)
Posts: 0
Trusted Member
Topic starter
 

@edsonbr

Anexei o modelo, espero que seja possível simular o problema.

 
Postado : 08/08/2020 9:12 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

@kaleo_rs,

Bom dia!

Realmente, não sei porque com a variável declarada como Global não funcionou. Testei aqui e vi que não funciona mesmo. Talvez o Edson possa ver e nos dizer porque.

Todavia, se seu desejo é saber, em qualquer outra rotina, qual foi o botão que recebeu o foco quando foi clicado ou quando recebeu o passar do mouse em cima dele, você pode usar a propriedade TAG do Botão em tempo de execução. No exemplo que fiz no seu arquivo (anexo), para testar, você faz o seguinte:

1 - Ao abrir o formulário, clique no botão INCLUIR.

2 - Passe o mouse em cima do botão CANCELAR.

3 - Clique em qualquer lugar do formulário (que não seja um dos controles do mesmo).

4 - Pronto! No evento Click do formulário coloquei um código que verifica a propriedade TAG do botão CANCELAR. Se for igual a 1, uma msgbox informa que o botão recebeu o foco.

Obviamente, isso é apenas um exemplo bem simples que você poderá usar para usar com os demais botões. A propriedade TAG, por exemplo, após clicar no formulário, poderá ser zerada para não ficar sempre com o mesmo valor. Os outros botões, quando receberem o foco ou forem clicados, também poderão ter TAG diferentes e você pode testar cada um deles fazendo, por exemplo, um Select Case entre os botões. E por aí vai... programação tem "n" maneiras de se chegar ao mesmo objetivo por caminhos diferentes.

 

 

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 08/08/2020 12:01 pm
EdsonBR reacted
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Ah, fora de contexto na inspeção de variáveis, é isso? Na verdade, quando o contexto é um Userform, Worksheet, Workbook só aparece o valor da variável enquanto há algum código sendo executado naquele momento dentro daquela classe (Userform, Worksheet, Workbook). Se o Userform estiver só sendo exibido mas parado, sem nada sendo processado, fica mesmo como fora de contexto. Mas mesmo assim a variável mantém seu valor.
Fiz o teste que vc indicou e veja no print anexo que adicionei duas vezes a mesma variável na inspeção, mas uma no contexto do Módulo ABERTURA e outra no contexto do Userform e após ter passado o mouse sobre o botão CANCELAR e já estando o Userform em situação de espera, observe que a variável manteve o valor "CANCELAR" (contexto ABERTURA). Vc tb pode checar isso na Janela Imediata.
Portanto isso a que vc se referiu:

Postado por: @kaleo_rs

Estou achando que tem algo  relacionado com a Sub BOTAO_SAIDA_CANCELAR_MouseMove afinal de conta ela tem alguns parâmetros e ao sair dela a variável se anula

de fato não ocorre.

Portanto, sua variável xBotao_Ativo está corretamente dimensionada e funcionando normalmente. Quanto ao fato de dimensioná-la com a palavra-chave Global, ela é idêntica a Public. Na verdade Global foi substituída por Public já no VB 5.0. e é desencorajado seu uso (assim como outros elementos como o loop While/Wend).

Obs.:

  • para poder fazer esse teste tive que pular o evento UserForm_MouseMove pois como os botões estão dentro do Userform, este acaba sendo dominante e sempre "rouba" o evento MouseMove para si. Talvez devesse reformular esse ponto.
  • Como seu arquivo está com muitos elementos/muito código, teria que analisar muita coisa, o que foge do escopo da atividade aqui do fórum além de desestimular um pouco outros colegas que também gostariam de ajudar. Talvez se vc fizesse um pequeno modelo só com o essencial, focando direto no problema (conceito de exemplo "Mínimo, Completo e Verificável") seria mais assertivo.

 
Postado : 08/08/2020 9:47 pm