使用Excel VBA从Word文档中提取Content Control属性

时间:2018-01-10 11:45:04

标签: excel vba excel-vba ms-word

我的问题与此帖Extracting the Company property from a Word document using Excel VBA

有些相似

我希望提取内容控件属性,而不是MSWord的BuiltinDocumentProperties。

我是VBA的新手,任何可以从MS Word文档中提取内容控制属性的代码片段对我都有很大的帮助。

提前致谢!

1 个答案:

答案 0 :(得分:1)

作为首发:考虑有大量的ContentControl Properties(Word),因此在您的问题中更具体,这将有所帮助,并且肯定会尝试对其进行编码。

此处给出的列表ContentControl Properties (Word)概述了不同的属性,并指出了读写状态。我不会发布链接摘要,但会指出,它会以更清晰的方式详细说明您在对象浏览器中可以看到的内容。

这个article给出了每种类型的一般描述和限制。它更能描述控件的实际用法,并可能有助于您完善代码。

Top rows of document

您可以将控件作为集合循环。我已经写了这个用于在Word中实现;您提供的链接将向您展示如何在引用Word的Excel中实现此功能。

Public Sub test()

Dim ContentControl As ContentControl

For Each ContentControl In ThisDocument.ContentControls

   Debug.Print ContentControl.Type

Next ContentControl

End Sub

您可以在检查存在的类型(如上所述)之后编写一些代码,然后将属性(如果适用)写出到文本文件或工作表。

探索这个问题的最佳方法可能是打开对象浏览器并针对每个类成员读取相关信息,并在其上下文中编写代码。

Object browser

如果您想以与您提供的链接相同的方式访问控件,请查看可用的WdContentControlType Enumeration

Enumerations

以下是一个检索项目的简单示例(通过linkAstrid中的@DavidZemens调整代码。为您提供有关如何从Excel访问的10个启动器。请注意这是定制的到一个特定的枚举(8wdContentControlCheckBox),它返回一个布尔值;这就是为什么更好地理解你的目标并看到你的尝试会有所帮助。

Option Explicit

Public cc As Object

Public Sub Testing()

  Dim PropVal As Boolean
  Const wdContentControlCheckBox As Long = 8

  PropVal = ReadProp(wdContentControlCheckBox, "C:\Users\User\Desktop\Test.docm")

  MsgBox PropVal

End Sub

Function ReadProp(ByVal sPropName As Long, ByVal FileName As String) As Boolean

    Dim wdApp As Object 'Word.Application
    Dim doc As Object 'Word.Document

    Set wdApp = CreateObject("Word.Application")
    Set doc = wdApp.Documents.Open(FileName, ReadOnly:=True)

    Dim bCustom As Boolean
    Dim sValue As String

    On Error GoTo ErrHandlerReadProp
  'Try the built-in properties first
  'An error will occur if the property doesn't exist
    sValue = doc.BuiltinDocumentProperties(sPropName).Value
    ReadProp = CBool(sValue)

Exit Function

ContinueCustom:
  bCustom = True

Custom:
  sValue = doc.CustomDocumentProperties(sPropName).Value
  ReadProp = CBool(sValue)
  Exit Function

ErrHandlerReadProp:
  Err.Clear
  'The boolean bCustom has the value False, if this is the first
  'time that the errorhandler is runned
  If Not bCustom Then
    'Continue to see if the property is a custom documentproperty
    Resume ContinueCustom
  Else
    'The property wasn't found, return an empty string
   ' ReadProp = "" ''Commented out by QHarr
    Msgbox "Property not found"
    Exit Function
  End If

End Function