在Excel 2007工作表单元格中显示自定义文档属性值

时间:2009-07-14 09:08:24

标签: excel-2007 field customproperty

我创建了一个程序,用于在Excel 2007工作簿文件中创建和填充自定义文档属性。但是,我无法在工作表单元格中显示此属性的值。在Word 2007中,您只需选择“插入 - >快速部件 - >字段...”,然后使用DocProperty字段显示文档中自定义字段的值。但是我在Excel 2007中没有找到类似的功能。

有人知道如何在Excel工作表单元格中显示自定义文档属性的值吗?我更喜欢类似于上面提到的Word 2007解决方案的解决方案。我宁愿不使用宏/自定义代码。

6 个答案:

答案 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
相关问题