Обработка ошибок в VBA, к сожалению, не так грациозна, как могла бы быть. Там, где большинство языков генерируют исключения, которые могут быть перехвачены с помощью try
... catch
блоков, в VBA нет ничего более изящного.
Просматривая ваш код, вы обнаружите, что точек сбоев не так много, поэтому вам не нужно слишком беспокоиться об обработке ошибок. Однако к обработке ошибок можно подойти одним из двух способов:
On Error Goto LABEL/LINE
или же
On Error Resume Next
On Error Goto ...
функции, переходя к указанной метке или номеру строки. Например:
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
В случае возникновения ошибки она переходит к вашему обработчику ошибок и в этом случае отображает окно сообщения об ошибке, не прерывая отладчик.
On Error Resume Next
делает именно то, что говорит - если в строке выдается ошибка, она просто пропускает ее и продолжает. В зависимости от того, чего вы пытаетесь достичь, это поведение может быть полезным, например, если вы просто хотите проверить, существует ли что-то в массиве, вы можете вернуться, true
если это произойдет, и false
если выдается ошибка.
Чтобы сделать эту обработку ошибок полезной, вам действительно нужно абстрагировать разные ее части в более мелкие подпрограммы, чтобы вы могли правильно обрабатывать каждый тип ошибки.
С точки зрения простой проверки на ошибки, обычно IF .. THEN
можно использовать операторы для проверки того, что значения введены так, как ожидается сценарием. Например, вы можете захотеть иметь, IF ... THEN
чтобы убедиться, что srccol, srcrow, destcol и destrow все выше 0, чтобы быть действительными. Простая проверка, такая как:
'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
удостоверится, что ошибок не было допущено, прежде чем пытаться выполнить и, возможно, вывести ошибку для обработки.
В дополнение к вашему коду, вам не нужно вырезать и вставлять, вы можете просто сделать что-то вроде:
Cells(destrow, destcol) = Cells(srcrow, srccol)
Дальнейшее чтение:
<!-- language: lang-vbs -->
в начале своего кода