VBA для перемещения содержимого ячейки и удаления строки - ввести проверку ошибок

2

Я написал следующие строки кода в VBA, и я новичок в 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

Я помню, как кто-то говорил мне, что я должен включить проверку ошибок в свои процедуры. Я не понимаю, что мне нужно делать.

Примечание. Код выполняется и выполняет то, для чего предназначен

Prasanna
источник
почему мой код не в цветовой код? хотя я добавил <!-- language: lang-vbs -->в начале своего кода
Prasanna

Ответы:

2

Обработка ошибок в 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)

Дальнейшее чтение:

Jonno
источник