是否可以在 MacOS 上的 VBA Word 2016 中读写内容类型属性?

Is it possible to read and write Content Type Properties in VBA Word 2016 on MacOS?

我正在使用 Word dotm 文件作为 SharePoint 内容类型的模板。该文字模板包含一个表单,由 Document_New() 事件中的语句打开。该表单上的组合框包含内容类型 属性 的值。 VBA 用于通过 Document.ContentTypeProperties:

设置组合框文本值
Me.cmbComboBox.Text = ThisDocument.ContentTypeProperties("NameOfContentTypeProperty")

这适用于 Windows 上的 Word 2016。但在 MacOS 上的 Word 2016 中,此调用会导致以下错误:

Run-time error 5948 This command is not available on this platform.

看来这个属性的Document对象在MacOS上不可用。

有谁知道如何在 MacOS 上的 VBA Word 2016 中读写这些内容类型属性?

如果 Mac 的命令不存在,您可能必须使用 AppleScript。不幸的是,我无法在 AppleScript 方面为您提供帮助,而且我无法从 MS 找到任何关于 Mac.

上可用或不可用的文档

这是一个编译器指令,允许您在 Mac 或 PC 上 运行 不同的代码。

'Test the conditional compiler constant #Mac
#If Mac Then
'I am a Mac
    Me.cmbComboBox.Text = AppleScriptTask ("MyAppleScriptFile.applescript", "myapplescripthandler", "my parameter string") 
#Else
'I am Windows
    Me.cmbComboBox.Text = ThisDocument.ContentTypeProperties("NameOfContentTypeProperty")
#End If

我通过使用以下函数编辑文档的 XML 来设法读取和写入内容类型属性。这适用于 Mac 和 PC。

Function getContentTypeProperty(strElementName As String, docDocument As Word.Document) As String

    Dim xmlNode As CustomXMLNode
    Dim xmlPart As CustomXMLPart

    Set xmlPart = docDocument.CustomXMLParts.SelectByNamespace("http://schemas.microsoft.com/office/2006/metadata/properties").Item(1)

    Set xmlNode = xmlPart.SelectSingleNode("/ns0:properties/documentManagement/ns3:" & strElementName)

    If xmlNode Is Nothing Then
        getContentTypeProperty = ""
    Else
        getContentTypeProperty = xmlNode.Text
    End If

End Function

Function setContentTypeProperty(strElementName As String, docDocument As Word.Document, strValue As String) As Boolean

    Dim xmlNode As CustomXMLNode
    Dim xmlPart As CustomXMLPart

    Set xmlPart = docDocument.CustomXMLParts.SelectByNamespace("http://schemas.microsoft.com/office/2006/metadata/properties").Item(1)

    Set xmlNode = xmlPart.SelectSingleNode("/ns0:properties/documentManagement/ns3:" & strElementName)

    If xmlNode Is Nothing Then
        setContentTypeProperty = False
    Else
        If getAttributeValueByName(xmlNode.Attributes, "nil") = "true" Then setAttributeValueByName xmlNode.Attributes, "nil", "false"
        xmlNode.Text = strValue
        setContentTypeProperty = True
    End If

End Function

Function getAttributeValueByName(xmlAttributes As CustomXMLNodes, strAttributeName As String) As String

    Dim xmlAttribute As CustomXMLNode
    Dim strValue As String

    For Each xmlAttribute In xmlAttributes  
        If xmlAttribute.BaseName = strAttributeName Then strValue = xmlAttribute.NodeValue
    Next

    getAttributeValueByName = strValue

End Function