VBA 移动单元格内容并删除行 - 引入错误检查

VBA 移动单元格内容并删除行 - 引入错误检查

我已经在 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

遗憾的是,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 ... THENsrccol、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)

进一步阅读:

相关内容