2013-10-30 48 views
3

我在編寫Access數據庫以從已完成表單導入數據的目標中創建Word .docm(啓用宏的Word 2013文檔)中的表單。我已經放置了textBox和comboBox控件來接收用戶輸入,但是我無法取回數據。從Word文檔表單控件獲取數據

我見過使用Document.FormFields收集像這樣(在Word)的例子:

Dim fld as FormField 
for each fld in ActiveDocument.FormFields 
    Debug.Print fld.Name & " - " & fld.Result.Text 
next 

然而,在我的文檔Document.FormFields是空的,但Document.Fields有19個元素,而這恰好是控制數量以我的形式。這很好,除了我似乎無法使用Field對象獲取任何控件的名稱或值。 Field.Result.Text始終爲空,並且沒有Field.Name屬性。

那麼什麼是Field對象和FormField對象之間的差異,以及爲什麼我的控件沒有顯示在Fields當所有的例子我見過使用FormFields

我使用錯誤的表單控件嗎?有三種類型(我希望我不是唯一認爲這是荒謬的)遺留控件,ActiveX控件和內容控件。我正在使用ActiveX類型。

回答

3

一些東西......

  1. 在MS Word而言,一個「場」並不一定是一個表單字段。例如,自動更新日期,鏈接圖形,頁碼等是所有類型的'字段'(或者至少是直到最新版本的Word)。

  2. 出於兼容性原因,最好避免使用ActiveX控件。例如,Word的Mac版本不支持它們。

  3. 爲了獲得最佳兼容性,我會親自堅持傳統的窗體控件。實例根據書籤名稱命名,可通過右鍵單擊控件並選擇「屬性」來設置。在VBA中,他們的數據通過FormFields集合獲得;如果你想爲一個特定字段的值,使用

    Value = ActiveDocument.FormFields("MyFieldName").Result

+0

謝謝!我假定'Range'是指'Result',它返回'Range'對象。 – jasongetsdown

+1

@jasongetsdown - 'Result'返回一個'String','Range'''Range'對象。由於前者更簡單一些,我已經更新了答案,謝謝。 –

1

如果你想要的是使用你當前的領域,可以從OLEFormat.Object獲得的價值或名稱:

Application.ActiveDocument.Fields.Item(1).OLEFormat.Object.Value 

或者

Application.ActiveDocument.Fields.Item(1).OLEFormat.Object.Name 

不過,我將與克里斯同意recommendin g避免使用ActiveX控件。由於Microsoft says,有很多原因,他們不是Word形式的最佳選擇,除非在特定情況下。

0

使用 「遺產」 formfields和

//key 
Application.ActiveDocument.FormFields(1).Range.Fields(1).Code 
//value 
Application.ActiveDocument.FormFields(1).Result 

是我想出了一個解決方案。

我見過公司也爲不同目的使用書籤,默認值,狀態/幫助文本。不是我會推薦它,但也許他們正在解決我不知道的問題。

我覺得.range是一種破解,但考慮到它只是表單字段的範圍,除非表單字段或字段可以嵌套字段,否則應該沒問題。