Notifications
Clear all

FIND ERRO QUANDO NÃO LOCALIZA

8 Posts
4 Usuários
0 Reactions
1,992 Visualizações
(@roger-bbd)
Posts: 5
Active Member
Topic starter
 

Olá ! Sou leigo em programação e estou engatinhando em VBA por conta própria fazem alguns dias
Criei um código para a partir de uma lista de caracteres especiais relacionados na coluna A na sheet "Base Caracteres", encontrá-los e marcá-los na sheet "Base Validação".
Apesar de possivelmente o código não ser o mais enxuto ou mais adequado, ele funciona corretamente até que não encontre um dos caracteres pesquisados, dando o erro run-time 91.
Já tentei usar a função On Error GoTo, que deu certo no primeiro Loop, porém a partir do segundo caracter não encontrado, não funciona mais.
Tentei a função If Not "Variável" is Nothing Then, porém não consegui fazer funcionar.
Gostaria muito da valiosa ajuda de vocês para fazer com que o código escrito funcione, e dessa forma poderei entendê-lo e posteriormente aprimorá-lo.
Segue o código:-

Sub Macro1() 
'Declara Variáveis
    Dim W1 As Worksheet
    Dim W2 As Worksheet
    Dim P As Long
    Dim S As String
    Dim V As String
    Dim L As String
           
'Inicializa variáveis
    Set W1 = Sheets("Base Validação")
    Set W2 = Sheets("Base Caracteres")
    L = 1
    V = W2.Range("A" & L).Value
    
'Inicia rotina de Loop que buscará o valor (S) a ser procurado
    Do While V <> ""
        S = W2.Range("A" & L).Value
        W1.Select
        Range("A2").Select
        
'Inicia a busca do valor adicionado à variável S em toda a Sheet "Base Validação"
        Cells.Find(What:=S, After:=ActiveCell, LookIn:=xlValues, LookAt _
             :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
             False, SearchFormat:=False).Activate 
'Muda a cor da célula onde o valor foi encontrado
        With ActiveCell.Font
            .Color = 255
            .Bold = True
        End With
        
'Muda a cor da linha onde o valor foi encontrado
        With ActiveCell.EntireRow.Interior
            .PatternColorIndex = xlAutomatic
            .Color = 65535
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
        
'Inicia a variável "P" com o valor da célula ativa (será usada como marcação)
        P = ActiveCell.Row
        
'Inicia o Loop da rotina Find Next
        Do
            Cells.FindNext(After:=ActiveCell).Activate
            
'Muda a cor da célula onde o valor foi encontrado
            With ActiveCell.Font
                .Color = 255
                .Bold = True
            End With
            
'Muda a cor da linha onde o valor foi encontrado
            With ActiveCell.EntireRow.Interior
                 .PatternColorIndex = xlAutomatic
                 .Color = 65535
                 .TintAndShade = 0
                 .PatternTintAndShade = 0
             End With
'Realiza o Loop de forma a continuar procurando "S" em todas as células enquanto a célula ativa for maior que P
        Loop While ActiveCell.Row > P
    
'Atualiza a variável L em 1 para avançar para a próxima linha da sheet "Base Caracter" e carregar o novo valor de "S"
        
    L = L + 1
        
    Loop
    
End Sub
 
Postado : 10/02/2018 7:27 pm
(@klarc28)
Posts: 971
Prominent Member
(@klarc28)
Posts: 971
Prominent Member
 
Sub Macro1() 
'Declara Variáveis
    Dim W1 As Worksheet
    Dim W2 As Worksheet
    Dim P As Long
    Dim S As String
    Dim V As String
    Dim L As String
           
'Inicializa variáveis
    Set W1 = Sheets("Base Validação")
    Set W2 = Sheets("Base Caracteres")
    L = 1
    V = W2.Range("A" & L).Value
    on error goto meio
'Inicia rotina de Loop que buscará o valor (S) a ser procurado
    Do While V <> ""
        S = W2.Range("A" & L).Value
        W1.Select
        Range("A2").Select
        
'Inicia a busca do valor adicionado à variável S em toda a Sheet "Base Validação"
        Cells.Find(What:=S, After:=ActiveCell, LookIn:=xlValues, LookAt _
             :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
             False, SearchFormat:=False).Activate 
'Muda a cor da célula onde o valor foi encontrado
        With ActiveCell.Font
            .Color = 255
            .Bold = True
        End With
        
'Muda a cor da linha onde o valor foi encontrado
        With ActiveCell.EntireRow.Interior
            .PatternColorIndex = xlAutomatic
            .Color = 65535
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
        
'Inicia a variável "P" com o valor da célula ativa (será usada como marcação)
        P = ActiveCell.Row
    meio:    
on error goto fim
'Inicia o Loop da rotina Find Next
        Do
            Cells.FindNext(After:=ActiveCell).Activate
            
'Muda a cor da célula onde o valor foi encontrado
            With ActiveCell.Font
                .Color = 255
                .Bold = True
            End With
            
'Muda a cor da linha onde o valor foi encontrado
            With ActiveCell.EntireRow.Interior
                 .PatternColorIndex = xlAutomatic
                 .Color = 65535
                 .TintAndShade = 0
                 .PatternTintAndShade = 0
             End With
'Realiza o Loop de forma a continuar procurando "S" em todas as células enquanto a célula ativa for maior que P
        Loop While ActiveCell.Row > P
    
'Atualiza a variável L em 1 para avançar para a próxima linha da sheet "Base Caracter" e carregar o novo valor de "S"
        
    L = L + 1
        
    Loop
    fim:
End Sub
 
Postado : 10/02/2018 7:59 pm
(@roger-bbd)
Posts: 5
Active Member
Topic starter
 

Boa Noite klarc28 !
Agradeço sua resposta, mas utilizando o On Error Resume Next, apesar de resolver a questão do Erro, ele passa para a próxima instrução que é iniciar a formatação das linhas e células, o que ocorre indevidamente na última linha ativa.
Já tinha tentado com o On Error GoTo , tentando desviar a execução para a intrução L = L+1, após o erro, o que faria com que a variável contadora L fosse acrescida de 1 e retornando ao Loop, passasse para a próxima pesquisa.
Deu certo, porém essa instrução só funciona para 1 loop. a partir do segundo ele volta a dar o erro.
Preciso de algo que faça esse processo. Se tiver uma solução ficaria muito grato.
De qualquer forma, muito obrigado pela resposta.

 
Postado : 10/02/2018 8:21 pm
(@klarc28)
Posts: 971
Prominent Member
 
Sub Macro1() 
ON ERROR RESUME NEXT
'Declara Variáveis
    Dim W1 As Worksheet
    Dim W2 As Worksheet
    Dim P As Long
    Dim S As String
    Dim V As String
    Dim L As String
           
'Inicializa variáveis
    Set W1 = Sheets("Base Validação")
    Set W2 = Sheets("Base Caracteres")
    L = 1
    V = W2.Range("A" & L).Value
    
'Inicia rotina de Loop que buscará o valor (S) a ser procurado
    Do While V <> ""
        S = W2.Range("A" & L).Value
        W1.Select
        Range("A2").Select
        
'Inicia a busca do valor adicionado à variável S em toda a Sheet "Base Validação"
       if not iserror( Cells.Find(What:=S, After:=ActiveCell, LookIn:=xlValues, LookAt _
             :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
             False, SearchFormat:=False) then
Cells.Find(What:=S, After:=ActiveCell, LookIn:=xlValues, LookAt _
             :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
             False, SearchFormat:=False).Activate 
'Muda a cor da célula onde o valor foi encontrado
        With ActiveCell.Font
            .Color = 255
            .Bold = True
        End With
        
'Muda a cor da linha onde o valor foi encontrado
        With ActiveCell.EntireRow.Interior
            .PatternColorIndex = xlAutomatic
            .Color = 65535
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
        end if
'Inicia a variável "P" com o valor da célula ativa (será usada como marcação)
        P = ActiveCell.Row
        
'Inicia o Loop da rotina Find Next
        Do
           if not iserror( Cells.FindNext(After:=ActiveCell)) then
            Cells.FindNext(After:=ActiveCell).Activate
'Muda a cor da célula onde o valor foi encontrado
            With ActiveCell.Font
                .Color = 255
                .Bold = True
            End With
            
'Muda a cor da linha onde o valor foi encontrado
            With ActiveCell.EntireRow.Interior
                 .PatternColorIndex = xlAutomatic
                 .Color = 65535
                 .TintAndShade = 0
                 .PatternTintAndShade = 0
             End With
end if
'Realiza o Loop de forma a continuar procurando "S" em todas as células enquanto a célula ativa for maior que P
        Loop While ActiveCell.Row > P
    
'Atualiza a variável L em 1 para avançar para a próxima linha da sheet "Base Caracter" e carregar o novo valor de "S"
        
    L = L + 1
        
    Loop
    
End Sub
 
Postado : 10/02/2018 8:35 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Uma possibilidade>

Sub Macro1()
'Declara Variáveis
Dim Localizado, EndPrimeiroItem    
Dim W1 As Worksheet
Dim W2 As Worksheet
Dim S As String
Dim V As String
Dim L As String
           
'Inicializa variáveis
    Set W1 = Sheets("Base Validação")
    Set W2 = Sheets("Base Caracteres")
    L = 1
    V = W2.Range("A" & L).Value
    
'Inicia rotina de Loop que buscará o valor (S) a ser procurado
    Do While V <> ""
        S = W2.Range("A" & L).Value
        W1.Select
        Range("A2").Select

' Carrega a variavel de Objeto Localizado
'Para localizar um texto exato na celula, mudar a propriedade para xlWhole
' Sempre que a variavel nao for numero ou texto, e ter que carregar algum objeto tem que usar o SET
Set Localizado = Cells.Find(S, LookIn:=xlValues, LookAt:=xlPart)
        
If Not Localizado Is Nothing Then
    EndPrimeiroItem = Localizado.Address  'guarda o endereço da célula do 1º.valor localizado

    Do
        'Muda a cor da célula onde o valor foi encontrado
        With ActiveCell.Font
            .Color = 255
            .Bold = True
        End With
        
        'Muda a cor da linha onde o valor foi encontrado
        With ActiveCell.EntireRow.Interior
            .PatternColorIndex = xlAutomatic
            .Color = 65535
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
        
        Localizado.Offset(1, 0).Select
        Set Localizado = Cells.FindNext(Localizado)  'Segue a procura
        Loop While Not Localizado Is Nothing And Localizado.Address <> EndPrimeiroItem
       
End If
'Atualiza a variável L em 1 para avançar para a próxima linha da sheet "Base Caracter" e carregar o novo valor de "S"
L = L + 1
        
Loop
    
End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 11/02/2018 6:43 am
(@klarc28)
Posts: 971
Prominent Member
 

.....

 
Postado : 11/02/2018 7:04 am
(@osvaldomp)
Posts: 857
Prominent Member
 

Alternativa:

Sub Macro1V2()
 Dim rng As Range
  With Sheets("Base Validação")
   For Each rng In .UsedRange
    If Application.CountIf(Sheets("Base Caracteres").[A:A], rng.Value) > 0 Then
     With rng.Font
      .Color = 255
      .Bold = True
     End With
     With .Cells(rng.Row, 1).Resize(, 10).Interior
      .PatternColorIndex = xlAutomatic
      .Color = 65535
      .TintAndShade = 0
      .PatternTintAndShade = 0
     End With
    End If
   Next rng
  End With
End Sub

Osvaldo

 
Postado : 11/02/2018 7:33 am