2009-06-25 5 views
4

여러 섹션과 몇 개의 테이블이 포함 된 템플릿 문서가 있습니다. 것은 테이블의 셀 안쪽에 드롭 다운 목록을 삽입하려고합니다. 드롭 다운 목록이 작동하려면 문서를 보호해야합니다. 그러나 테이블이있는 전체 섹션을 보호하면 전체 테이블이 보호됩니다.Word vba - 커서가 셀/책갈피에있는 경우 - 코드 실행

그래서 사용자가 드롭 다운 목록을 클릭하면 매크로 코드를 실행하는 방법이 있는지 궁금합니다. 그런 다음 코드가 문서를 보호하여 실제로 컨트롤을 작동시킨 다음 선택 항목을 선택하고 사용자가 필드 외부를 클릭하면 문서가 보호되지 않게됩니다.

이것이 가능합니까?

답변

0

폼 도구 모음의 드롭 다운 상자를 사용하는 대신 컨트롤 도구 모음의 ComboBox를 사용할 수 있습니다. 그런 다음 ComboBox 클릭 이벤트를 사용할 수 있습니다. 또한 사용자가 ComboBox 외부를 클릭하면 코드를 GotFocus/LostFocus 이벤트에 연결할 수 있습니다.

+0

글쎄, 이것은 보고서의 템플릿이며 드롭 다운 메뉴는 사용자가 기밀 수준을 선택할 수 있도록되어 있습니다. 사용자가 무엇을 고를지라도 문서에서 일반 텍스트로 끝나야합니다. 드롭 다운 목록은 인쇄 할 때 표시되지 않아야합니다. –

5

실제로 사용할 수있는 Word VBA의 WindowSelectionChange 이벤트가 있습니다. Word VBA 도움말 파일의 "응용 프로그램 개체에 이벤트 사용"에 설명되어 있습니다.

Public WithEvents App As Word.Application 

그런 다음 일반 문서 열기 경우에, 당신은을 초기화 할 수 있습니다 :

트릭은 클래스 모듈에서 변수 (I가 광산 EventClassModule라는 이름의 한)가에서 WithEvents 키워드를 사용하여 응용 프로그램을 할당하는 것입니다

: 현재 응용 프로그램에 대한 변수를 선택 테이블 인 경우 EventClassModule에서

Dim oEvents As New EventClassModule 
Private Sub Document_Open() 
    Set oEvents.App = Word.Application 
End Sub 

돌아 가기, 당신은 확인하기 위해 WindowSelectionChange 이벤트를 사용

Private Sub App_WindowSelectionChange(ByVal Sel As Selection) 
    If Sel.Information(wdWithInTable) And ThisDocument.ProtectionType = wdNoProtection Then 
     ThisDocument.Protect wdAllowOnlyFormFields 
    ElseIf ThisDocument.ProtectionType <> wdNoProtection Then 
     ThisDocument.Unprotect 
    End If 
End Sub 

이 코드는 커서가 위치를 변경할 때마다 호출됩니다. 나는 그것을 테스트했고 약간 까다 롭다. (oEvents 객체는 어떤 이유에서든 초기화되지 않는 경향이있다.) 바라건대 이것은 당신의 솔루션을위한 시작일 것이다.

+0

정확하게 이해했는지 확실하지 않습니다. "Public WithEvents App as Word.Application"은 어디에 있습니까? 중간에 Document_Open 이벤트의 코드를 삽입했습니다. 그리고 명시된대로 하단 코드로 EventClassModule을 만들었습니다. 하지만 첫 번째 줄 은요? 어디에 넣을 까? 또 다른 것은 커서가 특정 책갈피를 선택할 때만 코드를 트리거 할 수 있습니까? 드롭 다운 필드에는 실제로 "Dropdown1"및 "Dropdown2"책갈피 이름이 있기 때문입니다. 이것들 만이 문서 보호를위한 코드를 트리거해야합니다. :) –

+0

꽤 잘 했어.하지만 WindowSelectionChange가 전혀 작동하지 않는 것 같아. 정말 부끄러운 일입니다. –

+1

"With With Public WithEvents App as Word.Application"은 클래스 모듈 EventClassModule 상단에 있으며 클래스의 멤버 변수입니다. Document_Open 이벤트에서 클래스를 인스턴스화하고 멤버 변수를 현재 응용 프로그램으로 설정합니다. (나는 그들이 왜 이렇게 화가 났는지 알지 못한다.) – Emily

관련 문제