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