Отображение значения свойства пользовательского документа в ячейке листа Excel 2007

Я создал программу, которая создает и заполняет пользовательское свойство документа в файле рабочей книги Excel 2007. Однако мне не удалось показать значение этого свойства в ячейке листа. В Word 2007 вы можете просто выбрать «Вставка -> Быстрые части -> Поле ...» и использовать поле DocProperty, чтобы отобразить значение настраиваемого поля в документе. Однако я не нашел подобной функции в Excel 2007.

Кто-нибудь знает, как отобразить значение пользовательского свойства документа в ячейке листа Excel? Я бы предпочел решение, подобное решению Word 2007, упомянутому выше. Я предпочитаю не использовать для этого макрос/пользовательский код.


person LeonZandman    schedule 14.07.2009    source источник


Ответы (6)


К сожалению, я считаю, что вам нужно использовать пользовательскую функцию. Добавьте новый модуль 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 заставляет ячейку обновляться при каждом перерасчете, гарантируя, что она будет учитывать изменения в свойствах документа.

person Martin Liversage    schedule 14.07.2009
comment
Спасибо за код! Однако в моем случае вместо использования функции BuiltinDocumentProperties() мне пришлось использовать функцию CustomDocumentProperties(). - person LeonZandman; 14.07.2009
comment
Также обратите внимание, что Application.Volatile не вызывает пересчет формулы при изменении свойств документа, а только при изменении других ячеек. - person Joel Goodwin; 14.07.2009

Эквивалент в Excel будет через формулу, и я не думаю, что можно извлечь свойство документа без кода. Нет встроенных функций для выбора свойств документа. (Альтернативой может быть хранение информации в именах рабочих книг/листов, которые доступны по формуле)

В VBA вам нужно будет создать функцию, например:

Public Function CustomProperty(ByVal prop As String)

    CustomProperty = ActiveWorkbook.CustomDocumentProperties(prop)

End Function

а затем вызовите его в формуле с =CustomProperties("PropertyName").

Есть еще один тонкий момент. Зависимости формул относятся только к другим ячейкам; эта формула зависит от пользовательского свойства. Если вы обновите пользовательское свойство, ранее существовавшая формула, включающая CustomProperty, не будет обновляться автоматически. Ячейку придется переоценить вручную или всю книгу принудительно пересчитать. Лучше всего было бы сделать функцию изменчивой, что означает, что формула будет пересчитываться при каждом изменении ячейки, но это по-прежнему означает, что вы получаете обновление только в том случае, если ячейка была изменена.

person Joel Goodwin    schedule 14.07.2009

Выберите ячейку, которую вы хотите извлечь. Переименуйте ячейку в какую-нибудь полезную. От «B1» до «Project_Number». Откройте «Дополнительные свойства», перейдите на вкладку «Пользовательские». Введите имя для нового свойства. нажмите «Ссылка на содержимое», чтобы выбрать имя ячейки из раскрывающегося списка «Значение».

Хотел бы я взять cerdit, но нашел ответ в Интернете: http://pdmadmin.com/2012/03/displaying-custom-property-values-in-excel-using-a-named-range/

person Arlon    schedule 04.08.2012
comment
Я считаю, что это делает обратное тому, что задает вопрос. Это решение установит свойство на основе содержимого книги. Вопрос в том, как вывести свойство как содержимое книги. Но это ловкий трюк, если вам нужно подойти к проблеме таким образом. - person Scott Harwell; 03.11.2015

Вы можете связать именованный диапазон с настраиваемым свойством, но тогда настраиваемое свойство будет отражать значение [первой ячейки в] диапазоне. Он фактически доступен только для чтения; вы можете изменить содержимое ячейки, чтобы обновить свойство, но не наоборот.

Я знаю, что вы хотите этого избежать, но если вы хотите использовать значение свойства в формуле, вам придется создайте для этого собственную функцию рабочего листа.

person Gary McGill    schedule 14.07.2009

Я столкнулся с теми же проблемами, что и другие люди. Поэтому я постараюсь подробно рассказать, как я к этому отнесся.

Прежде всего, у вас нет другого выбора, кроме как написать функцию, предназначенную для получения всего, что вы поместили в пользовательское или встроенное свойство, и заставить «проблемную» ячейку указывать на это следующим образом:

=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

Я использовал это для извлечения свойств 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
person Ricardo Diaz    schedule 11.05.2014