excel - 错误 13,在 Worksheet_Change 中删除行后类型不匹配
问题描述
我有一张带有两张纸的 Excel 电子表格。在 sheet1 中,我有多行,每行都有一个下拉菜单,用于设置行的状态。如果状态更改为“已完成”或“暂停”,则应将其从 sheet1 中删除并移至 sheet2 中的下一个可用行。
但是,从 sheet1 中删除后,我得到
运行时错误 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
解决方案
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
推荐阅读
- sapui5 - 检查“找不到文件”或解析错误
- javascript - 终端中出现“属性不存在”错误,但 Chrome 控制台中没有 - Nuxt/Prismic
- kotlin - 将我的图书馆服务与我的应用程序通信的最佳方法
- codeigniter - 在codeigniter 4中从正则表达式调用类
- python - Django - 将 Excel 文件保存到模型的 FileFild
- google-api-client - 谷歌文档 ai 不解析表单
- php - PHP从数组中删除空字符串
- javascript - 是否有更简单/更有效的方法来更新此 json 文件中的值?
- javascript - 如何使用javascript再次关闭下拉菜单?
- git - 合并时(需要在纯 git + diff 工具中审查的代码)如何(真正)在来自其他分支的每一行更改的代码上强制冲突?