Страница: 1 |
Страница: 1 |
Вопрос: Редактирование свойств объекта Workbook
Добавлено: 17.07.09 10:42
Автор вопроса: blacklight
Здравствуйте дамы и господа,
недавно решил заняться VBA и столкнулся с небольшой проблемкой.
Нужно добавить объекту Workbook несколько дополнительных свойств. Может быть кто-то знает как это делается или где почитать как это сделать?
Пока пробовал решить это с помощью объявления переменных и макроса при автозапуске, который предлагал бы их запомнить, но мне не удалось, т.к. а) нужно чтобы эти данные постоянно хранились в WorkBook и б) у каждой книги они должны быть своими (не обязательно разными)...
(Вариант с записью в ячейку при создании новой книги не подходит =)
Заранее спасибо!
С уважением,
blacklight.
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #1
Добавлено: 17.07.09 11:58
Для чего все это нужно?
Без записи в ячейку, хм.. Запись в поля свойств книги подойдет?
Это те самые, что можно рассмотреть и отредактировать путем выбора меню Файл - Свойства... К сожалению, макрорекордер в Office 2003 не пишет изменение свойств книги, но эти свойства сохраняются в ней - факт, там можно создать и свои собственные поля свойств. Остается только найти, как работать с свойствами книги с помощью Объектной модели Excel.
Номер ответа: 2
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #2
Добавлено: 17.07.09 12:38
Дам тут вроде две, от силы - три )))
В 2007 офисе есть какая-то хрень с XML, я точно не разбирался. Свойства Workbook.Xml...blablabla. Почитай в нете про них. ))
Номер ответа: 3
Автор ответа:
blacklight
Вопросов: 3
Ответов: 9
Профиль | | #3
Добавлено: 17.07.09 12:41
Спасибо!
Это нужно для расчета. (оно часто используется поэтому хотелось бы автоматизироваь процесс. для каждой книги оно вводится 1 раз и больше не меняется)
осталось 2 маленьких вопросика:
1) как сделать так чтобы это свойство появлялось каждый раз, когда создают новую книгу и
2) как к нему обратиться...
Например если назвать свойство abc, то
Msgbox (Activeworkbook.abc)
Почемуто ничего не выдает...
С уважением,
blacklight
Номер ответа: 4
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #4
Добавлено: 17.07.09 15:41
Вообще-то можно было и в ячейки на листе записывать, просто книги Excel позволяют включать НЕВИДИМОСТЬ отдельным листам. А чтобы оно повторялось для всех новых документов, надо заменить шаблонную книгу Excel (не помню точно название и расположение), которая используется для основы всех новых документов. Если додумаюсь, как обратиться к свойству книги (которое в Файл - Свойства...), то обязательно напишу. Удачи!
Номер ответа: 5
Автор ответа:
Loner-new_
Вопросов: 0
Ответов: 4
Профиль | | #5
Добавлено: 17.07.09 16:15
Можно создать пользовательские свойства документа.
Добавить нужное свойство можно, использовав метод 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, значение можно не задавать.
Для считывания некоторого свойства просто пишем:
где Name - имя свойства или номер в коллекции.
PS не смог восстановить пароль, а старый забыл. пришлось заново региться
Номер ответа: 6
Автор ответа:
Loner-new_
Вопросов: 0
Ответов: 4
Профиль | | #6
Добавлено: 17.07.09 16:18
Все было бы так просто, если бы не одна маленькая неприятность, которая заключается в том, что нет возможности прямо проверить, создано ли уже свойство с некоторым именем, а обращение к пустому свойству или попытка создания свойства с именем, совпадающим с именем уже определенного, вызывает ошибку (коды соответственно 5 и -2147467259 - не удивляйтесь, а распечатайте err.number!). Но такое поведение можно с легкостью использовать, написав свой обработчик ошибок.
Итак, необходимо присвоить пользовательскому свойству Test значение переменной strString, при этом не известно, существует ли в данный момент пользовательское свойство (даже если вы его уже когда-то определили, то ведь пользователь мог его удалить, значит такая ситуация является общей, а не частной). Вот фрагмент кода для решения такой задачи.
strString = "тестовое значение пользовательского свойства Test"
On Error GoTo AddCustomProperty' устанавливаем обработчик ошибок
ActiveDocument.CustomDocumentProperties.Item("Test" = strString
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
Аналогично, считывание значения пользовательского свойства производится так (тоже ведь никогда нельзя быть уверенным в том, что свойство существует):
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
Автор ответа:
Loner-new_
Вопросов: 0
Ответов: 4
Профиль | | #7
Добавлено: 17.07.09 16:21
Для Экселя, естественно, меняем ActiveDocument на ActiveWorkbook.
PS
Движок форума менятся не будет? Очень напрягает невозможность правки своих же сообщений и проблема с восстановлением пароля.
Номер ответа: 8
Автор ответа:
blacklight
Вопросов: 3
Ответов: 9
Профиль | | #8
Добавлено: 17.07.09 16:51
Огромное спасибо всем за ответы! очень помогло!
один вопрос:
Почему-то получаем в конце пустой MsgBox... может кто-то знает в чем проблема...
2mc-black: по-моему в данном случае решение несколько проще и удобнее, чем через дополнительный скрытый лист... хотя все равно спасибо за совет
Номер ответа: 9
Автор ответа:
blacklight
Вопросов: 3
Ответов: 9
Профиль | | #9
Добавлено: 17.07.09 17:45
Все поправил! Всем огромное спасибо!
Отдельное спасибо Loner-new_
С уважением,
blacklight
Номер ответа: 10
Автор ответа:
blacklight
Вопросов: 3
Ответов: 9
Профиль | | #10
Добавлено: 12.08.09 12:21
Господа, все-таки пришлось вернуться к вопросу о дополнительных свойствах книги...
Вопрос такой, как сделать так, чтобы книга создавалась уже дополнительными свойствами?
То есть не проверять при открытии есть ли свойство, если ошибка -> создать свойства
, а именно отредактировать сам объект Workbook, чтобы когда кто-то создает новую книгу -> она сразу имеет свойства А и Б, как например, name, codename, author и прочие...
Спасибо!
С уважением,
blacklight.
Номер ответа: 11
Автор ответа:
Дмитрий Юпатов
Вопросов: 4
Ответов: 457
Web-сайт:
Профиль | | #11
Добавлено: 12.08.09 13:52
, а именно отредактировать сам объект Workbook, чтобы когда кто-то создает новую книгу -> она сразу имеет свойства А и Б, как например, name, codename, author и прочие...
а если сам шаблон Normal.dot доработать в плане добавления этих свойств?
Номер ответа: 12
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #12
Добавлено: 13.08.09 09:41
Дмитрий Юпатов, согласен, только не Normal.dot, а шаблон пустой книги Excel, "Excel11.xlb" для MS Office 2003 / Excel 2003.
Номер ответа: 13
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #13
Добавлено: 13.08.09 09:54
Loner-new_, спасибо за информацию, будет полезно знать и где-нибудь пригодится.
Номер ответа: 14
Автор ответа:
blacklight
Вопросов: 3
Ответов: 9
Профиль | | #14
Добавлено: 14.08.09 10:16
Всем огромное спасибо!
Все работает (создал шаблон *.xltm (пришлось делать новый, т.к. в стандартный нельзя зашивать модули с макросами)
С уважением,
blacklight.