我创建了一个程序,用于在 Excel 2007 工作簿文件中创建和填充自定义文档属性。但是,我无法在工作表单元格中显示此属性的值。在 Word 2007 中,您只需选择“插入 -> 快速部件 -> 字段...”并使用 DocProperty 字段来显示文档中自定义字段的值。但是我在 Excel 2007 中没有找到类似的功能。
有人知道如何在 Excel 工作表单元格中显示自定义文档属性的值吗?我更喜欢类似于上面提到的 Word 2007 解决方案的解决方案。我宁愿不为此使用宏/自定义代码。
我创建了一个程序,用于在 Excel 2007 工作簿文件中创建和填充自定义文档属性。但是,我无法在工作表单元格中显示此属性的值。在 Word 2007 中,您只需选择“插入 -> 快速部件 -> 字段...”并使用 DocProperty 字段来显示文档中自定义字段的值。但是我在 Excel 2007 中没有找到类似的功能。
有人知道如何在 Excel 工作表单元格中显示自定义文档属性的值吗?我更喜欢类似于上面提到的 Word 2007 解决方案的解决方案。我宁愿不为此使用宏/自定义代码。
Excel 中的等价物是通过公式,我认为没有代码就不可能提取文档属性。没有用于挑选文档属性的本机函数。(另一种方法是将信息存储在工作簿/工作表名称中,可通过公式访问)
在 VBA 中,您必须创建一个函数,例如:
Public Function CustomProperty(ByVal prop As String)
CustomProperty = ActiveWorkbook.CustomDocumentProperties(prop)
End Function
然后用 . 在公式中调用它=CustomProperties("PropertyName")
。
还有一个微妙的地方。公式依赖只与其他单元格相关;此公式取决于自定义属性。CustomProperty
如果您更新自定义属性,则不会自动更新包含的预先存在的公式。必须手动重新评估单元格,或者强制重新计算整个工作簿。您最好的机会是使函数 volatile,这意味着公式将在每次单元格更改时重新计算 - 但这仍然意味着您只有在单元格已更改时才能获得更新。
不幸的是,我相信您需要使用用户定义的函数。将新的 VBA 模块添加到您的工作簿并添加此功能:
Function DocumentProperty(Property As String)
Application.Volatile
On Error GoTo NoDocumentPropertyDefined
DocumentProperty = ActiveWorkbook.BuiltinDocumentProperties(Property)
Exit Function
NoDocumentPropertyDefined:
DocumentProperty = CVErr(xlErrValue)
End Function
调用Application.Volatile
强制在每次重新计算时更新单元格,以确保它将获取文档属性中的更改。
选择要提取的单元格 将单元格重命名为一些有用的。从“B1”到“Project_Number”。打开“高级属性”,单击“自定义”选项卡。输入新属性的名称。单击“链接到内容”,从“值”下拉列表中选择单元格名称。
我希望我能接受 cerdit,但我在网上找到了答案:http: //pdmadmin.com/2012/03/displaying-custom-property-values-in-excel-using-a-named-range/
您可以将命名范围链接到自定义属性,但自定义属性会反映 [第一个单元格中的] 范围的值。它实际上是只读的;您可以更改单元格的内容以更新属性,但不能反过来。
我知道你想避免它,但如果你想在公式中使用属性值,你必须创建一个自定义工作表函数来这样做。
我遇到过其他人遇到的同样问题。因此,我将尝试全面介绍我是如何解决它的。
首先,除了编写一个函数来获取您放入自定义或内置属性中的任何内容并让“问题”单元格以这种方式指向它之外,您别无选择:
=yourPropertyGettingFunctionName(PropertyName)
PropertyName 是一个字符串,它引用您希望在单元格中显示其值的自定义/内置属性的名称。
该函数可以写成(如前所述):
Public Function StdProp(ByVal sPropName As String) As String
Application.Volatile
StdProp = ActiveWorkbook.BuiltinDocumentProperties(sPropName).Value
End Function
对于内置属性,或作为:
Public Function UsrProp(ByVal sPropName As String) As String
Application.Volatile
On Error GoTo UndefinedProp
UsrProp = ActiveWorkbook.CustomDocumentProperties(sPropName)
GoTo Exit
UndefinedProp:
UsrProp = "n/a"
Exit:
End Function
如前所述,包括 Application.Volatile 将允许半自动单元格内容更新。
但是,这本身就带来了一个问题:每当您打开 Excel 文件时,使用这种关系的所有单元格都会得到更新,并且在您退出文件时,Excel 会询问您是否允许更新它,无论如果您确实对其进行了任何更改,因为 Excel 本身就是这样做的。
在我的开发组中,我们使用 SubVersion 作为版本控制系统。如果您在退出时不小心点击了“更新”,SVN 会注意到它,并且下次您要提交更改时,excel 文件将包含在包中。
所以我决定利用手头的一切来做我需要做的事情,同时避免这种我不想要的自我更新效果。
这意味着将命名范围与属性访问函数结合使用。鉴于我不能指望旧文件能够满足我的新需求,我编写了这个函数:
Private Function RangeAssign(sRange As String, sValue As String) As Integer
Dim rDest As Range
If RangeCheck(sRange) Then
Set rDest = Range(sRange)
Else
Set rDest = Application.InputBox(sMsg + vbCrLf + vbCrLf + _
"Please, select a cell to get" + vbCrLf + _
"the name " + sRange + " assigned", sCopyRight, Type:=8)
rDest.Name = sRange
End If
rDest.Cells(1, 1).NumberFormat = "@"
rDest.Cells(1, 1).Value = sValue
RangeAssign = True
End Function
它允许正确选择目标单元格。当为属性赋值时(比如说“作者”,它恰好是一个内置属性),我还更新了存储在命名范围中的值,并且可以在单元格中写入:
=Author
如果我碰巧定义了一个名为“Author”的范围,并用内置属性“Author”的值填充了它的“A1”单元格,我需要更新它以用于我们自己的外部跟踪目的。
这一切都不是一夜之间发生的。我希望它可以有所帮助。
我用它来提取 SharePoint 属性(基于 Martin 的回答):
Public Function DocumentProperty(Property As String)
Application.Volatile
On Error GoTo NoDocumentPropertyDefined
DocumentProperty = ActiveWorkbook.ContentTypeProperties(Property).Value
Exit Function
NoDocumentPropertyDefined:
DocumentProperty = CVErr(xlErrValue)
End Function