Обработка ошибок в 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)
Дальнейшее чтение: