首页 > 解决方案 > 错误 13,在 Worksheet_Change 中删除行后类型不匹配

问题描述

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

但是,从 sheet1 中删除后,我得到

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

下面是突出显示的代码的屏幕截图、错误屏幕截图的链接、sheet1 的屏幕截图和突出显示的调试代码。

表 1

突出显示的调试代码

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

标签: excelvba

解决方案


Worksheet_Change这是修改工作表本身的例程的常见问题- 这将触发一个新的Change事件(在第二个事件中,目标是当前删除的完整行,并且检查具有多个单元格的范围的值将引发这个错误 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

推荐阅读