проблема с открытием файла в before_save при обращении из userform

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

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

district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Уважаемые! Буду признателен за помощь. Речь об excel.

UserForm1 содержит код
Unload me
thisworkbook.save

В процедуре before_save прописан код открытия некоего файла

Проблема: файл этот не открывается. Причем никаких сообщений при его открытии системой не выдается - просто проскальзывает дальше. Без формы все нормально и он открывается без проблем. Не могу никак выяснить в чем загвоздка.
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте district.
обычно люди перед выходом из дома закрывают воду, выключают свет,.. выполняют доступные действия.
Unload me - по аналогии это "выход из дома", и выйдя на улицу Вы хотите выключить свет. :(
Евгений.
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Здравствуйте Евгений.

Спасибо за ответ, но пока проблему не решил. Поставил unload me в конец кода - разницы нет: файл не хочет открываться и при попытке открытия ни на что не жалуется. Собственно реальная задача чуть сложнее выглядит:

UserForm2 содержит код:
userform2.hide
userform3.show
unload me

userform3 содержит код:
userform3.hide
thisworkbook.save
unload me

Процедура beforesave содержит ссылку на внутреннюю (в этом же файле) процедуру:
procedure_a

Procedure_a содержит код:
With Workbooks.Open(Filename:=XXX, UpdateLinks:=0, ReadOnly:=True)
End With

Здесь-то у меня засада и возникает: код открывающий файл при любых других обстоятельствах почему-то в заданных сбоит: файл не открывается и при этом никаких предупреждений не выдается (проверил отсутствие всевозможных on error resume next). Такое ощущение, что он открывается где-то в параллельной вселенной. Есть еще какие подозрения почему так?
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

А попробуйте запускать форму в немодальном режиме
(типа Userform1.Show 0)
Вдруг поможет...
Макросы для Excel, Word, CorelDRAW. Быстро, профессионально, недорого. http://ExcelVBA.ru/

Благодарности принимаются на кошелёк WebMoney: R318574877619 и Яндекс.Деньги: 41001335672216
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Сделал немодальный режим для обоих userform. К сожалению вновь мимо - файл не открывается и все тут.
nilem
Сообщения: 112
Зарегистрирован: 14 ноя 2008, 01:59
Откуда: Уфа

А если напрямую вызывать процедуру:
userform3 содержит код:
userform3.hide
thisworkbook.save
Call Module1.Procedure_a
unload me
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Спасибо, Nilem. Уточню: вы хотели сказать что в beforesave (которая и содержит procedure_a, которая в свою очередь содержит код открытия файла) procedure_a нужно вызывать кодом "Call Module1.Procedure_a" ? И сразу второй вопрос ибо с командой call не знаком - как-то обходился до сих пор: правильный код будет "Call Module(здесь номер модуля содержащего procedure_a).Procedure_a"?
nilem
Сообщения: 112
Зарегистрирован: 14 ноя 2008, 01:59
Откуда: Уфа

Да, Call - ключевое слово, которое передает управление вызываемой процедуре. И, да, Module1 (2,3,...) - это имя модуля, в котором находится вызываемая процедура. Слово Call можно опустить, просто Module1.Procedure_a - тоже сработает. После работы вызываемой процедуры, управление передается оператору, следующему за строкой Call Module1.Procedure_a
Только поместить это надо в проц-ру закрытия userform3, я так думаю.
Если не поможет - выкладывайте файл, возможно дело не в порядке следования процедур.
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Nilem, поясните еще одну деталь. "Procedure_a" я вызывал следующим кодом: "application.run "procedure_a". Ибо вызываемая процедура у меня относится к скрытым в списке макросов (Private Sub procedure_a ()). Видимо по этой причине использование call не проходит: "Method or data member not found". Если так, то как в таком случае правильно использовать call?
nilem
Сообщения: 112
Зарегистрирован: 14 ноя 2008, 01:59
Откуда: Уфа

Ну да, если процедура со статусом Private (область видимости - модуль, в котором она находится), то используем метод Run, типа
Run "procedure_a"
Но лучше уберите Private (т.е. сделайте процедуру Public - доступной для всех модулей) и тогда можно так
Call Module1.procedure_a
Если процедура с названием procedure_a только одна во всем проекте, Module1 можно не указывать.
Ответить