Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
Por SandroLima
#40598
Bom dia, pessoal.

Na planilha anexa tenho um macro que através do código informado preenche um formulário em outra Aba.

Tentei fazer mas estou com dificuldades e preciso do tratamento para o erro em duas situações:

!) O usuário cancela a ação fechando o "InputBox" e nesse caso nenhuma ação deveria ser executada (atualmente ele apaga os dados do formulário anterior);

2) E a segunda situação em que deveria informar uma msg de erro quando o código digitado fosse inexistente ou inválido, mantendo o InputBox aberto para nova tentativa.


Sei que é uma tarefa simples para os mestres aqui... mas ainda não passei por esse caminho ("tratamento de erros") no meu aprendizado. E se alguém tiver um material sobre isso aceito de muito bom grado.

Segue planilha anexa.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Jimmy
Avatar
#40600
Olá Sandro,

Você tem o conjunto de linhas abaixo na sua macro, executadas antes de solicitar o código do formulário:
Código: Selecionar todos
   FORM.Range("I10").Value = vbNullString 'COD
    FORM.Range("L10").Value = vbNullString 'Valor
    FORM.Range("F13").Value = vbNullString 'Nome do favorecido/responsável
    FORM.Range("K15").Value = vbNullString 'CPF/CNPJ
    FORM.Range("F17").Value = vbNullString 'Valor por extenso
    FORM.Range("F20").Value = vbNullString 'Descrição do objeto do Tabela
    FORM.Range("K23").Value = vbNullString 'CPF 1
    FORM.Range("D29").Value = vbNullString 'Cidade
    FORM.Range("E29").Value = vbNullString 'Estado
    FORM.Range("F29").Value = vbNullString 'Dia
    FORM.Range("H29").Value = vbNullString 'Mês
    FORM.Range("L29").Value = vbNullString 'Ano
    FORM.Range("E33").Value = vbNullString 'Emitente
    FORM.Range("D35").Value = vbNullString
    FORM.Range("K35").Value = vbNullString 'CPF 2
Pelo que entendi, o operador digita um código do formulário, a macro o procura, e se acha carrega ele nos ranges acima.

Creio que se apagar as linhas acima ficará como deseja: nada é apagadado, e se foi digitado código válido, a própria carga das informações irá apagar o form anterior.

O dúvida que tenho é porque a range FORM.Range("F17").Value = vbNullString 'Valor por extenso
é apagada mas não carregada.

Quanto à segunda solicitação, fiz umas alterações na macro e gostaria que testasse:
Código: Selecionar todos
Sub Preencher()
    
    Dim FORM As Worksheet
    Dim Tabela As ListObject
    Dim Matriz() As Variant, Cod As Variant
    Dim Counter As Long, L As Long
    Dim Erro As Variant
    
    Set FORM = wshFormulario
    Set Tabela = wshBDados.ListObjects("TB_Atendimentos")
    Matriz = Tabela.DataBodyRange.Value
    
    Application.ScreenUpdating = False

    Do
        Cod = InputBox("Informe o código para impressão", "GERAR FORM")
        If Cod = "" Then Exit Do
        On Error GoTo ErroLocaliza
        
        For L = LBound(Matriz, 1) To UBound(Matriz, 1)
            If Matriz(L, 4) = Cod Then
                FORM.Range("I10").Value = Cod
                FORM.Range("L10").Value = Matriz(L, 5)
                FORM.Range("F13").Value = Matriz(L, 14)
                FORM.Range("K15").Value = Matriz(L, 15)
                FORM.Range("F20").Value = Matriz(L, 12)
                FORM.Range("K23").Value = Matriz(L, 9)
                FORM.Range("D29").Value = Matriz(L, 16) & " -"
                FORM.Range("E29").Value = Matriz(L, 17) & ","
                FORM.Range("F29").Value = Matriz(L, 22)
                FORM.Range("H29").Value = Matriz(L, 23)
                FORM.Range("L29").Value = Matriz(L, 24)
                FORM.Range("E33").Value = Matriz(L, 18)
                FORM.Range("D35").Value = Matriz(L, 19)
                FORM.Range("K35").Value = Matriz(L, 20)
                Counter = Counter + 1
                Exit For
            End If
        Next L
        
        If L = UBound(Matriz, 1) + 1 Then
            MsgBox "Código não encontrado:" & vbCrLf & vbCrLf & Cod
        Else
            Erase Matriz
            FORM.Activate
            Exit Do
        End If
    Loop
    Set FORM = Nothing
    Set Tabela = Nothing
        
    If 1 = 2 Then
ErroLocaliza:
        Erro = Err
        MsgBox "Ocorreu o erro " & Erro & ". Verifique!"
        Application.ScreenUpdating = True
    End If

End Sub
Dê retorno.

Jimmy San Juan
Por SandroLima
#40602
Boa tarde, Jimmy e demais usuários/colaboradores do fórum.

Aparentemente seu código funcionou perfeitamente.

Adorei a ideia de informar na "MsgBox" o código informado errado.

A única coisa que não sei se está normal... quando acionamos a macro o Excel entra em execução constante até que se digite algo na "InputBox". É assim mesmo?
Pelo que entendi, o operador digita um código do formulário, a macro o procura, e se acha carrega ele nos ranges acima.

Creio que se apagar as linhas acima ficará como deseja: nada é apagado, e se foi digitado código válido, a própria carga das informações irá apagar o form anterior.
Entendi... tinha isso aqui no código e apenas mantive ... mas realmente faz sentido o que você disse.
O dúvida que tenho é porque a range FORM.Range("F17").Value = vbNullString 'Valor por extenso
é apagada mas não carregada.
Desconsidere essa linha... como pode perceber apaguei outras também apenas para efeito de reduzir o tamanho do código. Colocar "vbNullString " e "" dá na mesma?
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord