2013-08-26 143 views
2

长时间潜伏者,第一次海报。这个错误一直困扰着我好几个星期,所以我不得不求助于寻求帮助。错误424对象需要结束Sub

我有一个excel添加,我已经开发。添加有一个自定义右键单击菜单,取代了标准的Excel右键单击菜单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 

您选择我的自定义菜单“删除行”。这将调用Procedure 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 Target.address 我可能会导致该行出现错误。如果我 设置Target = activecell 之前msgbox修复该错误,但它仍然错误End Sub。是否有我需要重置的系统目标类型的变量?

即使放入 表(“主要项目”)。范围(“a1”)。select 没有帮助。

因为代码错误,Addin卸载。那么用户需要重新启动插件,然后才能再次使用任何功能。

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

+0

如果您的意图是完全替换右键单击菜单,请尝试在事件底部放置'Cancel = True',以便始终取消它。我没有详细看过(现在已经很晚了),但我会猜测你的事件会被连续调用两次。 –

+0

也禁用你的错误处理 - 你需要看到错误。无论如何,有一个不处理错误的处理程序是一个v.bad的想法。 –

+0

感谢您的回复。我在我的实时代码中正确处理了错误,但是仅仅是为了这个网站而去掉了错误(或者它将会是1000行的长度)。禁用错误处理不会执行任何操作,因为错误发生在(后?)End Sub上。所有代码都是在那时完成的。它的excel有一个SystemTarget变量,它被设置为你点击的单元格。如果您删除单元格,则会丢失值和错误。但之后的工作很好。它是一个Bizzare。我添加了额外的cancel = true。但它并没有阻止这个错误。 – Milesy

回答

0

我尝试了一些简单的东西,它没有编译(与子名称相同的变量名)。可能是你应该定义和使用一个长型变量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 & vbTab & "Sub/Function name - Start",并在末尾添加一个“Finish”,这样我可以在Immediate窗口中更准确地跟踪错误。

+0

感谢您的回应。这是一个很好的选择,但它并没有解决这个问题。即使我只是说ActiveWorkbook.Worksheets(“主要项目”)。范围(A1:R500).EntireRow.Delete在重新运行查询之前清除现有数据,这恰好是我点击的范围来激发菜单,它错误。 – Milesy

0

答案最终使用Application.OnTime函数来调用删除函数。这允许删除独立于运行的其他代码。