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: