问题
我正在使用Word 2010中的VBA设置文档属性时遇到一些问题。
我有一个包含多个 Heading 1
部分的文档,我使用宏提取所选部分(连同其内容)并将其粘贴到新文档中。
这部分工作正常,但最后我需要设置几个文档属性,但它们都没有被设置。
我尝试设置内置和自定义属性,但为了这个问题,我想设置标题、主题和类别。
我创建了一个函数来设置我想要的属性(如下所示),即使我在函数中删除错误处理,VBA也没有抛出任何错误。
有人知道我做错了什么吗?
函数应该如何工作
这是函数应该做的简要概述,但是如果您发现检查完整函数更容易,下面是完整函数:
- 检查属性是否已经存在
- 它已经存在并且是一个
默认
属性- 设置默认属性
- 将
PropertyTypeUsed
变量设置为默认
- 它已经存在并且是一个
自定义
属性- 设置自定义属性
- 将
PropertyTypeUsed
变量设置为自定义
- 它根本不存在
- 创建一个新的自定义属性
- 设置自定义属性
- 将
PropertyTypeUsed
变量设置为自定义
- 它已经存在并且是一个
- 检查是否成功设置了值
- 应该设置了一个
默认
属性- 属性是否已成功设置?
- 应该设置了一个
自定义
属性- 属性是否已成功设置?
- 应该设置了一个
- 返回结果
我认为引起问题的函数
Function UpdateDocumentProperty(ByRef doc As Document, _
ByVal propertyName As String, _
ByVal propertyValue As Variant, _
Optional ByVal propertyType As Office.MsoDocProperties = 4)
'** Set the result to 'False' by default '*
Dim result As Boolean
result = False
'** A property to hold whether or not the property used is default or custom *'
Dim propertyTypeUsed As String
'** Check to see if the document property already exists *'
If PropertyExists(doc, propertyName) Then ' A default property exists, so use that
doc.BuiltInDocumentProperties(propertyName).value = propertyValue
propertyTypeUsed = "default"
ElseIf PropertyExists(doc, propertyName, "custom") Then ' A custom property exists, so use that
doc.CustomDocumentProperties(propertyName).value = propertyValue
propertyTypeUsed = "custom"
Else ' No property exists, so create a custom property
doc.CustomDocumentProperties.Add _
name:=propertyName, _
LinkToContent:=False, _
Type:=propertyType, _
value:=propertyValue
propertyTypeUsed = "custom"
End If
'** Check whether or not the value has actually been set *'
On Error Resume Next
If propertyTypeUsed = "default" Then
result = (doc.BuiltInDocumentProperties(propertyName).value = propertyValue)
ElseIf propertyTypeUsed = "custom" Then
result = (doc.CustomDocumentProperties(propertyName).value = propertyValue)
End If
On Error GoTo 0
UpdateDocumentProperty = result
End Function
完整的项目代码
该项目的完整代码可以在两个Paste Bins中找到 -
我不确定是否可能获取实际创建表单的代码(除非导出它,但我没有地方放它),但无论如何,它非常简单 -
- 表单-
frmChooseDocument
- 标签-
lblChooseDocument
(您要导出哪个新入职员工文件?) - 下拉列表框-
comChooseDocument
- 取消按钮-
btnCancel
- 确定按钮-
btnOK
(最初为禁用状态)
实际上,我使用包含有关如何使用各种应用程序的详细说明的文档作为新入门者的“主”文档。
代码本身查找文档中格式为Heading 1
的文本,并将其添加到表单中的下拉列表框中,允许用户选择要导出的部分。 然后创建一个新文档并另存为PDF格式。
更新
如评论中建议的那样,我已经检查了设置的值类型是否与传递给函数的值类型匹配,它确实匹配。
在上述所有3个属性的情况下,传递的值和存储在文档中的属性都是string
类型。
我添加了几行代码以输出设置结果的类型和值,一切看起来都很好,但显然并非如此!
Debug.Print "My value: (" & TypeName(propertyValue) & ")" & propertyValue
Debug.Print "Stored property: (" & TypeName(doc.BuiltInDocumentProperties(propertyName).value) & ")" & doc.BuiltInDocumentProperties(propertyName).value
这里是输出 -
My value: (String)New Starter Guide - Novell
Stored property: (String)New Starter Guide - Novell
My value: (String)New starter guide
Stored property: (String)New starter guide
My value: (String)new starters, guide, help
Stored property: (String)new starters, guide, help
false
。根据您的评论,我更新了我的问题,并将非常感谢您进一步的想法。谢谢。 - David GardTrue
的初始值,我实际上检查确保返回的值是True
(这只是我的个人偏好),但这解决了问题。感谢你抽出时间来看一下,如果您愿意发布答案,我会接受它 :) - David Gard