Отобразить значение пользовательского свойства документа в ячейке листа Excel 2007
-
13-09-2019 - |
Вопрос
Я создал программу, которая создает и заполняет пользовательское свойство документа в файле рабочей книги Excel 2007.Однако мне не удалось показать значение этого свойства в ячейке рабочего листа.В Word 2007 вы можете просто выбрать "Вставить -> Быстрые части -> Поле ..." и использовать поле DocProperty для отображения значения пользовательского поля в документе.Однако я не нашел аналогичной функции в Excel 2007.
Кто-нибудь знает, как отобразить значение пользовательского свойства документа в ячейке листа Excel?Я бы предпочел решение, подобное решению Word 2007, упомянутому выше.Я предпочитаю не использовать для этого макрос / пользовательский код.
Решение
К сожалению, я считаю, что вам нужно использовать пользовательскую функцию.Добавьте новый модуль 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
заставляет ячейку обновляться при каждом пересчете, гарантируя, что она будет учитывать изменения в свойствах документа.
Другие советы
Эквивалентом в Excel было бы использование формулы, и я не думаю, что возможно извлечь свойство документа без кода.Нет встроенных функций для выбора свойств документа.(Альтернативой может быть хранение информации в именах рабочей книги / листа, которые доступны через формулу)
В VBA вам нужно было бы создать функцию, что-то вроде:
Public Function CustomProperty(ByVal prop As String)
CustomProperty = ActiveWorkbook.CustomDocumentProperties(prop)
End Function
а затем вызовите его в формуле с =CustomProperties("PropertyName")
.
Есть еще один тонкий момент.Зависимости формул относятся только к другим ячейкам;эта формула зависит от пользовательского свойства.Если вы обновите пользовательское свойство, то уже существующая формула, включающая CustomProperty
не будет обновляться автоматически.Ячейку придется повторно вычислить вручную или выполнить повторный расчет всей книги принудительно.Ваш лучший шанс - сделать функцию изменчивой, что означает, что формула будет пересчитываться при каждом изменении ячейки - но это все равно означает, что вы получаете обновление только в том случае, если ячейка была изменена.
Выберите ячейку, которую вы хотите извлечь Переименуйте ячейку в какую-нибудь полезную.От "B1" до "Project_Number".Откройте "Дополнительные свойства", перейдите на вкладку "Пользовательские".Введите имя для нового свойства.нажмите "Ссылка на содержимое" и выберите название ячейки из выпадающего списка "Значение".
Я хотел бы воспользоваться cerdit, но я нашел ответ в Интернете:http://pdmadmin.com/2012/03/displaying-custom-property-values-in-excel-using-a-named-range/
Вы можете связать именованный диапазон с пользовательским свойством, но тогда пользовательское свойство отражает значение диапазона [первая ячейка в].Фактически он доступен только для чтения;вы можете изменить содержимое ячейки, чтобы обновить свойство, но не наоборот.
Я знаю, что вы хотите избежать этого, но если вы хотите использовать значение свойства в формуле, вам придется создайте пользовательскую функцию рабочего листа чтобы сделать это.
Я испытывал те же проблемы, что и другие люди.Поэтому я постараюсь всесторонне рассказать о том, как я решал эту проблему.
Прежде всего, у вас нет другого выбора, кроме как написать функцию, предназначенную для получения всего, что вы помещаете в пользовательское или встроенное свойство, и сделать так, чтобы ячейка "problem" указывала на это таким образом:
=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" значением встроенного свойства "Author", которое мне нужно обновить для наших собственных целей внешнего отслеживания.
Все это произошло не в одночасье.Я надеюсь, что это может быть какой-то помощью.
Я использовал это для извлечения свойств SharePoint (на основе ответа Мартина):
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