Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
167 / 2 / 0
Регистрация: 24.04.2012
Сообщений: 9

Не работает Workbooks.Open внутри процедуры Workbook_BeforeSave

31.03.2014, 21:25. Показов 6315. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Помогите, пожалуйста, разобраться.
В общем есть такой код:

Visual Basic
1
2
3
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Workbooks.Open ("Тут путь к какому-нибудь файлу")
End Sub
Это событие, которое возникает при сохранении рабочей книги. Предположим, что обрабатывая его, я открываю нужный мне файлик и с ним чото делаю. Этот код нормально работает, если я сохраняю книгу следующими способами: нажатие значка "Сохранить" на панели инструментов в эксель, при закрытии книги, когда вываливается сообщение "Сохранить изменения или нет" или если я пытаюсь сохранить книгу через "Сохранить как".
Но, если в каком-то модуле у меня написано:

Visual Basic
1
ActiveWorkbook.save
(т.е. сохраняю программно), событие BeforeSave срабатывает, но когда доходит до строки с открытием файла, не выдавая никаких ошибок, он её выполняет и переходит к следующей строке, но файл при этом не открывается. Почему такое происходит, ведь нажатие на значок "Сохранить" по идее это та же самая команда (workbooks.save)?
2
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2014, 21:25
Ответы с готовыми решениями:

Workbooks.Open не открывает файл
Добрый вечер! Подскажите, что делаю не так. Задача: скопировать значение ячейки из одного .xlsm файла в другой. Вот код: ...

Dim XL As New Excel.Application xls.Workbooks.Open FileName не работает
Использую код: Dim XL As New Excel.Application xls.Workbooks.Open FileNameНе работает под Win98. Выдается ошибка 'automation error'....

Недостаточно памяти Workbooks.Open
Программа заменяет значения определенных ячеек Excel на значения из поля Memo. Ошибка "...raised exception class EOleSysError with...

8
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
01.04.2014, 02:10
Попробовал в 2007. Оказалось, что если поместить в книгу такой код, то при нажатие значка "Сохранить" указанная книга открывается, но исходная книга НЕ СОХРАНЯЕТСЯ. То есть как бы происходит Cancel = True.
Еще интереснее получается, если попытаться закрыть книгу после изменения. Закрывается вновь открытая книга, а исходная остается!
Если вызывать сохранение программно, указанная книга действительно не открывается, но исходная книга сохраняется. Такие дела.

С другой стороны, если Вы программно сохраняете книгу, Вы можете перед этим или после этого программно открыть другую.
2
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
01.04.2014, 07:34
Это открытие просто напрашивается в закрепленную тему Профессиональные проблемы, решения, рекомендации и ошибки VBA / VBA.
0
167 / 2 / 0
Регистрация: 24.04.2012
Сообщений: 9
01.04.2014, 08:22  [ТС]
Да, книгу пришлось открывать до программного сохранения и закрывать после. В общем-то вариантов избежать описанную проблему-много, мне было просто интересно, почему такие глюки происходили. Я сначала подумал, что какому-нибудь атрибуту надо значение поставить нужное, перерыл инет- не нашел ничего дельного, потом подумал, что какое-нибудь свойство уровня Application подключить/отключить. Часа 3 убил на серфинг в инете, ничего не нашел. Потом уже написал сюда
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
01.04.2014, 10:19
В Excel 2010 32 bit книга открывается, а текущая - не сохраняется.
0
1261 / 147 / 32
Регистрация: 11.02.2011
Сообщений: 418
01.04.2014, 10:31
Лучший ответ Сообщение было отмечено velya как решение

Решение

И правда забавно. Только в другом экселе получилось открыть через before_save
Visual Basic
1
2
3
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Workbooks.Open ("путь к файлу")
    objExcel.Visible = True
1
167 / 2 / 0
Регистрация: 24.04.2012
Сообщений: 9
01.04.2014, 18:17  [ТС]
ооо, спасибо большое! такой код у меня работает!

Добавлено через 7 часов 32 минуты
Друзья, в продолжении темы с событием Workbook_BeforeSave:

Visual Basic
1
2
3
4
5
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Application.EnableEvents = False
    ThisWorkbook.SaveAs Filename:="путь к файлу"
    Application.EnableEvents = True
End Sub
Можно ли сделать так, чтобы в процессе обработки события Workbook_BeforeSave в нужный мне момент происходило сохранение? Указанный выше код тупо грохает весь эксель.

Зачем мне это нужно? задача у меня стоит большая, всю её нет смысла объяснять, но кусочек, затронутый здесь нужен вот для чего: грубо говоря, я хочу вести "базу" файлов в конкретной папке (с учетом подпапок), т.е. у меня будут айдишки для каждого файла, названия файлов и referenceId (если человек скопировал файл через ctrC-ctrV, переименовал его и внес в него какие-то изменения и сохранил, я соответственно ему сделаю новую запись в "базе" с новым айди и с референсным айди, т.е. я хочу понимать на основании какого файла он сделал копию. Всю эту бадягу я хочу сделать в момент сохранения файла потому, что хочу перехватывать название файла, с которым человек его хочет сохранить. При этом, если он сохраняет файл выбирая ему "плохое" название, я хочу предлагать ему другое и сохранять его. Вот как то так.
Спасибо всем ответившим
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
02.04.2014, 01:05
Цитата Сообщение от velya Посмотреть сообщение
хочу перехватывать название файла, с которым человек его хочет сохранить. При этом, если он сохраняет файл выбирая ему "плохое" название, я хочу предлагать ему другое и сохранять его
Примерно так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
 
Static bGoodWBName As Boolean
Dim s
 
If bGoodWBName Then 'это повторный заход с подтвержденным именем
  bGoodWBName = False
Else
  Cancel = True 'отменить сохранение в этот раз
  s = "c:\temp\goodname.xls" 'для примера
  s = Application.GetSaveAsFilename(s, "Excel Files (*.xls), *.xls,Add-In Files (*.xla), *.xla")
 
  'здесь проверка введенного имени, диалог с юзером
 
  s = "c:\temp\verygoodname.xls" 'для примера
  bGoodWBName = True
  Me.SaveAs s, Me.FileFormat
End If
End Sub
1
167 / 2 / 0
Регистрация: 24.04.2012
Сообщений: 9
02.04.2014, 12:55  [ТС]
Вставил код в книгу, при сохранении путем нажатия на значок "сохранить" все работает, но если сохраняю программно Activeworkbook.save как и в первом посте, строка там где saveas отрабатывает, но файл не сохраняется и никаких ошибок соответственно. Как быть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.04.2014, 12:55
Помогаю со студенческими работами здесь

Method open of object workbooks failed
Пожалуйста, подскажите, где искать ошибку, куда копать? 2 дня назад перестала работать процедура, спотыкается на "workbooks ...

Открытие файла excel Workbooks.Open
Добрый день, друзья! Подскажите пожалуйста один момент. Написал программу, которая исполняется по событию открытия книги: 1....

Не открывается файл через Workbooks.Open('Prepods.xlsx')
Не работает! Пишет, что не верно имя файла или расположение его. procedure TForm1.btn2Click(Sender: TObject); var x:Integer; ...

Ошибка с открытием книги большого размера в Workbooks.Open
Добрый день! Выявилась проблема с открытием книги большого размера: Книга-источник имеет большой размер (15 Мб) и открывается вручную...

Исключение COMException (0x800A03EC) при вызове Workbooks.Open
День добрый, котаны такой трабл, матюкается на строку var objWorkbook = objExcel.Workbooks.Open(_pathSite, false, 5, Missing.Value,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru