Пользователькая панель конфликтует с уже открытым Excel-документом

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Бим
Сообщения: 3
Зарегистрирован: 12 фев 2008, 21:44

Может, кто сталкивался с подобным, как решили такую проблему:

Написал код, который выполняется при открытии файла Excel и создает при этом несколько кнопок пользовательской панели инструментов "Моя панель".
Создается несколько кнопок с привязкой к ним исполняемых ими функций, описанных в одном из модулей, например:

Код: Выделить всё

Set MyBar = Application.CommandBars.Add(Name:="Моя панель", _
Position:=msoBarTop, MenuBar:=False, Temporary:=True)
<далее следует назначение свойств панели MyBar и ее кнопок>
With MyButton(1)
 .Caption = "Автозаполнение |"
 .TooltipText = "Автозаполнение"
 .Style = msoButtonCaption
 .OnAction = "Автозаполнение"
End With
<затем описываются другие кнопки>
Все бы хорошо, но обнаружилось, что если открывать этот файл при каком-либо уже открытом приложении Excel (назовем его Приложение 1), то макросы кнопок (напр. , "Автозаполнение") программой не обнаруживаются, так как приложение его почему-то ищет в том, первом, приложении, а не в своем - появляется сообщение об ошибке: «не найден макрос "Приложение 1.Автозаполнение"».

Я был этим очень удивлен, но делать нечего - ввел обработку (перехват ошибки):

Код: Выделить всё

On Error GoTo ErrorHandler
'----<<Начало блока>>---------
Set MyBar = Application.CommandBars.Add(Name:="Моя панель", _
Position:=msoBarTop, MenuBar:=False, Temporary:=True)
<Назначение свойств панели MyBar и ее кнопок>
‘<...>
Exit Sub
'-----<<Конец блока>>---------
ErrorHandler:
MsgBox "Вероятно, открытие этого файла произошло при каком-то открытом приложении Excel," + _
 " отчего могут быть недоступны некоторые запрограммированные функции." + "РЕКОМЕНДАЦИЯ: закройте все Excel-приложения и запустите этот файл снова."
Но это же непорядок!? Как дополнительно указать, что макрос находится в коде моего файла, а не коде "Приложения 1"?

Но еще больше меня удивило другое. Предположим, уже запущено в памяти приложение Excel, и я запускаю свой файл. Появляется окно MsgBox с моей рекомендацией, что говорит о том, что еще в момент установки пользовательской происходит переход на обработку ошибки, и весь оставшийся фрагмент от точки <<Начало блока>> до <<Конец блока>> не исполняется. Но почему же при этом пользовательская панель с привязкой макросов все же появляется? Ведь на этот фрагмент управление программе алгоритмически не передается!
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

Если панель в Excel уже создана, то после команды On Error GoTo... Ваш блок не выполняется. Попробуй в свойстве .OnAction прописать полный путь к книге и макросу. На 100% поможет, если этот макрос поместить в надстройку.
Бим
Сообщения: 3
Зарегистрирован: 12 фев 2008, 21:44

1. В том-то и странность, что несмотря на то, что согласно программе весь фрагмент кода игнорируется, моя панель инструментов появляетсчя вверху листа, а при нажатии на кнопку идет поиск привязанного к ней макроса. Только безуспешно. :(

2. Пррописал:
.OnAction = "Workbooks(i).Module1.Автозаполнение"

где i = ThisWorkbook.Name

Результат тот же, только сейчас пишет: не найден макрос "Workbooks(i).Module1.Автозаполнение"

Если же я указываю название книги явно - "Билеты", то при прекомпиляции показывает ошибку в этой строке.
Вот такие вот дела. Что скажете?
Бим
Сообщения: 3
Зарегистрирован: 12 фев 2008, 21:44

Перенес макрос в "Эта книга", изменив, конечно, путь к макросу на "Workbooks(i).Автозаполнение"

Фига с два! Тот же резалт.

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

Код: Выделить всё

Sub Печать()
'
     Range("A1:I64").Select
    Range("I64").Activate
    Selection.PrintOut Copies:=1, Collate:=True
    Cells(1, 1).Activate
    Exit Sub

End Sub
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

Попробуй явно указать для твоих макросов:
Public Sub
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

Бим,
Если же я указываю название книги явно - "Билеты", то при прекомпиляции показывает ошибку в этой строке.
Явно - это я имел ввиду, например:

Код: Выделить всё

.OnAction = "'C:\Temp\Билеты.xls'!MacrosName"
Хотя лучше, все же, если не .xls, а .xla.
Ответить