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

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

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

1 ответ1

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)

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .