我遇到过其他人遇到的同样问题。因此,我将尝试全面介绍我是如何解决它的。
首先,您别无选择,只能编写一个函数来获取您放入自定义或内置属性中的任何内容,并使“问题”单元格以这种方式指向它:
=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”单元格,我需要为我们自己的外部跟踪目的更新它。
这一切都不是一夜之间发生的。希望对大家有所帮助。