Отображение значения пользовательского свойства документа в ячейке листа Excel 2007 - PullRequest
3 голосов
/ 14 июля 2009

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

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

Ответы [ 6 ]

4 голосов
/ 14 июля 2009

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

3 голосов
/ 14 июля 2009

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

В VBA вам нужно создать что-то вроде:

Public Function CustomProperty(ByVal prop As String)

    CustomProperty = ActiveWorkbook.CustomDocumentProperties(prop)

End Function

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

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

1 голос
/ 05 августа 2012

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

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

0 голосов
/ 27 марта 2018

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

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

=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», которое мне нужно обновить для наших собственных целей внешнего отслеживания.

Все это произошло не за одну ночь. Я надеюсь, что это может помочь.

0 голосов
/ 11 мая 2014

Я использовал это для извлечения свойств 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
0 голосов
/ 14 июля 2009

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

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

...