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

StackOverflow https://stackoverflow.com/questions/1124294

Вопрос

Я создал программу, которая создает и заполняет пользовательское свойство документа в файле рабочей книги 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top