Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Редактирование свойств объекта Workbook Добавлено: 17.07.09 10:42  

Автор вопроса:  blacklight
Здравствуйте дамы и господа,

недавно решил заняться VBA и столкнулся с небольшой проблемкой.
Нужно добавить объекту Workbook несколько дополнительных свойств. Может быть кто-то знает как это делается или где почитать как это сделать?

Пока пробовал решить это с помощью объявления переменных и макроса при автозапуске, который предлагал бы их запомнить, но мне не удалось, т.к. а) нужно чтобы эти данные постоянно хранились в WorkBook и б) у каждой книги они должны быть своими (не обязательно разными)...

(Вариант с записью в ячейку при создании новой книги не подходит =)

Заранее спасибо!

С уважением,
blacklight.

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #4
Добавлено: 17.07.09 15:41
Вообще-то можно было и в ячейки на листе записывать, просто книги Excel позволяют включать НЕВИДИМОСТЬ отдельным листам. А чтобы оно повторялось для всех новых документов, надо заменить шаблонную книгу Excel (не помню точно название и расположение), которая используется для основы всех новых документов. Если додумаюсь, как обратиться к свойству книги (которое в Файл - Свойства...), то обязательно напишу. Удачи!

Ответить

Номер ответа: 5
Автор ответа:
 Loner-new_



Вопросов: 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
Автор ответа:
 Loner-new_



Вопросов: 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";) = 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


Аналогично, считывание значения пользовательского свойства производится так (тоже ведь никогда нельзя быть уверенным в том, что свойство существует):

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
Автор ответа:
 Loner-new_



Вопросов: 0
Ответов: 4
 Профиль | | #7 Добавлено: 17.07.09 16:21
Для Экселя, естественно, меняем ActiveDocument на ActiveWorkbook.

PS
Движок форума менятся не будет? Очень напрягает невозможность правки своих же сообщений и проблема с восстановлением пароля.

Ответить

Номер ответа: 8
Автор ответа:
 blacklight



Вопросов: 3
Ответов: 9
 Профиль | | #8 Добавлено: 17.07.09 16:51
Огромное спасибо всем за ответы! очень помогло!

один вопрос:
  1.  
  2. Public abc as String
  3.  
  4. Sub abcd()
  5.  
  6. ActiveWorkbook.CustomDocumentProperties.Add Name:="ABC", LinkToContent:=False, Value:=abc, Type:=msoPropertyTypeString
  7.  
  8. End Sub
  9.  
  10. Sub setabc()
  11.  
  12. abc = InputBox("Введите abc")
  13.  
  14. End Sub
  15.  
  16. Sub showabc()
  17. MsgBox (ActiveWorkbook.CustomDocumentProperties("abc"))
  18. End Sub



Почему-то получаем в конце пустой 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-сайт: cargomaster.at.ua/
 Профиль | | #11
Добавлено: 12.08.09 13:52
blacklight пишет:
, а именно отредактировать сам объект Workbook, чтобы когда кто-то создает новую книгу -> она сразу имеет свойства А и Б, как например, name, codename, author и прочие...
 

а если сам шаблон Normal.dot доработать в плане добавления этих свойств?

Ответить

Номер ответа: 12
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #13
Добавлено: 13.08.09 09:54
Loner-new_, спасибо за информацию, будет полезно знать и где-нибудь пригодится.

Ответить

Номер ответа: 14
Автор ответа:
 blacklight



Вопросов: 3
Ответов: 9
 Профиль | | #14 Добавлено: 14.08.09 10:16
Всем огромное спасибо!
Все работает =)(создал шаблон *.xltm (пришлось делать новый, т.к. в стандартный нельзя зашивать модули с макросами)

С уважением,
blacklight.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам