鱼C论坛

 找回密码
 立即注册
查看: 1300|回复: 4

VBA程序卡死

[复制链接]
发表于 2024-12-30 09:34:45 | 显示全部楼层
看起来你的VBA程序在删除行时会卡死,可能是因为在`Worksheet_Change`事件中处理删除行的逻辑不够完善。你已经尝试通过`IsRowDeletion`函数来检测删除行操作,但似乎没有达到预期效果。以下是一些可能的改进建议:

1. **检查`IsRowDeletion`函数的逻辑**:确保该函数能够正确识别删除行的操作。你可以通过在函数中添加调试信息来确认它的行为。

2. **使用`Application.EnableEvents`**:在处理过程中禁用事件,以防止在更改单元格时触发其他事件。确保在代码结束时重新启用事件。

3. **优化`Worksheet_Change`事件的逻辑**:在处理删除行时,可能需要更精确地判断哪些操作需要跳过。

以下是一些具体的修改建议:

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     On Error GoTo ErrorHandler
  3.     Application.EnableEvents = False
  4.     Application.ScreenUpdating = False

  5.     ' 你的代码逻辑...

  6. ErrorHandler:
  7.     Application.EnableEvents = True
  8.     Application.ScreenUpdating = True
  9. End Sub
复制代码


在`Worksheet_Change`事件的开头和结尾分别禁用和启用事件处理,以避免不必要的事件触发。

4. **改进`IsRowDeletion`函数**:确保该函数能够准确识别删除行的情况。你可以通过检查`Target`的行数变化来判断是否是删除操作。

希望这些建议能帮助你解决问题!如果还有其他问题,欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-30 09:54:49 | 显示全部楼层
颂风侯 发表于 2024-12-30 09:54
Option Explicit




Private Sub Worksheet_Cha ...


看起来你的VBA代码在删除行时会卡死,可能是因为`IsDeletingRows`函数的逻辑不正确。你可以尝试以下方法来改进代码:

1. **改进`IsDeletingRows`函数**:你可以通过检查`Target`的行数变化来判断是否是删除操作。当前的实现可能无法正确检测删除行。

2. **使用`Application.EnableEvents`**:在处理过程中禁用事件,以防止在更改单元格时触发其他事件。确保在代码结束时重新启用事件。

以下是一些具体的修改建议:

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     On Error GoTo ErrorHandler
  3.     Application.EnableEvents = False
  4.     Application.ScreenUpdating = False

  5.     ' 如果是删除行操作,则跳过
  6.     If IsDeletingRows(Target) Then
  7.         GoTo ExitHandler
  8.     End If

  9.     ' 你的代码逻辑...

  10. ExitHandler:
  11.     Application.EnableEvents = True
  12.     Application.ScreenUpdating = True
  13.     Exit Sub

  14. ErrorHandler:
  15.     ' 错误处理逻辑
  16.     Resume ExitHandler
  17. End Sub

  18. ' 辅助函数,用于检测是否正在进行删除行操作
  19. Function IsDeletingRows(Target As Range) As Boolean
  20.     Dim r As Range
  21.     On Error Resume Next
  22.     For Each r In Target.Rows
  23.         If r.EntireRow.Hidden Then
  24.             IsDeletingRows = True
  25.             Exit Function
  26.         End If
  27.     Next r
  28.     IsDeletingRows = False
  29.     On Error GoTo 0
  30. End Function
复制代码


在`Worksheet_Change`事件的开头和结尾分别禁用和启用事件处理,以避免不必要的事件触发。确保`IsDeletingRows`函数能够准确识别删除行的情况。你可以通过检查`Target`的行数变化来判断是否是删除操作。

希望这些建议能帮助你解决问题!如果还有其他问题,欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-4-2 05:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表