Vba 错误424末端接头上需要对象

Vba 错误424末端接头上需要对象,vba,excel,Vba,Excel,长期潜伏者,第一次海报。这个错误困扰了我好几个星期,所以我不得不求助于寻求帮助 我已经开发了一个excel外接程序。外接程序有一个自定义的右键单击菜单,它取代了标准的excel右键单击菜单在右键单击之前取消工作表。这非常好,删除右键单击的行时执行 比如说。右键单击“主要项目”表上的单元格E11以打开菜单。 菜单代码: Private Sub SheetBeforeRightClick(ByVal sh As Object, ByVal Target As Range, Cancel As Boo

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

我已经开发了一个excel外接程序。外接程序有一个自定义的右键单击菜单,它取代了标准的excel右键单击菜单在右键单击之前取消工作表。这非常好,删除右键单击的行时执行

比如说。右键单击“主要项目”表上的单元格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
这将删除选定的行。删除行后,代码将返回FinanceCreateSubleNumProjectsNew函数。然后在工作表上单击鼠标右键完成之前的步骤。它到达SheetBeforeRightClick过程的End Sub,并给出一个424对象请求错误。没有调试选项,并且我不能错误捕获它,因为它在结束子节点之后出现错误。我只能假设它是错误的,因为您右键单击的单元格已被删除,并且系统已丢失目标。如果我加入 msgbox Target.address 我可以导致该行发生错误。如果我 设置目标=activecell 在修复该错误的msgbox之前,但在End Sub上仍然存在错误。是否需要重置系统目标类型的变量

甚至还放了一个 表格(“主要项目”)。范围(“a1”)。选择 没用

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


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

我尝试了一些简单的方法,但没有编译(变量名与子名称相同)。可能您应该定义并使用长类型变量
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
子删除行()
暗淡的lngDeleteRow与长
调试。打印“ActiveWorkbook:”&ActiveCell.Worksheet.Parent.Name
调试。打印“ActiveSheet:&ActiveCell.Worksheet.Name”
调试。打印“ActiveCell:”&ActiveCell.Address
如果错误号为0,则
Debug.Print“DeleteRow():ERR”&ERR.Number&“”&ERR.Description
呃,明白了
如果结束
lngDeleteRow=ActiveCell.Row
如果ActiveWorkbook.Worksheets(“主要项目”).Range(“A”和lngDeleteRow)=“x”,则
ActiveWorkbook.Worksheets(“主要项目”).Rows(lngDeleteRow).EntireRow.Delete
其他的
MsgBox“您尚未选择要删除的分隔符”
如果结束
端接头

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

答案是使用Application.OnTime函数调用delete函数。这允许删除与运行的其余代码分开进行。

如果您打算完全替换右键菜单,请尝试将
Cancel=True
放在事件底部,以便始终取消。我还没有详细查看(已经很晚了),但我可以冒昧地猜测,您的事件正在连续调用两次。另外,请禁用您的错误处理-您需要查看错误。无论如何,拥有一个不处理错误的处理程序是个坏主意。感谢您的回复。我确实正确地处理了我的实时代码中的错误,但只是在这个站点上删除了它(否则会有1000行)。当错误发生在终端子节点上(之后?)时,禁用错误处理将不会产生任何效果。因此,所有代码都将在那时完成。它类似于excel有一个SystemTarget变量,该变量设置为您单击的单元格。如果删除单元格,则会丢失值和错误。但在那之后效果很好。这是一个奇怪的问题。我添加了额外的cancel=true。但这并没有阻止错误。谢谢你的回复。这是一个很好的选择,但它并没有解决故障。即使我只是说ActiveWorkbook.Worksheets(“主要项目”).Range(A1:R500).EntireRow.Delete以在重新运行查询之前清除现有数据,而这恰好是我单击以启动菜单的范围,它也会出错。