【问题标题】:Display custom document property value in Excel 2007 worksheet cell在 Excel 2007 工作表单元格中显示自定义文档属性值
【发布时间】:2009-07-14 09:08:24
【问题描述】:

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

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

【问题讨论】:

    标签: excel-2007 field customproperty


    【解决方案1】:

    不幸的是,我认为您需要使用用户定义的函数。将新的 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 的调用会强制在每次重新计算时更新单元格,确保它能够获取文档属性中的更改。

    【讨论】:

    • 感谢代码!但是,在我的情况下,我必须使用 CustomDocumentProperties() 函数,而不是使用 BuiltinDocumentProperties() 函数。
    • 另请注意,Application.Volatile 不会导致在更改文档属性时重新计算公式,只会在其他单元格更改时重新计算。
    【解决方案2】:

    Excel 中的等价物是通过公式,我认为没有代码就不可能提取文档属性。没有用于挑选文档属性的本机函数。 (另一种方法是将信息存储在工作簿/工作表名称中,可通过公式访问)

    在 VBA 中,您必须创建类似以下的函数:

    Public Function CustomProperty(ByVal prop As String)
    
        CustomProperty = ActiveWorkbook.CustomDocumentProperties(prop)
    
    End Function
    

    然后在公式中使用=CustomProperties("PropertyName") 调用它。

    还有一个微妙的地方。公式依赖只与其他单元格相关;此公式取决于自定义属性。如果您更新自定义属性,涉及CustomProperty 的预先存在的公式将不会自动更新。必须手动重新评估单元格或强制重新计算整个工作簿。您最好的机会是使函数 volatile,这意味着公式将在每次单元格更改时重新计算 - 但这仍然意味着您只有在单元格发生更改时才能获得更新。

    【讨论】:

      【解决方案3】:

      选择要提取的单元格 将单元格重命名为一些有用的名称。从“B1”到“Project_Number”。 打开“高级属性”,单击“自定义”选项卡。输入新属性的名称。单击“链接到内容”,从“值”下拉列表中选择单元格名称。

      我希望我能接受 cerdit,但我在网上找到了答案: http://pdmadmin.com/2012/03/displaying-custom-property-values-in-excel-using-a-named-range/

      【讨论】:

      • 我相信这与问题所问的相反。此解决方案将根据工作簿中的内容设置属性。问题是如何将属性输出为工作簿的内容。但是,如果您需要以这种方式解决问题,这是一个巧妙的技巧。
      【解决方案4】:

      您可以将命名范围链接到自定义属性,但自定义属性会反映 [第一个单元格中的] 范围的值。它实际上是只读的;您可以更改单元格的内容来更新属性,但不能反过来。

      我知道你想避免它,但如果你想在公式中使用属性值,你必须create a custom worksheet function 这样做。

      【讨论】:

        【解决方案5】:

        我遇到过其他人遇到的同样问题。因此,我将尝试全面介绍我是如何解决它的。

        首先,您别无选择,只能编写一个函数来获取您放入自定义或内置属性中的任何内容,并使“问题”单元格以这种方式指向它:

        =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”单元格,我需要为我们自己的外部跟踪目的更新它。

        这一切都不是一夜之间发生的。希望对大家有所帮助。

        【讨论】:

          【解决方案6】:

          我用它来提取 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-01-23
            • 2014-01-15
            • 1970-01-01
            • 1970-01-01
            • 2011-05-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多