我创建了一个程序,用于在Excel 2007工作簿文件中创建和填充自定义文档属性。但是,我无法在工作表单元格中显示此属性的值。在Word 2007中,您只需选择“插入 - >快速部件 - >字段...”,然后使用DocProperty字段显示文档中自定义字段的值。但是我在Excel 2007中没有找到类似的功能。
有人知道如何在Excel工作表单元格中显示自定义文档属性的值吗?我更喜欢类似于上面提到的Word 2007解决方案的解决方案。我宁愿不使用宏/自定义代码。
答案 0 :(得分:4)
不幸的是我认为你需要使用用户定义的函数。将新的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
的调用强制在每次重新计算时更新单元格,确保它将获取文档属性中的更改。
答案 1 :(得分:3)
Excel中的等价物将通过公式,我不认为可以在没有代码的情况下提取文档属性。没有本机函数可以选择文档属性。 (另一种方法是将信息存储在工作簿/工作表名称中,可通过公式访问)
在VBA中,你必须创建一个类似于:
的函数Public Function CustomProperty(ByVal prop As String)
CustomProperty = ActiveWorkbook.CustomDocumentProperties(prop)
End Function
然后使用=CustomProperties("PropertyName")
在公式中调用它。
还有另一个微妙的观点。公式依赖性仅与其他单元格相关;此公式取决于自定义属性。如果您更新自定义属性,则不会自动更新涉及CustomProperty
的预先存在的公式。必须手动重新评估单元格,或者强制整个工作簿通过重新计算。你最好的机会是使函数变为volatile,这意味着每个单元格更改都会重新计算公式 - 但这仍然意味着只有在单元格被更改时才会获得更新。
答案 2 :(得分:1)
选择要提取的单元格 将单元格重命名为有用的单元格。从“B1”到“Project_Number”。 打开“高级属性”,单击“自定义”选项卡。输入新属性的名称。单击“链接到内容”,从“值”下拉列表中选择单元名称。
我希望我能接受cerdit,但我在网上找到答案: http://pdmadmin.com/2012/03/displaying-custom-property-values-in-excel-using-a-named-range/
答案 3 :(得分:0)
您可以将命名范围链接到自定义属性,但自定义属性会反映[范围]中[第一个单元格]的值。它实际上是只读的;您可以更改单元格的内容以更新属性,但不能相反。
我知道您要避免使用它,但如果您想在公式中使用属性值,则必须create a custom worksheet function这样做。
答案 4 :(得分:0)
我遇到过其他人的同样问题。因此,我将尽力全面介绍我如何解决它。
首先,你没有其他选择,只能编写一个函数来获取你在自定义或内置属性中放置的任何内容,并使“问题”单元格以这种方式指向它:
=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文件将包含在包中。
所以我决定用手头的所有东西来做我需要的任何事情,同时避免我不想要的这种自我更新效果。
这意味着将命名范围与属性访问函数/ s结合使用。 鉴于我不能指望旧文件可以满足我的新需求,我写了这个函数:
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”的范围,并用“内置”属性“作者”的值填充其“A1”单元格,我需要为我们自己的外部跟踪目的更新。
这一切都不是一夜之间发生的。我希望它可以提供一些帮助。
答案 5 :(得分:-1)
我用它来提取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