我有一个包含两张纸的Excel电子表格。在sheet1中,我有多行,每行都有一个下拉菜单,用于设置行的状态。如果状态更改为“已完成”或“保留”,则应将其从工作表1中删除,并移至工作表2中的下一个可用行。
但是从工作表1中删除后,我得到了
运行时错误13-类型不匹配
下面是突出显示的代码的屏幕快照,指向错误的屏幕截图的链接,sheet1的屏幕截图和突出显示的调试代码。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("B:B")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
If (Target.Value = "Complete" Or Target.Value = "On Hold") Then
ActiveCell.EntireRow.Copy
Worksheets("Sheet2").Activate
i = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row
Worksheets("Sheet2").Cells(i + 1, 1).Select
ActiveSheet.Paste
Worksheets("Sheet1").Activate
ActiveCell.EntireRow.Delete
End If
End If
End Sub
答案 0 :(得分:5)
这是Worksheet_Change
程序修改工作表本身的常见问题-这将触发一个新的Change
事件(在第二个事件中,目标是当前已删除的完整行,如果检查范围大于一个单元格的Range的值,则会引发此错误13)。
防止此类问题很容易:您必须在事件例程运行时禁用事件。
更新:修改了代码,以显示如何在不使用Copy
的情况下使用Select
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Application.EnableEvents = False ' Disable events while routine is doing its duty
On Error Goto ChangeExit ' Ensure that events are switched on in any case
Set KeyCells = Range("B:B")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
With Target.Cells(1, 1)
If (.Value = "Complete" Or .Value = "On Hold") Then
Dim lastRow As Long
lastRow = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).row
.EntireRow.Copy Worksheets("Sheet2").Cells(lastRow + 1, 1)
.EntireRow.Delete
End If
End With
End If
ChangeExit:
Application.EnableEvents = True
End Sub