none
Loop For não funciona adequadamente (Tratativa de Erros) RRS feed

  • Pergunta

  • Olá, bom dia!

    Hoje estive tentando rodar minha macro mesmo que erros fossem encontrados no caminho. No entanto, On Error Resume Next não funciona, já que ele apenas permite que a macro continue rodando e, assim, a variável TaskIndex assume o valor da interação passada do loop for e cola na outra planilha o mesmo valor (mesmo quando erros são encontrados).
    O que está causando o erro é a função Worksheetfunction.match que retorna #N/A dependendo dos dados lidos. Quando isso ocorre, minha macro continua para a próxima linha, colando a informação nas células e eu não queria que isso acontecesse... Por favor, vocês podem me ajudar?

    VB:
    Sub PasteTasks() 
        Application.ScreenUpdating = False 'doesn't allow screen to update (user can't see the program running)
         
         
        Dim LastRow As Integer 'variables
        Dim TaskIndex, FindToday As Long 
         
         
        LastRow = Cells(Rows.Count, "B").End(xlUp).Row - 1 'define loop last row
         
         
        On Error Resume Next 
        For i = 10 To LastRow 'loop to copy/paste data depending on the task
            With Sheet9 'copy content depending on task
                .Activate 
                .Cells(i, 2).Copy 
                task = .Cells(i, 1) 
            End With 
            With Plan13 'takes into consideration current date and paste content to the defined task
                .Activate 
                TaskIndex = Application.WorksheetFunction.Match(task, .Range("B1:CM1"), 0) + 1 
                FindToday = Application.WorksheetFunction.Match(CLng(Date), .Range("A2:A214"), 0) + 1 
                Cells(FindToday, TaskIndex).PasteSpecial Paste:=xlPasteValues 
            End With 
        Next 
         
         
        Application.CutCopyMode = False 'cancel paste history
        Worksheets("Tasks").Activate 'back to task
         
         
    End Sub 
    
    

    terça-feira, 16 de outubro de 2012 12:45

Respostas

  • "Hoje estive tentando rodar minha macro mesmo que erros fossem encontrados no caminho."
    Rafael, não faça isto. É uma prática de programação não recomendada. Trate os erros. Dessa forma, além de você não saber onde está o erro, é muito provável que obtenha resultados inesperados na execução da sua rotina.

    Outra observação: declare variáveis.

    Outra observação: O VBA é capaz de alterar dados de uma planilha sem precisar ativá-la nem selecioná-la. Qualifique os intervalos de sua planilha e evite o uso do método Activate.

    Sobre sua dúvida, experimente fazer o seguinte:

    Sub PasteTasks()
        
        Application.ScreenUpdating = False    'doesn't allow screen to update (user can't see the program running)
    
    
        Dim LastRow As Integer    'variables
        Dim TaskIndex, FindToday As Long
    
    
        LastRow = Cells(Rows.Count, "B").End(xlUp).Row - 1    'define loop last row
    
    
        'On Error Resume Next '<-isto deve ser removido!
        For i = 10 To LastRow    'loop to copy/paste data depending on the task
            With Sheet9    'copy content depending on task
                .Activate
                .Cells(i, 2).Copy
                task = .Cells(i, 1)
            End With
            With Plan13    'takes into consideration current date and paste content to the defined task
                .Activate
                
                'Zerar os valores antes de procurá-los:
                TaskIndex = 0
                FindToday = 0
                On Error Resume Next '<- Aqui ignoro os erros
                TaskIndex = Application.WorksheetFunction.Match(task, .Range("B1:CM1"), 0) + 1
                FindToday = Application.WorksheetFunction.Match(CLng(Date), .Range("A2:A214"), 0) + 1
                On Error GoTo 0 '<- Aqui volto a ser notificado dos erros
                'Verifico se é possível popular a célula abaixo:
                If TaskIndex > 0 And FindToday > 0 Then
                    Cells(FindToday, TaskIndex).PasteSpecial Paste:=xlPasteValues
                End If
            End With
        Next
    
    
        Application.CutCopyMode = False    'cancel paste history
        Worksheets("Tasks").Activate    'back to task
    
    
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 16 de outubro de 2012 21:26
    Moderador