MaximoAccess

Caro Usuário, não tire as suas duvidas nas Salas de Repositório, abra sempre um novo tópico relacionado, nas salas destinadas para o efeito, como Sala de Tabelas, Consultas, Formulários, Relatórios, Macros, Módulos e VBA.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    On Error GoTo Não funciona em um loop

    Compartilhe

    leicand
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 44
    Registrado : 04/01/2016

    On Error GoTo Não funciona em um loop

    Mensagem  leicand em Qui 25 Ago 2016, 14:52

    Bom dia,

    Não sei se essa dúvida já foi respondida aqui no Forum, eu não achei na busca.

    Tenho um loop que passa por todos os controles de um Form com uma expressão OnError. Na primeira passagem do loop ele funciona, mas a partir da segunda a expressão OnError deixa de funcionar!

    Pesquisei e vi que isso é uma questão geral do VBA...

    Será que alguém poderia me ajudar?

    Caso ajuda segue o código:

    For Each Ctl In Me.Controls 'Faz um loop por cada controle do Form
    'Caso o controle seja um Textbox e não se chame FAMILIA_OCULTO então
    If Ctl.ControlType = acTextBox And Ctl.Name <> "FAMILIA_OCULTO" Then
    On Error GoTo Prox
    Ctl.SetFocus 'Coloca o foco no controle
    Busca.Atrib = Ctl.Name 'Atribui o nome do controle à variável Atributo na classe BuscaProduto
    If Ctl.TEXT <> "" And Not IsNull(Ctl.TEXT) Then 'E não esteja vazio nem seja nulo
    Busca.TxtBoxBusca (Ctl.TEXT) 'Chama a Função txtbusca dentro da classe BuscaProduto passando o parâmetro do texto digitado no controle
    End If
    GoTo Prox2
    Prox:
    Busca.Atrib = Ctl.Name 'Atribui o nome do controle à variável Atributo na classe BuscaProduto
    If Ctl.Value <> "" And Not IsNull(Ctl.Value) Then 'E não esteja vazio nem seja nulo
    Busca.TxtBoxBusca (Ctl.Value) 'Chama a Função txtbusca dentro da classe BuscaProduto passando o parâmetro do texto digitado no controle
    End If
    Prox2:
    End If
    'Caso o controle seja tipo combobox:
    If Ctl.ControlType = acComboBox Then
    If Ctl.Value <> "" And Not IsNull(Ctl.Value) Then 'E não esteja vazio nem seja nulo
    Busca.Combo (Ctl.Value) 'Chama a Função Combo dentro da classe BuscaProduto passando o parâmetro do valor índice da combobox
    End If
    End If
    Next Ctl 'Vai para o próximo controle

    Muito obrigado!

    Cesar Quintanilha
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 12
    Registrado : 22/08/2016

    Ajuda

    Mensagem  Cesar Quintanilha em Qui 25 Ago 2016, 22:24


    leicand, boa noite

    Cara olhei o seu código e achei ele um pouco confuso, tomei a liberdade de reescrever algo parecido, eu pensei em uma forma de reescrever a função que faz a busca por txt o código dela esta no final.

    Espero que isso ajude, se não servir posta aí o problema que eu te ajudo com uma solução.

    For Each ctl In Me.Controls 'Faz um loop por cada controle do Form

    'Caso o controle seja um Textbox e não se chame FAMILIA_OCULTO então

    If ctl.ControlType = acTextBox And ctl.Name <> "FAMILIA_OCULTO" Then

    ctl.SetFocus 'Coloca o foco no controle

    If TxtBoxBusca(ctl.Text) = False Then 'Chama a Função txtbusca dentro da classe BuscaProduto passando & _
    o parâmetro do texto digitado no controle


    'CASO NÃO ENCONTRE BUSCA PELO VALOR DO CAMPO

    If ctl.Value <> "" And Not IsNull(ctl.Value) Then 'E não esteja vazio nem seja nulo

    'FAZ BUSCA POR VALOR

    If Busca.TxtBoxBusca(ctl.Value) = False Then 'Chama a Função txtbusca dentro da classe BuscaProduto passando o & _
    parâmetro do texto digitado no controle

    'CASO NÃO ENCONTRE FAZ UMA OPERAÇÃO

    Else

    'CASO ENCONTRE FAZ OUTRA OPERAÇÃO

    End If
    End If
    Else

    'CASO ENCONTRE FAZ OUTRA OPERAÇÃO

    End If

    End If
    Next ctl 'Vai para o próximo controle

    '********************************************
    Função de busca
    '********************************************

    Function TxtBoxBusca(txt As String) As Boolean

    On Error GoTo TrataError

    'FAZ OPERAÇÃO DE BUSCA

    TxtBoxBusca = True

    Exit Function

    TrataError:

    TxtBoxBusca = False

    End Function

    vlw!

    leicand
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 44
    Registrado : 04/01/2016

    Re: On Error GoTo Não funciona em um loop

    Mensagem  leicand em Sex 26 Ago 2016, 12:23

    Bom dia Cesar,

    Obrigado pela sugestão. Infelizmente não consegui resolver assim porque o erro ocorre no setfocus, não na busca.

    Vou tentar explicar melhor:

    É um form de busca de produtos por atributos. Cada grupo de produtos tem atributos diferentes, então cada vez que o form é aberto um loop é feito em um recordset e cria um controle para cada atributo que o produto tem (Diâmetro, Altura, Dureza, Chapa etc.). Caso ele seja um campo aberto é criado um txtbox. Caso seja um campo com opções fechadas cria um combobox e atribui uma query como recordsource.

    Quando cada um desses controles é alterado com um valor ocorre esse loop que eu postei anteriormente. É um loop que lê o valor em todos os controles preenchidos e chama uma função em uma classe que monta uma pesquisa no sql fazendo uma join entre os valores das txtbox e os índices dos combobox.

    Até aí nenhum problema. Mas quando o usuário vai lá e digita um valor na combobox o cursor fica "preso" dentro da combobox e quando ele executa o loop o set focus não funciona para os txtbox. Por isso coloquei aquela exceção on error. Só que no loop o on error só funciona na primeira passagem.

    Será que consegui me explicar melhor?

    Cesar Quintanilha
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 12
    Registrado : 22/08/2016

    Ajuda

    Mensagem  Cesar Quintanilha em Sex 26 Ago 2016, 18:06

    Cara, boa tarde.

    Quando um controle esta atrelado a uma consulta ou uma tabela e sofre uma alteração pelo usuário ele precisa ser atualizado, a função utilizada para isso é "controle.requery", no evento pós atualização do controle "controle_afterUpdate", nesse caso parece que isso precisa ser feito no form.

    Se puder posta o código das duas funções, parece que os controles precisam ser atualizados após sofrerem modificações.



    vlw!

      Data/hora atual: Dom 11 Dez 2016, 00:12