2013-08-26 3 views
2

긴 시간 lurker, 처음 포스터. 이 오류는 몇 주 동안 나를 괴롭 히고 있습니다. 그래서 도움을 요청해야합니다.오류 424 End Sub에 개체가 필요합니다.

나는 내가 개발 한 분야에서 뛰어나다. 추가 기능에는 사용자 정의 오른쪽 클릭 메뉴가 있으며,이 메뉴는 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 Target.address 해당 줄에 오류가 발생할 수 있습니다. 내가 Target = activecell 을 설정하면 msgbox가 오류를 수정하지만 End Sub에서는 여전히 오류가 발생합니다. 재설정해야 할 변수의 시스템 대상 유형이 있습니까?

시트 ("주요 프로젝트"). 범위 ("a1"). 을 선택해도 도움이되지 않습니다.

코드 오류가 발생하면 Addin이 언로드됩니다. 따라서 사용자는 추가 기능을 다시 시작해야 기능을 다시 사용할 수 있습니다.

오류가 발생하지 않고 추가 기능을 다시 시작한 후에는 행을 삭제할 수 있습니다. 오류를 다시 얻는 유일한 방법은 Excel을 완전히 닫고 다시 시작하는 것입니다. 파일을 닫아도 오류가 다시 발생하지는 않습니다.

+0

마우스 오른쪽 버튼 클릭 메뉴를 완전히 바꾸려면 일정 하단에 'Cancel = True'를 입력하여 항상 취소되도록하십시오. 세부적으로 살펴 보지 않았습니다 (늦었습니다).하지만 이벤트가 연속해서 두 번 호출되는 것 같아요. –

+0

또한 오류 처리를 비활성화하십시오 - 오류를 확인해야합니다. 어쨌든 오류를 처리하지 않는 핸들러를 가지고있는 것이 v.bad 아이디어입니다. –

+0

응답 해 주셔서 감사합니다. 나는 실제 코드에서 오류를 올바르게 처리하지만,이 사이트에서는 오류를 제거했다.End Sub에 (? 다음에) 오류가 발생하면 오류 핸들링을 사용하지 않도록 설정하면 아무런 반응이 없습니다. 그래서 모든 코드는 그때까지 완료됩니다. Like Excel에는 클릭 한 셀로 설정된 SystemTarget Variable이 있습니다. 셀을 삭제하면 값과 오류가 손실됩니다. 하지만 거기에서 잘 작동합니다. 그것 Bizzare 하나. 추가 cancel = true를 추가했습니다. 그러나 그것은 오류를 멈추지 않았습니다. – Milesy

답변

0

나는 간단한 것을 시도하고 컴파일하지 않았다. (Sub 이름과 같은 변수 이름).

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 라인을 넣어 할 수 있습니다 : 당신이 정의하고 lngDeleteRow 변수 긴 형식을 사용해야 할 수 있습니다. 이런 상황이 생기면 직접 시작 창에 오류를 더 정확하게 추적 할 수 있도록 각 Sub 및 함수 시작 부분에 Debug.Print Now & vbTab & "Sub/Function name - Start"을 추가하고 마지막에 "마침"을 추가합니다.

+0

응답 해 주셔서 감사합니다. 그게 좋은 픽업,하지만 그것은 잘못을 해결하지 않았습니다. ActiveWorkbook.Worksheets ("Major Projects"). Range (A1 : R500) .EntireRow.Delete를 사용하여 쿼리를 다시 실행하기 전에 기존 데이터를 지우면 내가 클릭 한 범위가 메뉴를 선동하는 것처럼 보입니다. 오류. – Milesy

0

대답은 결국 Application.OnTime 함수를 사용하여 삭제 기능을 호출하는 것입니다. 이렇게하면 실행중인 나머지 코드와 별도로 삭제가 수행됩니다.

관련 문제