Notifications
Clear all

Erro na busca com método Find

5 Posts
3 Usuários
0 Reactions
1,087 Visualizações
(@creuza)
Posts: 15
Active Member
Topic starter
 

Prezados Boa noite

Dentro do meu projeto tenho um formulário onde o usuário pode cadastrar o padrão de horário de serviço que podem ser de três tipos
folga na semana
folga no sábado
folga no domingo

Sempre informando quantos dias trabalha para estar de folga em cada um destes tipos. Na planilha cada registro ganha um código, e o formulário recebe as informações para cadastrar, alterar e excluir da planiha , cada rotina em seu respectivo botão. Antes de cadastrar, criei a rotina para verificar se o código já existe assim que o codigo é digitado no txtbox.

Aqui começa o meu problema. Se o código pesquisado já está cadastrado, ele encontra e popula o formulário normalmente (ótimo). Se não existe ele dá Erro em tempo de execução "91" a variável do objeto ou a variável do bloco whith não foi encontrada. Quando deveria perguntar se quer cadastrar.

Quando mando depurar a linha que fica em amarelo é

linha = Sheets("Horarios").Range("A2:A" & UltLin).Find(what:=codigo).Row

E não sei mais onde mexer para funcionar
Segue abaixo o código

Private Sub txtCod_AfterUpdate()
 Application.ScreenUpdating = False

'Código sai da macro caso seja atualizado campo vazio

    If Me.txtCod = "" Then
        MsgBox "Por favor indique um código", vbCritical, Atenção
    Exit Sub
    End If
    
btnCadastrar.Enabled = True
btnAlterar.Enabled = True
btnExcluir.Enabled = True
btnSair.Enabled = True
  
Dim Plan As Worksheet
Dim linha As Long
Dim codigo As Integer
Dim Tipo_folga As Object
Dim UltLin As Long

Sheets("Horarios").Select
codigo = txtCod
UltLin = Sheets("Horarios").Cells(Rows.Count, "A").End(xlUp).Row

'localiza um registro sem o Loop pelo método Find
  
  linha = Sheets("Horarios").Range("A2:A" & UltLin).Find(what:=codigo).Row
      
  On Error GoTo nao_encontrado
  
     txtSabNome = Sheets("Horarios").Cells(linha, 2)
     txtDomNome = Sheets("Horarios").Cells(linha, 3)
     txtMST = Sheets("Horarios").Cells(linha, 4)
     txtMSF = Sheets("Horarios").Cells(linha, 6)
     txtSIT = Sheets("Horarios").Cells(linha, 7)
     txtSIF = Sheets("Horarios").Cells(linha, 9)
     txtDt = Sheets("Horarios").Cells(linha, 10)
     txtDF = Sheets("Horarios").Cells(linha, 12)
       
    Exit Sub

nao_encontrado:

Dim respostas As String 'Cria a variável respostas

respostas = MsgBox("Código não encontrado, Deseja cadastrar?", vbYesNo)

    If respostas = vbYes Then 'Se a resposta for sim então
        txtCod = txtCod.Value
        txtDomNome = ""
        txtSabNome = ""
        txtMST = ""
        txtMSF = ""
        txtSIT = ""
        txtSIF = ""
        txtDt = ""
        txtDF = ""
    End If
    
    If respostas = vbNo Then
       
        txtDomNome = ""
        txtSabNome = ""
        txtMST = ""
        txtMSF = ""
        txtSIT = ""
        txtSIF = ""
        txtDt = ""
        txtDF = ""
         
          txtCod.SetFocus
    End If
  
 Application.ScreenUpdating = True

End Sub

vocês conseguem me dizer aonde está o erro?

A parte problemática do projeto está em anexo.
Desde já agradeço pela atenção e imensa ajuda.

Creuza Moura

 
Postado : 07/06/2018 5:45 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Creuza,

Boa noite!

Bom... particularmente, eu não gosto muito de usar esse tipo de código que faz buscas com find. Aliás nem sei como usar corretamente ele. Fiz algumas alterações para busca pelo método tradicional (o bom e velho laço For/Next).

Veja se assim lhe atende.

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/06/2018 7:38 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Creuza, boa noite!

vocês conseguem me dizer aonde está o erro?

Não baixei seu arquivo, mas analisando superficialmente o principal erro é que a armadilha de erros (On Error GoTo nao_encontrado) deve estar antes do local onde o erro possa ocorrer, não após.

Por outro lado, tenha em mente que o método Find retorna o range em que o valor foi localizado e caso não encontre, retorna o valor especial Nothing. Sabendo disso, ao invés dessa rotina de erros melhor seria algo como:

  Dim rg As Range
  Set rg = Sheets("Horarios").Range("A2:A" & UltLin).Find(what:=codigo)
  If rg Is Nothing Then
    '.......
    'Trecho a ser executado caso não tenha encontrado "codigo"
    '.......
  Else
    linha = rg.Row
    '.......
    'Trecho a executar quando achou "codigo"
    '.......
  End If

 
Postado : 07/06/2018 8:04 pm
(@creuza)
Posts: 15
Active Member
Topic starter
 

Wagner

Muito Obrigada! com sua ajuda funciona certinho!

Eu tenho muita dificuldade com laços e fujo deles o máximo que posso. (kkkkk)

obrigada mais uma vez.

 
Postado : 07/06/2018 9:08 pm
(@creuza)
Posts: 15
Active Member
Topic starter
 

EdsonBR

Rapaz eu coloquei esse On Error GoTo nao_encontrado antes, mas não funcionou também.

Interessante que se ao colocar o mouse em cima da palavra linha ele respondesse o Nothing eu talvez tivesse a ideia do if, mas em vez disso aparece linha=0 :(

A sugestão do Wagner funcionou certinho vou aplicar e vou guardar a sua com muito carinho para os próximos desafios

Muito obrigada apela pronta ajuda.

 
Postado : 07/06/2018 9:12 pm