2009-06-25 62 views
4

我有一個包含幾個部分和幾個表的模板文檔。 事情是,我試圖在表格中的單元格內插入一個下拉列表。 並且要使用下拉列表,文檔需要受到保護。但是,如果我保護桌子的整個部分,整個桌子都受到保護。Word vba - 如果光標在單元格/書籤中 - 運行代碼

所以,我想知道如果用戶單擊下拉列表中是否有執行宏代碼的方法?然後,代碼將保護文檔,使控件真正起作用,然後選擇一個選項,當用戶單擊字段外時,文檔應該不受保護。

這可能嗎?

回答

0

您可以使用控件工具欄中的ComboBox,而不是使用窗體工具欄中的下拉框。然後,您可以使用ComboBox單擊事件。當用戶在ComboBox之外單擊時,您還可以將代碼附加到GotFocus/LostFocus事件。

+0

嗯,事情是,這是一個報告的模板,下拉菜單應該讓用戶選擇信息級別。無論用戶選擇什麼,最終都應該以純文本的形式出現在文檔中。打印時下拉列表也不可見。 – 2009-06-26 08:38:29

5

實際上Word VBA中有一個WindowSelectionChange事件可以使用。它在「與應用程序對象一起使用事件」下的Word VBA幫助文件中進行了描述。

技巧是你的應用程序分配到一個類模塊使用WithEvents關鍵字(我命名礦EventClassModule)變量:

Public WithEvents App As Word.Application 

然後在您的普通文檔打開時,可以初始化變量當前應用程序:

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

早在EventClassModule,您使用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」。只有這些應該(最好)觸發代碼來保護文檔。 :) – 2009-06-26 05:46:21

相關問題