End Sub 上需要错误 424 对象

Posted

技术标签:

【中文标题】End Sub 上需要错误 424 对象【英文标题】:Error 424 Object required on End Sub 【发布时间】:2013-08-26 02:09:52 【问题描述】:

长期潜伏者,第一次海报。这个错误困扰了我好几个星期,所以我不得不求助于帮助。

我已经开发了一个 Excel 插件。该插件有一个自定义右键菜单,它取代了标准的 Excel 右键菜单 uning SheetBeforeRightClick。这工作得很好,当您删除您右键单击的行时除外。

例如。您右键单击“主要项目”表上的单元格 E11 以显示菜单。 菜单代码:

Private Sub SheetBeforeRightClick(ByVal sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim ClstrCmd As CommandBar
'Display cluster display option commands
On Error GoTo connerr
    If ActiveSheet.Name = "Control" Then
            Cancel = True
            Set ClstrCmd = FinanceCreateSubMenuControlNew
            ClstrCmd.ShowPopup
    ElseIf ActiveSheet.Name = "Input" Then
            Cancel = True
            Set ClstrCmd = FinanceCreateSubMenuInputNew
            ClstrCmd.ShowPopup
    ElseIf ActiveSheet.Name = "Major Projects" Or ActiveSheet.Name = "Projects GP Report" Then
            Cancel = True
            Set ClstrCmd = FinanceCreateSubMenuProjectsNew
            ClstrCmd.ShowPopup
    Else
        'No Menu for this sheet
    End If
connerr:
End Sub

Function FinanceCreateSubMenuProjectsNew() As CommandBar

''Create some objects
Dim cb As CommandBar
Dim cbc As CommandBarControl

''Ensure our popup menu does not exist
FinanceDeleteCommandBar "FINANCE_PROJECTS"

''Add our popup menu to the CommandBars collection
Set cb = CommandBars.Add(Name:="FINANCE_PROJECTS", Position:=msoBarPopup, MenuBar:=False, Temporary:=False)

Set cbc = cb.Controls.Add
With cbc
    .Caption = "Insert Seperator Row"
    .OnAction = "InsertMajorProjectsSeperator"
End With
   Set cbc = cb.Controls.Add
With cbc
    .Caption = "Delete Seperator Row"
    .OnAction = "DeleteMajorProjectsSeperator"
End With

Set FinanceCreateSubMenuProjectsNew = cb

End Function

您从我的自定义菜单中选择“删除行”。这将调用过程 Deleterow。

Sub DeleteRow()
    Deleterow = ActiveCell.Row

    If ActiveWorkbook.Worksheets("Major Projects").Range("A" & Deleterow) = "x" Then
        ActiveWorkbook.Worksheets("Major Projects").Rows(Deleterow).EntireRow.Delete
    Else
        MsgBox "You haven't selected a seperator to delete"
    End If
End Sub

删除选定的行。删除该行后,代码将返回 FinanceCreateSubMenuProjectsNew 函数。然后到SheetBeforeRightClick 程序完成。它在 SheetBeforeRightClick 过程中到达 End Sub 并给出 424 - Object requred 错误。没有调试选项,我不能错误捕获它,因为它在 End Sub 之后出现错误。我只能假设它是因为您右键单击的单元格已被删除并且系统丢失了目标。如果我放一个 msgbox 目标地址 我可以导致错误发生在该行。如果我 设置目标=活动单元 在修复该错误的 msgbox 之前,但它仍然在 End Sub 上出错。我需要重置系统目标类型的变量吗?

即使放一个 sheet("主要项目").Range("a1").select 没用。

由于代码错误,插件卸载。因此,用户需要重新启动插件才能再次使用任何功能。

真正的关键是,一旦我重新启动插件,我就可以删除行而不会出现错误。再次出现错误的唯一方法是完全关闭 Excel 并重新开始。仅关闭文件不会导致错误再次发生。

【问题讨论】:

如果您打算完全替换右键单击菜单,请尝试将Cancel = True 放在您的事件底部,以便它始终被取消。我没有详细查看(已经很晚了),但我会冒险猜测您的事件被连续调用了两次。 同时禁用错误处理 - 您需要查看错误。无论如何,拥有一个不处理错误的处理程序是一个非常糟糕的主意。 感谢您的回复。我确实在我的实时代码中正确处理了错误,但只是为这个站点删除了它(或者它将是 1000 行长)。禁用错误处理没有任何作用,因为错误发生在(之后?)End Sub。所以到那时所有的代码都完成了。它的 Like excel 有一个 SystemTarget 变量,该变量设置为您单击的单元格。如果删除单元格,则会丢失值和错误。但之后工作正常。它是一个奇异的。我添加了额外的取消 = true。但它并没有阻止错误。 【参考方案1】:

我尝试了一些简单的方法,但它没有编译(变量名称与子名称相同)。可能你应该定义和使用 Long 类型变量lngDeleteRow

Sub DeleteRow()
    Dim lngDeleteRow as Long

    Debug.Print "ActiveWorkbook: " & ActiveCell.Worksheet.Parent.Name
    Debug.Print "ActiveSheet: " & ActiveCell.Worksheet.Name
    Debug.Print "ActiveCell: " & ActiveCell.Address
    If Err.Number <> 0 Then
        Debug.Print "DeleteRow() : ERR " & Err.Number & " " & Err.Description
        Err.Clear
    End If

    lngDeleteRow = ActiveCell.Row

    If ActiveWorkbook.Worksheets("Major Projects").Range("A" & lngDeleteRow) = "x" Then
        ActiveWorkbook.Worksheets("Major Projects").Rows(lngDeleteRow).EntireRow.Delete
    Else
        MsgBox "You haven't selected a seperator to delete"
    End If
End Sub

您可能还想在您的实时代码中添加更多 Debug.Print 行以查明错误。当我遇到这种情况时,我会在每个 Sub 和函数的开头添加 Debug.Print Now &amp; vbTab &amp; "Sub/Function name - Start",并在末尾添加一个“Finish”,这样我就可以在立即窗口中更准确地跟踪错误。

【讨论】:

感谢您的回复。这是一个很好的皮卡,但它并没有解决问题。即使我只是说 ActiveWorkbook.Worksheets("Major Projects").Range(A1:R500).EntireRow.Delete 以在重新运行查询之前清除现有数据,而这恰好是我单击以启动菜单的范围,它出错了。【参考方案2】:

答案最终是使用 Application.OnTime 函数来调用删除函数。这允许删除与运行的其余代码分开发生。

【讨论】:

以上是关于End Sub 上需要错误 424 对象的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA 424 错误对象需要,在单元格(行,列)。值

删除行时需要 Excel VBA 运行时错误“424”对象

带有 ADODB 记录集的 MS Access ListBox 列属性创建错误 424 需要对象

访问对象 424

错误处理程序 - Exit Sub 与 End Sub

连接 VBA SQL 语句中的字段时出现错误 424