none
ajuda com textbox interligadas RRS feed

  • 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 Sub

    Pensei 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


    domingo, 5 de agosto de 2012 16:22

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

    segunda-feira, 3 de setembro de 2012 21:51
    Moderador

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

    segunda-feira, 6 de agosto de 2012 18:59
  • 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

    domingo, 2 de setembro de 2012 16:18
  • 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

    segunda-feira, 3 de setembro de 2012 21:51
    Moderador