Usuário com melhor resposta
ajuda com textbox interligadas

Pergunta
-
Bom dia Pessoal....
Estou com um problema em um form no vba do excel. É um form simples, possui 1 combobox(que ja populei) que puxa os dados e referencias da planilha, um texbox que indica um valor de unidade(sem associação nenhuma) e dois textboxes que são interligados.
Era para funcionar assim o textbox2 é o volume, o textbox3 é a massa. O usuário pode escolher se deseja entrar com o valor da massa ou do volume. E se ja tiver digitado algum valor no outro textbox, este seria ignorado(apagado)
Minha idéia era que ao ir digitando o volume no textbox2, o textbox3(massa) apagaria o valor inserido no textbox3 e calcularia a massa automaticamente pela formula "volume*dens=massa" inserindo esse valor no texbox3 e vice versa se o usuario digitasse a massa no textbox 3.
tentei pelo evento keypress dos textbox porém o valor sempre atrasa em um digito, Ex.: se densidade =1 volume é igula a massa, quando digito 1 no texbox2 não aparece nada no textbox3 porém ao digitar "2", o digito seguinte, aparece apenas o primeiro digito no textbox 3
valorr no textbox2: "12" valor que aparece no textbox3: "1".
Consegui resolver isso em partes utilizando o evento change, porém quando altera o valor do textbox2 ele altera o valor do textbox3 na hora e como é para um depender do outro ignorando o valor digitado no outro campo (massa ou volume) criou um loop, pois sempre que textbox3 é modificado pelo evento change do textbox2 ele altera seu valor e dispara o change do textbox3 que por sua vez zera e modifica o valor do textbox2 e assim por diante....
Tentei Utilizar o metodo gotfocus mas não consegui nem fazer um simples comando de msgbox aparecer:
Private Sub textbox2_GotFocus()
MsgBox "Focus funcionou!!"
End SubPensei em fazer algu do tipo: Se o foco estiver no textbox2 ele apenas auto preenche o textbox3 e se o foco estiver em textbox3 ele apenas preenche o textbox2. utilando o evento change mesmo chamando uma sub que testaria o foco ou o index por um IF e faria a modoficação apenas no textbox desejado, sem loops então, mas eu precisaria saber para isso qual o textbox que esta recebendo os dados... eis minha dificuldade
Gostaria de alguma ideia de voces pois estou bem perdido neste ponto.
Desde já agradeço,
Abraços
- Editado Ilário Júnior domingo, 5 de agosto de 2012 16:39
Respostas
-
Use uma variável boleana declarada no nível de módulo para armazenar a o estado de evento de alteração de um TextBox associado à um teste condicional:
Dim bEvento As Boolean Private Sub TextBox2_Change() If bEvento Then Exit Sub bEvento = True TextBox3 = "" bEvento = False End Sub Private Sub TextBox3_Change() If bEvento Then Exit Sub bEvento = True TextBox2 = "" bEvento = False End Sub Private Sub UserForm_Initialize() bEvento = False End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Sugerido como Resposta Hezequias VasconcelosModerator terça-feira, 11 de setembro de 2012 15:22
- Marcado como Resposta Hezequias VasconcelosModerator quarta-feira, 12 de setembro de 2012 10:59
Todas as Respostas
-
Boas Júnior
Experimente o seguinte:
Option Explicit
Dim Caixa_de_Texto As Byte
______________________________________________________________________________________
No evento Click da TextBox2 coloque:
Caixa_de_Texto = 2 'Atribui um valor de seleção
Caixa2_ou_3 'Chama o Procedimento de seleção
__________________________________________________________________________________
No evento Click da TextBox3 coloque:
Caixa_de_Texto = 3 'Atribui um valor de seleção
Caixa2_ou_3 'Chama o Procedimento de seleção
__________________________________________________________________________________
'Crie o seguinte procedimento:
Sub Caixa2_ou_3 ()
Select Case Caixa_de_Texto
Case Caixa_de_Texto = 2, Caixa_de_Texto = 3
' Se clicar na TexBox2
Case is = 2
TextBox3 = "" 'Limpa a TextBox 3
: :
: :
Inclua seu Procedimento
: :
'Se clicar na TextBox3
Case is = 3
TextBox2 = "" 'Limpa a TextBox2
: :
: :
'Inclua seu procedimento
: :
End Select
End Sub
Eu não testei para ver se funciona, mas a princípio a "mecânica" parece ser esta.
Espero que te ajude
Edison
- Sugerido como Resposta Hezequias VasconcelosModerator terça-feira, 11 de setembro de 2012 15:22
-
Pessoal desculpem a demora... Meu PC estava em manutenção... precisei de verbas... por isso a demora... Mas vamos lá..
Edison, meus textbox tem que ser um integer e outro double(são os formatos que preciso). Quando tu se referiu a introduzir o procedimento click, eu preciso que funcione ao digitar e não ao clicar, testei sua idéia e não obtive o resultado que preciso.
Estou tentando trabalhar com os eventos enter e exit para os textbox... estou quase lá... se conseguir posto os resultados aqui, mas estou aberto a ajuda dos amigos.
Mesmo não sendo o que presisava agradeço a ajuda do Edison... Sempre aproveitamos alguma coisa das idéias aqui postadas...
Abraços e até mais
-
Use uma variável boleana declarada no nível de módulo para armazenar a o estado de evento de alteração de um TextBox associado à um teste condicional:
Dim bEvento As Boolean Private Sub TextBox2_Change() If bEvento Then Exit Sub bEvento = True TextBox3 = "" bEvento = False End Sub Private Sub TextBox3_Change() If bEvento Then Exit Sub bEvento = True TextBox2 = "" bEvento = False End Sub Private Sub UserForm_Initialize() bEvento = False End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Sugerido como Resposta Hezequias VasconcelosModerator terça-feira, 11 de setembro de 2012 15:22
- Marcado como Resposta Hezequias VasconcelosModerator quarta-feira, 12 de setembro de 2012 10:59