У меня были те же проблемы, что и у других людей. Поэтому я постараюсь всесторонне осветить, как я к ней обратился.
Прежде всего, у вас нет другого выбора, кроме написания функции, предназначенной для получения того, что вы вводите в пользовательское или встроенное свойство, и для того, чтобы «проблемная» ячейка указывала на него следующим образом:
=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» и заполнил его ячейку «A1» значением встроенного свойства «Author», которое мне нужно обновить для наших собственных целей внешнего отслеживания.
Все это произошло не за одну ночь. Я надеюсь, что это может помочь.