VBA para mover um conteúdo de célula e excluir a linha - introduza a verificação de erro

2

Eu escrevi as seguintes linhas de código no VBA e sou novo no VBA.

Sub move_content()
'declaration
    Dim srcrow, srccol, destrow, destcol As Integer
    Dim lastrow As Long

'intialization
    srcrow = 4 ' source row
    srccol = 7 ' source column
    destrow = 3 ' destination row
    destcol = 8 ' destination column

'finding out the last row in the data - Column G has the data
    lastrow = Cells(ActiveSheet.Rows.Count, "G").End(xlUp).Row

    For i = 1 To lastrow
'Cut the contents of the source cell
        Cells(srcrow, srccol).Select
        Selection.Cut

'paste the contents in destination cell
        Cells(destrow, destcol).Select
        ActiveSheet.Paste

'Delete the entire row after the cut-paste operation
        Rows(srcrow).EntireRow.Delete

        srcrow = srcrow + 1
' If the next source cell is blank exit for loop
        If Cells(srcrow, srccol).Value = "" Then
            Exit For
        End If

        destrow = destrow + 1
        i = i + 1

    Next
End Sub

Eu me lembro de alguém me dizendo que eu deveria incluir a verificação de erros em minhas rotinas. Eu não entendo o que preciso fazer.

Nota: O código é executado e faz o que se pretende fazer

    
por Prasanna 25.02.2016 / 03:46

1 resposta

2

O tratamento de erros no VBA não é, infelizmente, tão agradável quanto poderia ser. Onde a maioria dos idiomas lança exceções que podem ser capturadas usando try ... catch blocks, o VBA não tem nada tão gracioso.

Examinando seu código, não há muitos pontos de falha, portanto talvez você não precise se preocupar muito com o tratamento de erros. No entanto, o tratamento de erros pode ser abordado de duas maneiras:

On Error Goto LABEL/LINE

ou

On Error Resume Next

On Error Goto ... funções saltando para um rótulo ou número de linha especificado. Por exemplo:

Sub move_content()
    On Error Goto errhandler
    'declaration
        Dim srcrow, srccol, destrow, destcol As Integer
        Dim lastrow As Long
    ...
    ...
    Exit Sub
errhandler:
    Msg = "Error # " & Str(Err.Number) & " was generated by " _
        & Err.Source & Chr(13) & Err.Description
    MsgBox Msg, , "Error", Err.Helpfile, Err.HelpContext
End Sub

Caso ocorra um erro, ele passará para o seu manipulador de erros e, neste caso, mostrará uma caixa de mensagem do erro sem quebrar o depurador.

On Error Resume Next faz exatamente o que ele diz - se um erro é lançado em uma linha, ele simplesmente pula e continua. Dependendo do que você está tentando alcançar, esse comportamento pode ser útil, por exemplo, se você simplesmente quiser verificar se algo existe na matriz, você pode retornar true , se houver, e false se um erro for lançado .

Para tornar esse tratamento de erros útil, você precisa abstrair diferentes partes dele em subs menores para que você possa manipular corretamente cada tipo de erro.

Em termos de simplesmente verificar erros, geralmente IF .. THEN instruções podem ser usadas para verificar os valores inseridos como esperado pelo script. Por exemplo, você pode querer ter um IF ... THEN para ter certeza de que srccol, srcrow, destcol e destrow estão todos acima de 0, para serem válidos. Uma simples verificação, como:

'intialization
    srcrow = 4 ' source row
    srccol = 7 ' source column
    destrow = 3 ' destination row
    destcol = 8 ' destination column

If srcrow <= 0 OR srccol <= 0 OR destrow <= 0 OR destcol <= 0 Then
    Msgbox "Invalid row or column number (Less than or equal to zero!)"
    Exit Sub
End If

certifica-se de que nenhum erro foi cometido antes de tentar executar e possivelmente gerar um erro a ser tratado.

Em uma nota lateral com seu código, você não precisa recortar e colar, você pode simplesmente fazer algo como:

Cells(destrow, destcol) = Cells(srcrow, srccol)

Leitura adicional:

por 25.02.2016 / 05:13