21 / 19 / 12 Регистрация: 03.11.2013 Сообщений: 866 |
|
1 |
|
Эксель. Сохранение документа автоматически (без появления диалога)18.12.2013, 18:39. Показов 3716. Ответов 3
Как добиться сохранения экселевского файла, без открытия диалога?
1 |
HyperZen 498 / 251 / 56 Регистрация: 16.06.2011 Сообщений: 904 |
||||||||
19.12.2013, 11:23 |
2 |
|||||||
Сохранить excel файл Добавлено через 4 часа 31 минуту
достаточно выполнить:
2 |
Алекcей 530 / 467 / 183 Регистрация: 11.12.2013 Сообщений: 2,459 |
||||
19.12.2013, 15:53 |
3 |
|||
можно еще добавить
это для того, чтобы файл перезаписывался без вопросов
1 |
Vologd 21 / 19 / 12 Регистрация: 03.11.2013 Сообщений: 866 |
||||
25.12.2013, 00:50 [ТС] |
4 |
|||
этих двух строчек достаточно. Работает.
0 |
Как сделать так что бы после того как я ввёл изменения в экселевский файл программа не спрашивала «сохранить изменения или нет». Мне нужно чтобы изменения НЕ сохранялись
0xdb
51.3k194 золотых знака56 серебряных знаков232 бронзовых знака
задан 30 мар 2013 в 18:20
Никола КривошеяНикола Кривошея
1,4673 золотых знака32 серебряных знака69 бронзовых знаков
2
exelapp.workbooks[1].Close(SaveChanges:=False);
ответ дан 1 апр 2013 в 12:02
Содержание
- Delphi excel сохранить файл без подтверждения
- Delphi сохранение в excel
- Вы здесь
- Работа с Excel из Delphi. Часть 1
Delphi excel сохранить файл без подтверждения
Подскажите плиз, как закрыть екселевское приложение без запроса на сохранение, пробовал
xls.quit;
xls.quit(2); — По аналогии с WORD — ругается, неизветсный параметр
← →
Scorpio © ( 2005-12-16 15:07 ) [1]
Мастера подскажите как мне всетаки закрыть ексель без сохранения, а то мозги уже кипят.
← →
Zz_ ( 2005-12-16 15:09 ) [2]
← →
Scorpio © ( 2005-12-16 15:16 ) [3]
xls := CreateOleObject(«Excel.Application»);
app := XLS.Workbooks.Open(«c:spravkaspravka»);
xls.worksheets[«Ëèñò1″].Cells[1,1].Cells:=»Ïðèâåò»;
XLS.ActiveWindow.SelectedSheets.PrintOut(Copies:=1,Collate:=True);
xls.DisplayAlerts;
xls.quit;
xls := unassigned;
app := Unassigned;
Я пробовал с xls.quit; и без, он мне выдает «Метод DisplayAlerts из класса Application завершен неверно».
← →
umbra © ( 2005-12-16 15:23 ) [4]
Можно его обмануть 🙂
← →
Scorpio © ( 2005-12-16 16:03 ) [6]
Всем спасибо, теперь у меня все работает.
Источник
Delphi сохранение в excel
На форме имеется таблица StringGrid, состоящая из нескольких сотен строк и 6 столбцов. Также есть Edit1, в который вводится имя файла. Нужно организовать возможность сохранения данных из этой таблицы в Excel.
А именно, при нажатии на кнопку «Сохранить» данные из СтрингГрида должны вывестись на лист книги Excel, а затем эта книга должна сохраниться в директорию с программой с названием, которое введено в Edit1.
Daramant
Это можно сделать вот так:
what is the syntax for this c++ question in Delphi?
After using an oleContainer, and trying to do SaveDocumentAs which didn’t work. I thought this might be a good alternative.
update: thank you for the translation, however the excel file goes curropted after the call
Вы здесь
В прошлой статье (Читаем файл Excel (xls) в Delphi) был рассмотрен способ чтения данных из xls файла и его импорт в Delphi. Теперь перейдем к сохранению, т.е. к экспорту данных из Delphi. Экспорт, как и импорт, будет осуществляться через посредника, т.е. Excel. Поэтому для работы приложения потребуется установленная копия MS Excel 2003-2010 (выше не тестировал).
Добавьте на форму кнопку, диалог сохранения, и таблицу StringGrid. Для того чтоб появилась возможность редактирования таблицы StringGrid необходимо в ее свойствах включить опцию goEditing:
Визуальные приготовления для нашего примера готовы. Переходим к написанию кода.
Как и в случае чтения xls нам понадобится библиотека ComObj. Добавьте ее в uses. Ниже приведен листинг процедуры экспорта, добавьте его после ключевого слова implementation.
procedure Xls_Save(XLSFile:string; Grid:TStringGrid);
const
xlExcel9795 = $0000002B;
xlExcel8 = 56;
var
ExlApp, Sheet: OLEVariant;
i, j, r, c:integer;
begin
//создаем объект Excel
ExlApp := CreateOleObject(‘Excel.Application’);
//делаем окно Excel невидимым
ExlApp.Visible := false;
//создаем книгу для экспорта
ExlApp.Workbooks.Add;
//создаем объект Sheet(страница) и указываем номер листа (1)
//в книге, в который будем осуществлять экспорт
Sheet := ExlApp.Workbooks[1].WorkSheets[1];
//задаем имя листу
Sheet.name:=’Данные_из_Delphi’;
//считываем кол-во столбцов и строк в StringGrid
r:=Grid.RowCount;
c:=Grid.ColCount;
//считываем значение из каждой ячейки и отправляем в таблицу Excel
for j:= 1 to r do
for i:= 1 to c do
sheet.cells[j,i]:=Grid.Cells[i-1,j-1];
//отключаем все предупреждения Excel
ExlApp.DisplayAlerts := False;
//обработка исключения при сохраннении файла
try
//формат xls 97-2003 если установлен 2003 Excel
ExlApp.Workbooks[1].saveas(XLSFile, xlExcel9795);
showmessage(‘Файл сохранил 2003-ий офис’);
except
//формат xls 97-2003 если установлен 2007-2010 Excel
ExlApp.Workbooks[1].saveas(XLSFile, xlExcel8);
showmessage(‘Файл сохранил 2007 или 2010-ый офис’);
end;
//закрываем приложение Excel
ExlApp.Quit;
//очищаем выделенную память
ExlApp := Unassigned;
Sheet := Unassigned;
Источник
Работа с Excel из Delphi. Часть 1
Опубликовано Va-Bank в ПТ, 12/11/2010 — 23:57
Подготовка
Откроем нашу среду разработки Delphi (в моем случае это Delphi 2010). Создадим новый проект. Должен сказать, что работа с Excel происходит через объекты COM. Поэтому нам надо подключить в раздел USES нашего проекта модуль COMObj . Так же нам понадобится модуль ActiveX . Это будет выглядеть примерно вот так:
Проверка наличия установленного Microsoft Excel в операционной системе
Теперь собственно нам нужно, как писалось выше, определить наличие Excel в системе. Если он не будет обнаружен, то мы сообщим об этом пользователю и завершим программу. Для этого создадим простенькую функцию и объявим её в секции private нашей формы TForm1 :
то там можно будет обнаружить много разделов. Среди них есть как раз нужный нам «Excel.Application» (при условии, что данное ПО установлено в системе). К сведению: у этого раздела имеется еще два подраздела:
Параметры функции:
— pszProgID : строка, содержащая ProgID.
— clsid : получает CLSID.
Возвращаемые значения:
— S_OK — CLSID создан успешно.
— CO_E_CLASSSTRING — CLSID зарегистрированный для ProgID неверен.
— REGDB_E_WRITEREGDB — ошибка записи в реестр.
— E_OUTOFMEMORY — нет памяти.
— E_INVALIDARG — указывает что один или более аргументов неверны. Стоит проверить правильность строки pszProgID.
— E_UNEXPECTED — неизвестная ошибка.
Теперь на событии OnCreate формы TForm1 напишем следующий код:
Проверить, запущен ли Microsoft Excel
Далее давайте кинем на форму одну кнопку TButton. На событии OnClick будем писать код работы с Excel. Первое что мы сделаем, это добавим локальную переменную типа Variant для доступа к Excel с именем, например, FExcel :
Создание нового экземпляра Microsoft Excel
Создать новый экземпляр можно с помощью функции CreateOleObject . Давайте сразу напишем шаблон.
Операции над программой Microsoft Excel из Delphi
Теперь давайте рассмотрим, что вообще можно делать с Excel из Delphi. Операций достаточно много. И все описать просто невозможно. Но если в моем описании не окажется нужного вам метода, то огорчаться не стоит. Методы можно узнать самому. Открываете Excel. Затем в меню Сервис – Макрос – Начать запись . Там жмем ОК и выполняем необходимые нам операции в Excel. Когда закончите, жмем на Стоп . Затем нажимаем комбинацию клавиш Alt+F11 и перед нами открывается редактор Visual Basic . Вот в нем слева вверху есть древовидный список. В нем находится папка с названием Modules . В свою очередь в ней располагаются модули. Вот эти модули и есть ваши макросы. Кликнем два раза на тот модуль, который мы только что записали (если это первая запись, то модуль будет один). И тут будут отображены все ваши действия в виде исходного кода на языке Visual Basic. Вам остается только перевести это дело на Delphi.
По поводу констант. В Delphi придется объявлять их самим. Посмотреть чему они равны можно в том же редакторе Visual Basic. Делается это так. Вписываем любую нужную нам константу в редакторе. Кликаем правой клавишей мыши, чтобы появилось контекстное меню. И там выбираем пункт «Quick Info» . При этом будет показана всплывающая подсказка со значением этой константы. Все просто! Единственное оговорюсь. В Visual Basic будет показано так, например: &HFFFFEFF4 , но Delphi этого не поймет. Надо объявлять в нем так: $FFFFEFF4 .
FExcel.Visible := true;
Делать Excel видимым (True)/не видимым(False). При установке Visible в FALSE , программа Excel Так же пропадает из панели задач Windows.
FExcel.Application.EnableEvents := false;
Показывать (True)/не показывать(False) системные сообщения Excel. Рекомендую отключать сообщения при построении отчета. А сам код писать после создания экземпляра Excel. Это увеличит скорость создания отчета. Пример:
FExcel.WindowState := xlMaximized;
Состояние окна Excel:
const xlMaximized = $FFFFEFD7 (или -4137) — развернуть Excel на весь экран.
const xlNormal = $FFFFEFD1 (или -4143) — восстановить Excel.
const xlMinimized = $FFFFEFD4 (или -4140) — свернуть Excel на панель задач.
FExcel.ScreenUpdating := false;
Включить (True)/отключить (False) перерисовку окон. Используется для ускорения работы макроса, т.к. в это время не обновляется экран. Я в своих проектах не использовал данный метод, но возможно построение отчета будет выполняться быстрее, если отключить обновление окон Excel. После построения отчета перерисовку окон можно будет включить обратно.
FExcel.Workbooks.Open(path);
Открытие существующей книги (где path — путь к фалу). Функция Open описана так:
UpdateLinks — Необязательный параметр. Определяет способ обновления связи в открываемом файле. Если данный аргумент отсутствует, то пользователю будет выдан запрос на определение способа обновления связей. Данный параметр имеет следующие допустимые значения:
0 – никакие связи не обновляются;
1 – обновляются внешние ссылки, но не обновляются удаленные ссылки;
2 – обновляются удаленные ссылки, но не обновляются внешние ссылки;
3 – обновляются оба типа ссылок
ReadOnly — необязательный параметр. Если файл имеет атрибут только для чтения, то при открытии его в Excel выдается соответствующее предупреждение*. Чтобы его игнорировать, передайте в качестве данного параметра True.
Format — необязательный параметр. При открытии текстового файла этот параметр определяет вид символов-разделителей. Ниже представлены допустимые значения данного аргумента:
1 – символы табуляции;
2 – запятые;
3 – пробелы;
4 – точка с запятой;
5 – разделители отсутствуют;
6 – вид разделителя определяется пользователем (с помощью параметра Delimiter).
Password — необязательный параметр, задающий строку пароля, необходимого для открытия защищенной рабочей книги. Если при открытии защищенной книги данный аргумент отсутствует, то пользователю будет выдан запрос на ввод пароля*.
WriteResPassword — необязательный параметр. Предназначен для задания пароля, необходимого для записи в рабочую книгу. Если при открытии защищенной книги данный аргумент отсутствует, то пользователю будет выдан запрос на ввод пароля*.
IgnoreReadOnlyRecommended — необязательный параметр. В случае задания ему значения True этот аргумент позволяет устранить вывод сообщения с рекомендацией открытия книги только для чтения (в том случае, если данная рабочая книга была сохранена с параметром Read-Only Recommended).
Origin — необязательный параметр. При открытии текстового файла этот параметр указывает, где был создан этот файл, что необходимо для правильного распознавания страницы кодировки. Значениями данного аргумента может быть одна из констант: xlMacintosh, xlWindows или xlMSDOS**. Если данный аргумент отсутствует, то используются текущие параметры операционной системы.
Delimiter — необязательный параметр. Если открывается текстовый файл и параметр Format имеет значение, равное 6, то этот аргумент определяет символ-разделитель.
Editable — необязательный параметр. Если файл является файлом MS Excel 4.0, то этот параметр при задании ему значения True позволяет открыть надстройку как видимое окно. По умолчанию ему присвоено значение False.
Notify — необязательный параметр. Если файл не может быть открыт для записи, то при задании данному аргументу значения True файл будет добавлен в список уведомления. Если данный аргумент равен False или отсутствует, то открыть файл будет невозможно.
Converter — необязательный параметр. Предназначен для определения индекса фильтра, который будет использован при открытии данного файла. Если фильтр не сможет распознать формат файла, то будут последовательно использованы все доступные фильтры.
AddToMRU — необязательный параметр типа Variant. Если данный параметр имеет значение True, то рабочая книга будет добавлена в список недавно использованных файлов. По умолчанию ему присвоено значение False.
Примечание:
* Сообщения будут выведены на экран, если вы не отключили их с помощью:
FExcel.Application.EnableEvents := false;
Показывать (True)/не показывать(False) системные сообщения Excel.
** Delphi не знает о существовании констант, поэтому чтобы посмотреть их значения, нужно воспользоваться средствами VBA. Эти константы соответственно равны 1, 2 и 3.
FExcel.Workbooks.Add(path); // path — путь к фалу
Создание новой книги. Причем создается стандартная книга с тремя листами. В этом методе можно указать стандартный тип шаблона Excel. Если же в нем указать имя (с полным путем) подготовленного файла (шаблоном может быть и «обычный» файл XLS, а не только файл XLT), то можно открыть книгу на диске как шаблон.
FExcel.Workbooks.Add(Template);
Template — Необязательный параметр. Этот параметр определяет, как будет создана рабочая книга. Если этот параметр будет иметь значение строки, определяющей имя файла (включая путь) существующей рабочей книги, то создается рабочая книга с использованием данного файла как шаблона. В случае когда данный параметр является одной из констант: xlWBATExcel4IntlMacroSheet = 4;
xlWBATExcel4MacroSheet = 3;
xlWBATWorksheet = $FFFFEFB9 (или -4167);
xlWBATChart = $FFFFEFF3 (или -4109);
Создаваемая книга будет содержать один лист соответствующего типа. В том случае, если этот параметр отсутствует, то создается рабочая книга с количеством листов, определяемым значением свойства SheetslnNewWorkbook .
FileFormat — необязательный параметр. Данный параметр задает формат файла. Его значением может быть одна из констант, описанных в таблице 1 . В том случае, если файл уже существует, в качестве его формата по умолчанию будет назначен формат, использовавшийся при его предыдущем сохранении.
Password — необязательный параметр. Данный параметр определяет защитный пароль для сохраняемого файла. Пароль определяется строкой, содержащей не более 15 символов.
WriteResPassword — необязательный параметр. Предназначен для задания строки, определяющей пароль для сохранения файла в качестве файла только для чтения. При последующем открытии файла будет выдан запрос на ввод этого пароля, и если он не будет введен, то файл будет открыт в режиме только для чтения.
ReadOnlyRecommended — необязательный параметр. В случае присвоения ему значения True, последующее открытие файла на экране будет сопровождаться сообщением, говорящим о том, что этот файл рекомендуется открыть в режиме только для чтения.
CreateBackup — необязательный параметр. Определяет возможность создания резервного файла (значение True).
AccessMode — необязательный параметр. Этот параметр определяет режим доступа к рабочей книге и может иметь одно из следующих значений:
xINoChange – режим доступа не изменяется (равно 1);
xlShared – общие листы (равно 2);
xlExclusive – монопольный доступ (равно 3).
ConflictResolution — необязательный параметр. Определяет способ разрешения конфликтов в том случае, если книга имеет общие листы. Значением данного свойства может быть значение одной из констант:
xlUserResolution — отображает окно диалога для разрешения конфликтов (равно 1);
xlLocalSessionChanges — автоматически принимаются изменения локального пользователя (равно 2);
xlOtherSessionChanges — принимаются другие изменения вместо изменений локального пользователя (равно 3).
AddToMru — необязательный параметр. Позволяет поместить сохраняемый файл в список сохраненных файлов в меню Файл (File). Для реализации этой возможности значение этого аргумента должно равняться True.
TextCodePage — необязательный параметр. В локализованной версии MS Office не используется.
TextVisualLayout — необязательный параметр. В локализованной версии MS Office не используется.
FWorkbook.Close;
Закрыть книгу. При этом если Excel видимый, то появится диалог с вопросом, хотите ли вы сохранить файл.
Функция Close описана так:
FExcel.Workbooks[1].WorkSheets[1] .Name := ‘Отчёт’;
Присваиваем первому листу в первой книге имя «Отчет». Если будем работать с самим листом, то чтобы не писать много кода мы можем просто объявить новую переменную, например, FSheet типа Variant :
И присвоим ей ссылку на наш Лист1 первой книги:
FSheet.PageSetup.Orientation := 2;
Ориентация страницы (1 – книжная, 2 – альбомная).
FSheet.PageSetup.LeftMargin := X;
Отступ от левого края страницы
FSheet.PageSetup.RightMargin := X;
Отступ от правого края страницы
FSheet.PageSetup.TopMargin := X;
Отступ от верхнего края страницы.
FSheet.PageSetup.BottomMargin := X;
Отступ от нижнего края страницы.
FSheet.PageSetup.HeaderMargin := X;
Высота верхнего колонтитула страницы.
FSheet.PageSetup.FooterMargin := X;
Высота нижнего колонтитула страницы.
Где X — это отступ в пикселях. Можно в принципе воспользоваться функцией перевода из, например, сантиметров в пиксели. Делается это так:
FSheet.PageSetup.BottomMargin := FExcel.Application.CentimetersToPoints(1.5);
Это будет полтора сантиметра, а как там переводится в пиксели это не наша забота.
FSheet.PageSetup.Zoom := false (или значение в процентах Z);
Масштаб. Принимает следующие значения:
Z — «Установить Z% от натуральной величины», где X – это количество процентов. Т.е. если вы решите включить масштабирование, то вам необходимо вместо FALSE подставить число, например: FSheet.PageSetup.Zoom := 100; (что означает 100%).
FALSE — «Разместить не более чем на: X стр. в ширину и Y стр. в высоту, где:
FSheet.PageSetup.FitToPagesWide := 1;
Количество страниц в ширину (X).
FSheet.PageSetup.FitToPagesTall := 100;
Количество страниц в высоту (Y).
FSheet.PageSetup.CenterFooter := ‘Стр. &С из &К’ ;
Центральный нижний колонтитул. В нем будет информации о номере страницы из всего страниц. Данные переменные (&C, &K и т.п.) описаны в справочнике самого Excel. Аналогично:
FSheet.PageSetup.LeftFooter:=’Левый нижний колонтитул’;
FSheet.PageSetup.RightFooter:=’Правый нижний колонтитул’;
FSheet.PageSetup.LeftHeader:=’Левый верхний колонтитул’;
FSheet.PageSetup.CenterHeader:=’Центральный верхний колонтитул’;
FSheet.PageSetup.RightHeader:=’&7Правый верхний колонтитул’; *
Примечание: *для изменения размера шрифта добавьте к колонтитулу управляющий символ «&» и размер шрифта, в нашем случае 7
// const xlAutomatic = $FFFFEFF7 (или -4105)
FSheet.PageSetup.FirstPageNumber := xlAutomatic;
Номер первой страницы. В данном случае «Авто».
FSheet.PageSetup.Order := 1;
Последовательность вывода страниц на печать (1 — вниз, затем вправо; 2 — вправо, затем вниз).
FSheet.PrintPreview;
Предварительный просмотр страницы. Если вы не продолжите печать, а нажмете «Отмена», то будет вызвано исключение.
Примечание : Excel, перед выполнением этой команды, обязательно должен быть видимым (FExcel.Visible := true;).
FSheet.PrintOut;
Вывод страницы на печать. Функция PrintOut описана так:
To — необязательный параметр. Задает последнюю печатаемую страницу. Если этот аргумент отсутствует, то печать продолжается до последней страницы.
Copies — необязательный параметр. Задает количество печатаемых копий.
Preview — необязательный параметр, принимающий одно из двух значений:
TRUE — приводит к выводу перед печатью окна предварительного просмотра;
FALSE (значение по умолчанию) — печать производится без предварительного просмотра.
ActivePrinter — необязательный параметр. Задает имя активного принтера.
PrintToFile — необязательный параметр. Если данный параметр имеет значение True, то производится печать в файл. При этом пользователю выдается запрос на ввод имени файла.
Collate — необязательный параметр. Если ему задать значение True, то копии будут объединены.
Пример:
Источник
← →
Сатир
(2006-02-24 14:45)
[0]
Здраствуйте, Уважаемые!
Создаю объект Excel»я
FXLApp := CreateOleObject(«Excel.Application»);
Потом вношу какие-то изменения в этот excel
Как после закрытия этого Excel»я подавить сообщение о его сохранении?
Чтобы Workbook закрывался без вывода сообщения «Сохранить изменения?»
Заранее благодарен за помощь.
← →
DSKalugin ©
(2006-02-24 14:54)
[1]
destructor TxlsPrice.Destroy;
begin
Workbook.Saved:=True;
ExcelApp.Quit; // закрытие
inherited;
end;
← →
Bless ©
(2006-02-24 15:02)
[2]
xlApp.Application.EnableEvents := false;
?
← →
Суслик ©
(2006-02-24 15:03)
[3]
fApp := CreateOleObject(«Excel.Application»);
fApp.DisplayAlerts := False;
← →
Bless ©
(2006-02-24 15:07)
[4]
Суслик © (24.02.06 15:03) [3]>
Точно!
← →
umbra ©
(2006-02-24 15:12)
[5]
еще один вариант:
Workbook.Close(false);
← →
Суслик ©
(2006-02-24 15:20)
[6]
Я обычно делаю так. Создаю книгу в скрытом режиме, заполняю значениями, потом показываю.
Так создаю fApp := CreateOleObject("Excel.Application");
fApp.Visible := False;
fApp.Interactive := False;
fApp.DisplayAlerts := False;
fApp.ScreenUpdating := False;
fApp.SheetsInNewWorkbook := 1;
Так показываю fApp.Visible := True;
fApp.Interactive := True;
fApp.DisplayAlerts := True;
fApp.ScreenUpdating := True;
fApp.Application.WindowState := TOLEEnum(xlMaximized);
fApp.UserControl := True;
Обратите внимание на жирненькую строчку. Без нее испытывал переодические проблемы с тем, что книга показывается, но пользователь не может с ней ничего сделать. Про UserControl надыбал инфу на каком-то сайте, кажется «королевстве». Вроде помогло.
← →
Сатир
(2006-02-24 16:11)
[7]
>fApp.DisplayAlerts := False;
не помогло.
поставил после создания
но всё равно вылазит такое сообщение.
—————————
Microsoft Excel
—————————
Do you want to save the changes you made to «tmp3877262841.xls»?
—————————
Да Нет Отмена
—————————
Какие ещё могут быть варианты?
← →
Суслик ©
(2006-02-24 16:12)
[8]
странно…
должно работать.
ты код приведи.
← →
umbra ©
(2006-02-24 16:34)
[9]
Workbook.Close(false); //не сохранять изменения
Workbook.Close(true); //сохранить изменения
← →
Сатир
(2006-02-24 16:54)
[10]
Excel закрывается не программно, а путём нажатия стандартного крестика закрытия приложения.
и вот после этого выдает такое сообщения.
Workbook.Saved:=True;
вообще-то Workbooks
Workbook.Close(false);
—————————
Debugger Exception Notification
—————————
Project REFUS.exe raised exception class EOleSysError with message «Недопустимое число параметров». Process stopped. Use Step or Run to continue.
—————————
OK Help
—————————
← →
umbra ©
(2006-02-24 17:01)
[11]
если быть точным, на до писать следующее
Workbook.Close(SaveChanges:=false);
но неясно, какой смысл это делать, если ексел уже закрыт «путём нажатия стандартного крестика»
← →
Сатир
(2006-02-24 17:05)
[12]
Вообщем, разобрался.
FXLApp.DisplayAlerts := False; нужно ставить не после создания CreateOleObject, а перед вызовом FXLApp.Qiut;
258
25 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Хм, прикольная получилась задачка, я раз десять подвесил свой Excel, прежде чем во всем разобрался и отладил код
Сразу поясню насчет параметра SaveAsUI, чтоб он больше нам не мешал — эта переменная в событии _BeforeSave всего лишь показывает как пользователь пытается сохранить файл: серез СОХРАНИТЬ или через СОХРАНИТЬ КАК, и все. Это для информации, соотв. присвоение этой переменной какого своего значение внутри события _BeforeSave не имеет никакого смысла. Тебе Excel эту переменную передал в качестве информации, по ByVal к тому же и то что ей что то еще пытаешься присвоить, на это Excel уже никакого внимание обращать не будет.
Теперь на счет твоих проблем с SaveAs внутри события _BeforeSave.
Тут складывается действительно забавная ситуация. Дело в том, что вызывая метод в SaveAs в этом событии мы порождаем опять же это событие, поэтому очень важно предусмотреть возможность выхода из него, не допустив зацикливания.
Происходит все следующим образом:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
строка1
ThisWorkbook.SaveAs «c:3.xls» ‘ строка2
строка3
End Sub
Мы нажимаем кнопку Сохранить в Excel’е.
попадаем в событие _BeforeSave на строчку1.
Переходим к строчке2 — ThisWorkbook.SaveAs «c:3.xls», которая порождает ВТОРОЕ событие _BeforeSave.
Поэтому со строчки2 мы вновь попадаем на строчку1.
Визуально это можно представить себе так, как если разместить рядом два одниковых куска кода процедуры Private Sub Workbook_BeforeSave и нарисовать стрелку перехода со строчки2 первого куска на второй кусок Private Sub Workbook_BeforeSave.
Эта аналогия будет полной еще в том смысле, что Excel отработает весь второй кусок и потом, ВНИМАНИЕ: вернуться в первый кусок на след. строчку после той, с которой его грубо прервали вызвав SaveAs (т.е. в нашем примере на строчку3)
Т.е. выполнение кода по строчка будет следующее:
строчка1 (_BeforeSave1)
строчка2 (тут мы вызываем еще одно _BeforeSave)
строчка1 (_BeforeSave2)
‘строчка2(_BeforeSave2)
строчка3 (_BeforeSave2)
строчка3 (вернeлись в первый _BeforeSave)
Хорошо видно что если не поставить какое-нибудь доп. условие на строчку2 (.SaveAs), то оно будет каждый раз порождает очередные _BeforeSave и мы так зациклимся.
Поэтому если внутри события _BeforeSave надо сохранить файл под другим названием, то бцдет например такой:
Код:
Dim lEvent As Long
Dim bolEx As Boolean
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If lEvent = 0 Then
lEvent = 1
ThisWorkbook.SaveAs «c:3.xls»
ElseIf lEvent = 1 Then
lEvent = 0
bolEx = True
End If
If lEvent = 0 And bolEx Then
bolEx = False
Cancel = False
Else
Cancel = True
End If
End Sub
Чтобы посмотреть как работает этот код можешь открыть приложенный файл поставить breakpoint на If lEvent = 0 Then в событии _BeforeSave и нажать кнопку сохранить и двигаясь по шагам (через F8 ) увидишь как для второго события устанавливается Cancel=False, а при возвращаении к первому Cancel становится равным =True (если этого не сделать, то получим зависание Excel’я, он будет пытаться сохранить файл, который мы уже сохранили под другим именем, у Excel крышу тогда снесет)