2014-05-14 1 views
3

통합 문서 구조를 보호하면 사용자가 시트를 삭제하지 못하게됩니다. 하지만 내가 어떻게 (VBA를 사용하여) 사용자가 시트를 지울 수 없도록 막을 수 있습니까? 활성 시트의 Worksheet_Activate 이벤트에사용자가 특정 시트를 삭제하지 못하도록 방지합니다.

Set mymenubar = CommandBars.ActiveMenuBar 
mymenubar.Controls("Edit").Controls("Delete sheet").Visible = False 

에 의해 삭제 방지하지만 시트가 활성화되면 당연히 그에만 작동되는 경우 나는 예를 본 적이있다.
활성 또는 비활성 여부에 관계없이 시트가 삭제되는 것을 방지하는 방법이 있습니까?
명확성을 위해 : 사용자가 일부 시트를 삭제해도 괜찮습니다. 특정 시트가 두 장이 아닙니다.
따라서 통합 문서 구조를 보호 할 수 없습니다.

+0

왜 숨기기를 사용하지 않습니까? 시트를 숨길 수 있다는 것을 알고 있습니까? 당신도 그들을 잠글 수 있습니다. – Leptonator

+0

사용자가 해당 시트를 볼 수는 있지만 삭제할 필요는 없습니다. 그것들은 워크 시트 활성화 이벤트로 가득 찬 데이터 입력 시트입니다. 그 (것)들을 삭제하는 것은 진짜 고통 일 것입니다. – user3474688

+1

UI가 처음 활성화되지 않은 시트를 여러 시트를 선택하여 삭제하는 유일한 방법은 여러 시트를 선택하는 것입니다. – aucuparia

답변

4

내가 알 수있는 한 기본적으로 단일 시트를 삭제 불가능으로 태그 지정하는 것은 불가능합니다. 통합 문서가 예방 적으로 보호 될 수 있도록 시트를 삭제하려고 할 때를 감지하는 데 사용할 수있는 이벤트가 없습니다.

그러나, 여기에서 잠재적 인 해결 방법입니다 :

  1. 보호 통합 문서 구조 :이 의지, 당신은 표시로, 삭제되는 모든 시트를 방지 할 수 있습니다.
  2. "컨트롤"시트를 만듭니다. 이 시트에서 모든 시트 이름 목록을 유지하십시오 (삭제할 수없는 시트 이름은 제외).
  3. 시트를 삭제하려면 컨트롤 시트 (예 : 데이터 유효성 검사 드롭 다운 메뉴)에서 이름을 선택하고 '삭제'버튼을 눌러야합니다. 이 단추는 통합 문서를 일시적으로 보호 해제하고 선택한 시트를 삭제 한 다음 통합 문서를 다시 보호하는 매크로를 호출합니다.

물론 시트 탭에서 마우스 오른쪽 버튼 클릭> 삭제와 달리 사용자는 시트 삭제 방법에 익숙해 져야합니다. 아직도, 이것은 복잡하지 않습니다. 시트 이름의 목록을 유지 즉, # 2를 달성하는 방법에 관해서는

, 나는 당신이 (배열 수식으로 호출해야합니다)이 하나 같이 UDF의 사용을 만들 수있는 가정 :

Function DeletableSheetNames() As String() 
    Application.Volatile 
    Dim i As Long 
    Dim sn() As String 
    With ThisWorkbook 
     ReDim sn(1 To .Sheets.Count) 
     For i = 1 To .Sheets.Count 
      With .Sheets(i) 
       If .Name = "DataEntry1" Or .Name = "DataEntry2" Then 
        'Don't include it in the list. 
       Else 
        sn(i) = .Name 
       End If 
      End With 
     Next i 
    End With 
    DeletableSheetNames = sn 
End Function 
2

사용자가 특정 시트를 삭제하지 못하게 할 수는 있지만 특정 시트가없는 경우 통합 문서가 저장되지 않도록하려면 Workbook_BeforeSave() 이벤트를 사용할 수 있습니다. 이 이벤트에 대한 문서는 특정 조건이 충족 될 때만 통합 문서 저장을 허용하는 방법을 정확하게 보여줍니다. http://msdn.microsoft.com/en-us/library/office/ff840057(v=office.14).aspx

+0

이것은 좋은 질문입니다. 조만간 VBA 개발을 시작하면 몇 장의 시트를 붙잡는 문제에 직면하게되는 한편 사용자는 나머지를 가지고 놀고 심지어 새로운 것들도 추가하게됩니다. 불행히도 대답은 '아니오'입니다. 이 관점에서 두 가지 해결 방법에는 주 단위가 있습니다. – jemenfou

1

내가 할 수있는 다음과 같이 Worksheet_BeforeDelete 이벤트를 통해 삭제되는 시트를 방지 :이 삭제되는 모든 시트를 보호

Private Sub Worksheet_BeforeDelete() 

    Call ThisWorkbook.Protect("password") 

    Call MsgBox("This sheet cannot be deleted.", vbExclamation) 

End Sub 

, 다음과 같은에서 ThisWorkbook 모듈에 대한 몇 가지 이벤트 코드를 추가하지만 경우 :

Private Sub Workbook_SheetActivate(ByVal Sh As Object) 

    Call ThisWorkbook.Unprotect("password") 

End Sub 

다른 시트를 선택하자마자 삭제할 수 있습니다.

페이지가 선택되면 페이지 잠금 해제로 인해 페이지간에 복사 및 붙여 넣기 기능이 손실됩니다.

관련 문제