是否可以在 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
我正在使用 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