错误13,在Worksheet_Change

时间:2019-06-20 07:48:17

标签: excel vba

我有一个包含两张纸的Excel电子表格。在sheet1中,我有多行,每行都有一个下拉菜单,用于设置行的状态。如果状态更改为“已完成”或“保留”,则应将其从工作表1中删除,并移至工作表2中的下一个可用行。

但是从工作表1中删除后,我得到了

  

运行时错误13-类型不匹配

下面是突出显示的代码的屏幕快照,指向错误的屏幕截图的链接,sheet1的屏幕截图和突出显示的调试代码。

Sheet1

Highlighted debugged code

https://youtu.be/7xbinC6meHw

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

1 个答案:

答案 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