簡體   English   中英

具有.docm擴展名的word文檔中的vba代碼的說明

[英]Explanation of vba code in a word document having .docm extension

我有一個.docm格式的Microsoft Word文檔。 乍一看它不包含任何宏(如在功能區上單擊以下內容時; View - > Macros - > View macros彈出一個具有空列表的窗口)。

但是,當啟用Developer功能區選項卡,然后單擊其中的Visual Basic圖標,然后從VB窗口的下拉列表中選擇Document and ContentControlonEnter ,將顯示以下代碼:

Private Sub Document_ContentControlOnEnter(ByVal ContentControl As ContentControl)
Dim i As Long, j As Long
With ActiveDocument
  If ContentControl.Title = "Classification" Then
ContentControl.DropdownListEntries.Clear
For i = 1 To .ContentControls.Count
  If Left(.ContentControls(i).Title, 5) = "Level" Then
    j = j + 1
    ContentControl.DropdownListEntries.Add Text:=j & " - " & .ContentControls(i).Range.Text
  End If
Next
  End If
End With
End Sub

選擇下拉列表中的其他選項僅提供“空白”代碼(即它們僅包含函數聲明,后跟End關鍵字)。


我的問題是代碼的意圖是什么?


*

  • 細節:
  • 有問題的Word文檔包含指向同一文檔部分的超鏈接以及指向同一文件夾的Word文件和Excel文件的幾個鏈接。 它還包含許多內容控制框,我猜測它是代碼的焦點(因為代碼包含ContentControl關鍵字)

內容控件可以在用戶輸入和退出宏時觸發宏。 Microsoft做出了設計決定,即所有內容控件都應觸發相同的“事件” - Document_ContentControlOnEnter / Document_ContentControlOnExit - 並且事件中的代碼需要檢查輸入/退出的內容控件。

內容控件被視為文檔的一部分,因為文檔可以觸發事件。 這就是為什么他們在(並且必須在)ThisDocument 模塊中。

(注意:查看宏只能顯示沒有參數的PUBLIC SUB過程,這些過程位於“普通”代碼模塊中。任何私有子,任何函數,任何帶參數的東西以及類模塊中的任何內容都不會出現在該列表中。因此,您無法使用該列表來確定文檔是否包含任何代碼。)

If ContentControl.Title = "Classification" Then檢查輸入了哪個內容控件。 (注意:使用Select Case而不是If通常更有意義,特別是當事件需要區分多個內容控件時。)If中的內容只有在具有Title“Classification”的內容控件時才會執行。 (請注意,多個內容控件可以具有相同的標題,因此可以運行多個內容控件。)

如果輸入了另一個內容控件,則仍會觸發該事件,但不會發生任何事情(在本例中)。

Catalin Pop正確地解釋了代碼本質上是“重置”下拉列表。

舊版表單字段使用類似的模式 - 當用戶輸入/退出表單字段時,宏可以觸發。 但是為此設計的是你必須創建一個Public Sub並將其分配給Properties中的表單字段。

我認為這里的邏輯非常簡單。 基本上,代碼在整個文檔中搜索名為Classification的內容控件。 找到它之后,它會清除所有的drowdown條目 - 比如重置。 在清潔部分之后,它再次在整個文檔中搜索以“Level”開頭的所有內容控件,並收集這些控件的文本及其外觀順序。

收集此信息后,填寫上面的分類控制的下拉選項。 (例如,1級X,2級Y .. - 基於它在文檔中找到的名稱中以Level開頭的控件)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM