我已经在 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 ... 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)
进一步阅读: