2013-08-26 6 views
2

Долгое время lurker, впервые плакат. Эта ошибка прослушивала меня в течение нескольких недель, поэтому мне пришлось обратиться за помощью.Ошибка 424 Требуется объект на конце Sub

У меня есть отличное дополнение, которое я разработал. В добавлении есть пользовательское меню щелчка правой кнопкой мыши, которое заменяет стандартное меню правого щелчка excel, ограничивающее значение SheetBeforeRightClick. Это работает отлично, execpt, когда вы удаляете строку, на которую вы щелкнули правой кнопкой мыши.

Например. Вы щелкаете правой кнопкой мыши по ячейке 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. Он получает End End в процедуре SheetBeforeRightClick и дает ошибку 424 - Object Required. Отладочной опции нет, и я не могу ее уловить, поскольку она появляется после ошибки после End Sub. Я могу только предположить его, потому что ячейка, которую вы щелкнули правой кнопкой мыши, была удалена, и система потеряла цель. Если я положил msgbox Target.address Я могу вызвать ошибку в этой строке. Если I установить Target = activecell перед протоколом msgbox, который исправляет эту ошибку, но все еще ошибки в End Sub. Есть ли системный целевой тип переменной, которую мне нужно сбросить?

Даже вставка в лист («Основные проекты»). Диапазон («a1»). Выбрать не помогает.

Исчерпайте ошибки кода, Addin выгружает. Таким образом, пользователю необходимо перезапустить добавление, прежде чем они смогут снова использовать любую функциональность.

Настоящий кикер, как только я перезапустил аддон, я могу удалить строки, не получив ошибку. Единственный способ получить ошибку снова - полностью закрыть Excel и начать заново. Закрытие файла не приводит к повторной ошибке ошибки.

+0

Если вы намерены полностью заменить меню правой кнопкой мыши, попробуйте помещать 'Cancel = True' в нижней части вашего мероприятия, чтобы он всегда был отменен. Я не смотрел подробно (уже поздно), но я бы поставил под угрозу, что ваше мероприятие вызывается дважды подряд. –

+0

Также отключите обработку ошибок - вам нужно увидеть ошибки. В любом случае, это идея v.bad иметь обработчик, который не обрабатывает ошибку. –

+0

Спасибо за ответы. Я правильно обрабатываю ошибки в своем живом коде, но просто раздели его для этого сайта (или это будет 1000 строк длиной).Отключение обработки ошибок ничего не делает, поскольку ошибка возникает (после?) End Sub. Таким образом, весь код будет завершен к тому времени. Свойство Like excel имеет переменную SystemTarget, которая настроена на ячейку, на которую вы нажали. Если вы удалите ячейку, она потеряет значение и ошибки. Но после этого прекрасно работает. Его Bizzare один. Я добавил дополнительный cancel = true. Но это не остановило ошибку. – Milesy

ответ

0

Я пробовал что-то простое, и он не компилировался (имя переменной совпадает с именем Sub). Может быть, вы должны определить и использовать 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 линии на протяжении всего живого кода приколоть указать ошибку. Когда у меня есть ситуации, подобные этому, я бы добавил Debug.Print Now & vbTab & "Sub/Function name - Start" при каждом начале Sub и функции, а в конце «Finish», чтобы я мог более точно отслеживать ошибку в окне Immediate.

+0

Спасибо за ответ. Это хороший пикап, но он не решил ошибку. Даже если я просто говорю «ActiveWorkbook.Worksheets» («Основные проекты»). Range (A1: R500) .EntireRow.Delete для очистки существующих данных до повторного запуска запроса, и это, оказывается, диапазон, на который я нажал, чтобы вызвать меню, это ошибки. – Milesy

0

В результате этого ответа используется функция Application.OnTime для вызова функции удаления. Это позволяет удалить событие отдельно от остальной части запущенного кода.

Смежные вопросы