2013-08-26 103 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函數來調用刪除函數。這允許刪除獨立於運行的其他代碼。