【问题标题】:Compatability error 2003 - 2016 macro in ExcelExcel 中的兼容性错误 2003 - 2016 宏
【发布时间】:2018-03-22 11:14:03
【问题描述】:

关于一些 VBA 的快速查询。我最近从 Excel 2003 迁移到 2016 (365),并且传输代码存在问题。

我有一个单元格,您在其中输入了一个数字。当您在编辑单元格后按 Enter 键时,它会将该值添加到右侧 2 个单元格的单元格中,并保持计数。然后它会擦除原始单元格中的值。

Sub CasesChecked()
    If Sheets("Work Return").Range("F13") = "" Then
        Sheets("Work Return").Unprotect "adminstats"
        Sheets("Work Return").Range("F13") = Sheets("Work Return").Range("D13")
        Sheets("Work Return").Range("D13") = ""
        Sheets("Work Return").Protect "adminstats"
    Else
        Sheets("Work Return").Unprotect "adminstats"
        Sheets("Work Return").Range("F13") = Sheets("Work Return").Range("F13") + Sheets("Work Return").Range("D13")
        Sheets("Work Return").Range("D13") = ""
        Sheets("Work Return").Protect "adminstats"
    End If

End Sub

上面的代码在 Module1 中,在 Sheet1 中有下面的代码。这通过相交确认了单元格的变化:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("D13")) Is Nothing Then
    CasesChecked
    Else
    If Not Intersect(Target, Target.Worksheet.Range("D17")) Is Nothing Then
    CasesChecked2
    Else
    End If
    End If
End Sub

不幸的是,我得到了可怕的“运行时错误'-2147417848 对象_worksheet 的方法范围失败”,并且无法完全弄清楚原因。代码很简单,不知道哪里出错了。

任何建议将不胜感激

谢谢,

瑞恩

【问题讨论】:

  • CasesChecked2 在哪里??
  • 我最好的选择是Target。它被声明为一个范围,并且在您的代码中编写Target.Worksheet.Range("D17")),它与Range(some_range).Worksheet.Range("D17")) 相同。试着弄清楚Target 是什么。如果您不知道代码在哪里出错,您可以在第一行添加断点并按 F8 单步执行代码。
  • 什么时候你会收到这个错误,在哪里
  • 嗨 @Gary'sStudent 学生 - CasesChecked2 只是 CasesChecked 的副本,位于 CasesChecked 下方的另一个子中。安德烈亚斯-谢谢你的想法! target 在 XP/2003 上运行良好 - 它实际上在这个版本中也运行良好(宏运行良好)但是一旦它完成运行,它会继续刷新,就像卡在一个循环中一样,然后抛出错误消息。 FunThomas 我在宏运行时收到消息,即:单元格已更改(键入了一个值)。宏完成,然后继续,好像它卡在一个不存在的循环中,然后崩溃并显示错误消息,用户 UX 问题
  • @Andreas 请看上面的评论。谢谢

标签: excel vba module runtime-error office365


【解决方案1】:

我会先进行此更改,然后再试一次:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("D13")) Is Nothing Then
        Application.EnableEvents = False
            CasesChecked
        Application.EnableEvents = True
    Else
        If Not Intersect(Target, Target.Worksheet.Range("D17")) Is Nothing Then
            Application.EnableEvents = False
                CasesChecked2
            Application.EnableEvents = True
        Else
        End If
    End If
End Sub

编辑#1:

在原始代码中,Worksheet_Change() 响应了用户发起的更改。但它也响应了CasesChecked()所做的更改。

这造成了一个恶意循环。新代码避免了这种情况。

【讨论】:

  • 太棒了!像魅力一样工作。非常感谢你!你介意解释一下你改变了什么,只是为了我的学习
  • @CluelessMacroMan 看我的EDIT#1
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多