Страница: 1 |
Вопрос: Редактирование свойств объекта Workbook | Добавлено: 17.07.09 10:42 |
Автор вопроса: ![]() |
Здравствуйте дамы и господа,
недавно решил заняться VBA и столкнулся с небольшой проблемкой. Нужно добавить объекту Workbook несколько дополнительных свойств. Может быть кто-то знает как это делается или где почитать как это сделать? Пока пробовал решить это с помощью объявления переменных и макроса при автозапуске, который предлагал бы их запомнить, но мне не удалось, т.к. а) нужно чтобы эти данные постоянно хранились в WorkBook и б) у каждой книги они должны быть своими (не обязательно разными)... (Вариант с записью в ячейку при создании новой книги не подходит =) Заранее спасибо! С уважением, blacklight. |
Ответы | Всего ответов: 14 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 17.07.09 11:58 |
Для чего все это нужно?
Без записи в ячейку, хм.. Запись в поля свойств книги подойдет? Это те самые, что можно рассмотреть и отредактировать путем выбора меню Файл - Свойства... К сожалению, макрорекордер в Office 2003 не пишет изменение свойств книги, но эти свойства сохраняются в ней - факт, там можно создать и свои собственные поля свойств. Остается только найти, как работать с свойствами книги с помощью Объектной модели Excel. |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 17.07.09 12:38 |
Дам тут вроде две, от силы - три ![]() В 2007 офисе есть какая-то хрень с XML, я точно не разбирался. Свойства Workbook.Xml...blablabla. Почитай в нете про них. ![]() |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 9 |
Профиль | Цитата | #3 | Добавлено: 17.07.09 12:41 |
Спасибо!
Это нужно для расчета. (оно часто используется поэтому хотелось бы автоматизироваь процесс. для каждой книги оно вводится 1 раз и больше не меняется) осталось 2 маленьких вопросика: 1) как сделать так чтобы это свойство появлялось каждый раз, когда создают новую книгу и 2) как к нему обратиться... ![]() Например если назвать свойство abc, то Msgbox (Activeworkbook.abc) Почемуто ничего не выдает... С уважением, blacklight |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 17.07.09 15:41 |
Вообще-то можно было и в ячейки на листе записывать, просто книги Excel позволяют включать НЕВИДИМОСТЬ отдельным листам. А чтобы оно повторялось для всех новых документов, надо заменить шаблонную книгу Excel (не помню точно название и расположение), которая используется для основы всех новых документов. Если додумаюсь, как обратиться к свойству книги (которое в Файл - Свойства...), то обязательно напишу. Удачи! |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 4 |
Профиль | Цитата | #5 | Добавлено: 17.07.09 16:15 |
Можно создать пользовательские свойства документа.
Добавить нужное свойство можно, использовав метод Add: ActiveWorkbook.CustomDocumentProperties.Add _
Name:=PropertyName, _ LinkToContent:=False, _ Value:="", _ Type:=msoPropertyTypeString Name:=PropertyName - имя свойства, может быть сроковым выражением или переменной. LinkToContent:=False, булево значение, определяющее связь с элементами контейнера в самом документе. Используя False, будет создано статическое свойство, именно оно и интересно. Если установить в True, то надо дополнительно определить LinkSource, указывающий на соответствующий объект документа. Value:="", собственно значение, необязательный параметр. Type:=msoPropertyType, тип свойства. Определены следующие константы типов (в скобках приведены числовые значения констант, тип Long): msoPropertyTypeBoolean (2), msoPropertyTypeDate (3), msoPropertyTypeFloat (5), msoPropertyTypeNumber (1), Чем по сути различаются два последних типа - не совсем ясно, по крайней мере оба они способны хранить double число; msoPropertyTypeString (4). Обязательными элементами являются имя, тип и LinkToContent, значение можно не задавать. Для считывания некоторого свойства просто пишем: varProperty = ActiveWorkbook.CustomDocumentProperties.Item(Name)
где Name - имя свойства или номер в коллекции. PS не смог восстановить пароль, а старый забыл. ![]() |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 4 |
Профиль | Цитата | #6 | Добавлено: 17.07.09 16:18 |
Все было бы так просто, если бы не одна маленькая неприятность, которая заключается в том, что нет возможности прямо проверить, создано ли уже свойство с некоторым именем, а обращение к пустому свойству или попытка создания свойства с именем, совпадающим с именем уже определенного, вызывает ошибку (коды соответственно 5 и -2147467259 - не удивляйтесь, а распечатайте err.number!). Но такое поведение можно с легкостью использовать, написав свой обработчик ошибок.
Итак, необходимо присвоить пользовательскому свойству Test значение переменной strString, при этом не известно, существует ли в данный момент пользовательское свойство (даже если вы его уже когда-то определили, то ведь пользователь мог его удалить, значит такая ситуация является общей, а не частной). Вот фрагмент кода для решения такой задачи. Dim strString as String
strString = "тестовое значение пользовательского свойства Test" On Error GoTo AddCustomProperty' устанавливаем обработчик ошибок ActiveDocument.CustomDocumentProperties.Item("Test" ![]() On Error GoTo 0' или туда, куда он был установлен ранее Exit Sub ' ОБРАБОТЧИК(И) ОШИБОК AddCustomProperty: Select Case Err.Number Case 5 ' Этот номер ошибки возникает, если пытаемся писать ' в свойство, которое пока не создано ActiveDocument.CustomDocumentProperties.Add _ Name:=PropName, LinkToContent:=False, Value:="", Type:=msoPropertyTypeString Resume ' возвращаем управление в оператор присвоения значения Case Else ' Вывод сообщений о других ошибках и прерывание программы MsgBox(Err.Number & Chr(13) & Chr(13) & Err.Description) Exit Sub End Sub Аналогично, считывание значения пользовательского свойства производится так (тоже ведь никогда нельзя быть уверенным в том, что свойство существует): Dim varProperty as Variant' Явное указание типа Variant
On Error GoTo ReadCustomProperty' устанавливаем обработчик ошибок strString = ActiveDocument.CustomDocumentProperties.Item("Test" ![]() On Error GoTo 0' или туда, куда он был установлен ранее ...... Exit Sub ' ОБРАБОТЧИК(И) ОШИБОК ReadCustomProperty: Select Case Err.Number Case 5 ' Этот номер ошибки возникает, если пытаемся читать ' свойство, которое пока не создано varProperty = "" ' или "Null" или "NoProperty" - как нравится Resume Next' возвращаем управление следующему оператору ' кстати, вместо возврата строки можно и свойство создать... Case Else ' Вывод сообщений о других ошибках и прерывание программы MsgBox(Err.Number & Chr(13) & Chr(13) & Err.Description) Exit Sub End Sub Примеры взяты с сайта "Первые шаги". |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 4 |
Профиль | Цитата | #7 | Добавлено: 17.07.09 16:21 |
Для Экселя, естественно, меняем ActiveDocument на ActiveWorkbook.
PS Движок форума менятся не будет? Очень напрягает невозможность правки своих же сообщений и проблема с восстановлением пароля. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 9 |
Профиль | Цитата | #8 | Добавлено: 17.07.09 16:51 |
Огромное спасибо всем за ответы! очень помогло!
один вопрос:
Почему-то получаем в конце пустой MsgBox... может кто-то знает в чем проблема... ![]() 2mc-black: по-моему в данном случае решение несколько проще и удобнее, чем через дополнительный скрытый лист... хотя все равно спасибо за совет ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 9 |
Профиль | Цитата | #9 | Добавлено: 17.07.09 17:45 |
Все поправил! Всем огромное спасибо!
Отдельное спасибо Loner-new_ С уважением, blacklight |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 9 |
Профиль | Цитата | #10 | Добавлено: 12.08.09 12:21 |
Господа, все-таки пришлось вернуться к вопросу о дополнительных свойствах книги...
Вопрос такой, как сделать так, чтобы книга создавалась уже дополнительными свойствами? То есть не проверять при открытии есть ли свойство, если ошибка -> создать свойства , а именно отредактировать сам объект Workbook, чтобы когда кто-то создает новую книгу -> она сразу имеет свойства А и Б, как например, name, codename, author и прочие... Спасибо! С уважением, blacklight. |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 4 Ответов: 457 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 12.08.09 13:52 |
blacklight пишет:
, а именно отредактировать сам объект Workbook, чтобы когда кто-то создает новую книгу -> она сразу имеет свойства А и Б, как например, name, codename, author и прочие... а если сам шаблон Normal.dot доработать в плане добавления этих свойств? |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 13.08.09 09:41 |
Дмитрий Юпатов, согласен, только не Normal.dot, а шаблон пустой книги Excel, "Excel11.xlb" для MS Office 2003 / Excel 2003. |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 13.08.09 09:54 |
Loner-new_, спасибо за информацию, будет полезно знать и где-нибудь пригодится. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 9 |
Профиль | Цитата | #14 | Добавлено: 14.08.09 10:16 |
Всем огромное спасибо!
Все работает ![]() С уважением, blacklight. |
Страница: 1 |
|