Delphi excel закрыть без сохранения

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    !
    user posted image

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

    Соблюдайте общие правила форума

    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как запустить программу/файл? (и дождаться ее завершения)
    5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
    … (продолжение следует) …


    Внимание:
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки — бан.
    Мат в разделе — бан на три месяца…


    Полезные ссылки:
    user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


    Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

    >
    Закрыть Excel без сохранения изменений

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    24.02.08, 12:09

      Вот так подключаюсь

      ExpandedWrap disabled

        var

        Excel, WorkBook, Sheet: Variant;

        begin

          Excel := CreateOleObject(‘Excel.Application’);

          Excel.WorkBooks.Open(‘waranty.xls’,False);

          WorkBook := Excel.WorkBooks.Item[1];

          Excel.Visible:=true;

      а так отключаюсь

      ExpandedWrap disabled

          if not VarIsEmpty(Excel) then

          begin

            Excel.Quit;

            Excel:=Unassigned;

          end;

      но если были сделаны какие либо изменения в документе то он выбрасывает диалог сохранения «да / нет / отмена».
      Как его закрыть без сохранения изменеий и появления вопросов о сохранении.

      Сообщение отредактировано: VahaC — 24.02.08, 12:09

      Guru

      volvo877



      Сообщ.
      #2

      ,
      24.02.08, 12:37

        ExpandedWrap disabled

            if not VarIsEmpty(Excel) then

            begin

              Excel.DisplayAlerts := False; // <—

              Excel.Quit;

              Excel:=Unassigned;

            end;

        ?


        VahaC



        Сообщ.
        #3

        ,
        24.02.08, 12:43

          Сенкс помогло

          Добавлено 24.02.08, 12:45
          и ещё вопросик возможно както открыть ексель и разместить его окно (без менюшек и всяких кнопочек) в ТПанел который находится на моей форме.

          Guru

          volvo877



          Сообщ.
          #4

          ,
          24.02.08, 13:44

            Положи на форму TOleContainer, и открой в нем свой файл, скажем, вот так:

            ExpandedWrap disabled

                OleContainer1.CreateObjectFromFile(xl_file_name, false);

                OleContainer1.DoVerb(ovShow);


            VahaC



            Сообщ.
            #5

            ,
            24.02.08, 13:55

              на ето говорит «Отказанов доступе к указаному устройству, пути или файлу»

              Добавлено 24.02.08, 14:09
              Удалили последнюю строку и заработало.

              А как тогда должен выглядеть такой вот код

              ExpandedWrap disabled

                  Sheet := Workbook.Sheets.Item[1];

                  Excel.ActiveWindow.DisplayGridlines:=False;

                  Sheet.Cells.Replace(‘<#number>’,’gdsghrdhgd’)

              Сообщение отредактировано: VahaC — 24.02.08, 14:17

              Guru

              volvo877



              Сообщ.
              #6

              ,
              24.02.08, 16:30

                Цитата VahaC @ 24.02.08, 13:55

                Удалили последнюю строку и заработало.

                Не знаю в чем дело, у меня и с DoVerb работает… А вот то, что написано ниже без DoVerb работать точно не будет:

                ExpandedWrap disabled

                    OleContainer1.CreateObjectFromFile(‘G:test.xls’, false);

                    OleContainer1.DoVerb(ovShow);

                    try

                      Excel := GetActiveOleObject(‘Excel.Application’);

                    except

                      ShowMessage(‘Что-то не так …’); Exit;

                    end;

                    Excel.ActiveWindow.DisplayGridlines := False;

                    // Ну, и что там у тебя было еще …


                DEHisOK



                Сообщ.
                #7

                ,
                26.02.08, 18:30

                  сори за оффтоп, облом новый топ создавать
                  вопрос:
                  как в олеконтейнер загрузить окно ворда
                  то есть как бы миниатюру…
                  просто у мну галимо грузитсо — только рабочая область. меню выше… короче не так как надо…
                  + доуступ ко всем элементам типа параграфс итп.. как все эти «штучки» называются?
                  я просто не знаю даже как погуглить((

                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                  0 пользователей:

                  • Предыдущая тема
                  • Delphi: Система, Windows API
                  • Следующая тема

                  Рейтинг@Mail.ru

                  [ Script execution time: 0,0401 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

                  Содержание

                  1. Delphi закрыть excel без сохранения файла
                  2. Delphi закрыть excel без сохранения файла
                  3. Delphi закрыть excel без сохранения файла
                  4. Закрыть без сохранения
                  5. 14 ответов

                  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 без сохранения файла

                  Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

                  Соблюдайте общие правила форума

                  Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
                  1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
                  2. Как «свернуть» программу в трей.
                  3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
                  4. Как запустить программу/файл? (и дождаться ее завершения)
                  5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
                  . (продолжение следует) .
                  Внимание:
                  Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
                  Повторная попытка — 60 дней. Последующие попытки — бан.
                  Мат в разделе — бан на три месяца.
                  Полезные ссылки:
                  MSDN Library FAQ раздела Поиск по разделу Как правильно задавать вопросы

                  Выразить свое отношение к модераторам раздела можно здесь: Rouse_, Krid

                  Источник

                  Delphi закрыть excel без сохранения файла

                  Использую позднее связывание. Файл создавался в экселе более ранней версии и при закрытии эксель предлагает сохранить его в новом формате. Кнопку «отмена» руками жать все время не прикольно, так как все файлы такие и их будет не мало.


                  ShiFT ( 2005-11-16 14:01 ) [1]

                  Excel.Application.DisplayAlerts := False;
                  Excel.Quit


                  ANB © ( 2005-11-16 14:07 ) [2]


                  Prohodil Mimo © ( 2005-11-16 23:03 ) [3]

                  А вот в конце не забудь вернуть опять в True, иначе если кто-то открыл свой документ, изменил в нём что-то, а после ты выставил DisplayAlerts := False; то при закрытии Excel даже не подумает спросить юзера о сохранении.

                  Excel.Quit — тоже жестоко по тем причинам, что в Excelе уже может быть открыт какой-то документ, открытый не твоей программой, а следовательно, не тебе его закрывать. Закрывать надо книгу, ну или проверять на ол-во открытых книг, если много — закрыть книгу, если одна — Excel.


                  ShiFT ( 2005-11-17 06:08 ) [4]

                  Источник

                  Закрыть без сохранения

                  1) Хотелось бы узнать, как сделать так, чтобы при закрытии файла Excel программа не спрашивала пользователя «Сохранить изменения?», а сразу закрывала файл без сохранения?

                  2) Ещё было бы хорошо, чтобы пользователь при сохранении текущего файла не мог сохранить его под этим именем, а только под другим.

                  Суть в том, что есть файл Excel с макросами, содержание которого (файла) сохранять не нужно. Изменения могут производиться только в процессе работы с этим файлом, а сохранять их нельзя.

                  14 ответов

                  [QUOTE]Originally posted by Sergan
                  1) Хотелось бы узнать, как сделать так, чтобы при закрытии файла Excel программа не спрашивала пользователя «Сохранить изменения?», а сразу закрывала файл без сохранения?

                  Я поместил команду ActiveWorkbook.Close savechanges:=False в процедуру Workbook_BeforeClose. Теперь при закрытии файла программа не спрашивает «Сохранить изменения?» и закрывает без сохранения.
                  А как быть со вторым вопросом?

                  попробуй вот так. может получится

                  ActiveWorkbook.SaveAs Filename:=»Имя.xls»
                  ActiveWorkbook.Close savechanges:=True

                  Originally posted by Dimitry

                  попробуй вот так. может получится

                  ActiveWorkbook.SaveAs Filename:=»Имя.xls»
                  ActiveWorkbook.Close savechanges:=True

                  Дмитрий,по-моему,эти команды можно применить при выполнении какого-то макроса. Я же хочу, чтобы при нажатии пользователем кнопки или меню «Сохранить», программа предлагала сохранить этот файл под другим именем, а под этим не разрешала вообще.
                  Как это сделать?

                  Дмитрий,по-моему,эти команды можно применить при выполнении какого-то макроса. Я же хочу, чтобы при нажатии пользователем кнопки или меню «Сохранить», программа предлагала сохранить этот файл под другим именем, а под этим не разрешала вообще.
                  Как это сделать?

                  к сожалению я еще не достиг такого уровння.
                  и каким образом можно перенастроить стандартные кнопки и команды не знаю.
                  единственный вариант это создать свою кнопку с такой-же иконкой, а стандартную убрать , если получится

                  Дмитрий,по-моему,эти команды можно применить при выполнении какого-то макроса. Я же хочу, чтобы при нажатии пользователем кнопки или меню «Сохранить», программа предлагала сохранить этот файл под другим именем, а под этим не разрешала вообще.
                  Как это сделать?

                  У тебя какая-то нетривиальная задачка, ты хочешь отобрать у пользователя возможность сохранения файла под тем же названием?

                  Тогда надо залезть в обработчик события Workbook_BeforeSave этой книги:

                  Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

                  SaveAsUi — True if the Save As dialog box will be displayed — наверное то что тебе нужно.

                  У тебя какая-то нетривиальная задачка, ты хочешь отобрать у пользователя возможность сохранения файла под тем же названием?

                  Тогда надо залезть в обработчик события Workbook_BeforeSave этой книги:

                  Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

                  SaveAsUi — True if the Save As dialog box will be displayed — наверное то что тебе нужно.

                  Да, Сергей, Вы правы: хочу отобрать у пользователя эту возможность. Но использование параметра SaveAsUi ничего не дало. Для того, чтобы пользователь не смог сохранить файл нужно сделать так

                  тогда файл не сохраняется.

                  Самое смешное, что написав в обработчике событий выше приведенную команду я и сам теперь этот файл не могу сохранить, то есть не могу сохранить этот код ( Cancel=True )
                  Поэтому ничего не получается. Как быть?

                  Самое смешное, что написав в обработчике событий выше приведенную команду я и сам теперь этот файл не могу сохранить, то есть не могу сохранить этот код ( Cancel=True )
                  Поэтому ничего не получается. Как быть?

                  Попробуй открыть эту книгу . отключить макросы. изменить нужную процедуру. и сохранить. должно получиться. а вообще ситуация веселая 🙂

                  Смешно получилось, вот так дашь совет 🙂

                  Ну пока можно в конце Cancel=False приписать, который все разрешит. Ну пока код не отработан, можно его еще тестить, а сохранять уже в самом конце.

                  Насчет SaveAsUi, это конечно не решит все проблемы, тут еще надо повозится с проверками, просто мне показалось что удобно будет использовать это уже готовую возможность.

                  Думаю логика должна быть такая (сходу, не проверяя, убегать уже пора 🙂 )

                  1. Показываем диалог выбора сохранения файла (простой диалог, который возвращает токо имя и ничего больше не делает): Application.GetSaveAsFilename

                  2. Проверяем путь, если совпадает с текущим файлом — ругаемся на пользователя, куда-нибудь его посылаем или тихо игнорируем и ставим Cancel=True. Если путь не совпадает, то Cancel=False.

                  Originally posted by SergeySV
                  .
                  Думаю логика должна быть такая

                  1. Показываем диалог выбора сохранения файла (простой диалог, который возвращает токо имя и ничего больше не делает): Application.GetSaveAsFilename

                  2. Проверяем путь, если совпадает с текущим файлом — ругаемся на пользователя, куда-нибудь его посылаем или тихо игнорируем и ставим Cancel=True. Если путь не совпадает, то Cancel=False.

                  Вообщем сделал я следующее:
                  [COLOR=blue]
                  Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
                  Dim name, fName As String
                  name = «имя_файла.xls»
                  MsgBox «Рекомендуется сохранить файл под именем » + name, , «Внимание!»
                  ChDir ActiveWorkbook.Path
                  fName = Application.GetSaveAsFilename(InitialFileName:=name)
                  [color=green]’Если выбранное имя совпадает с именем текущего файла[/color]
                  If fName = ActiveWorkbook.FullName Then
                  [color=green]’Ругаемя на пользователя[/color]
                  MsgBox «Сохранение файла под текущим именем ЗАПРЕЩЕНО! Сохраниет файл под другим именем!», , «Внимание!»
                  Cancel = True [color=green]’отключаем сохранение[/color]
                  Else
                  [color=green]’иначе сохранение возможно[/color]
                  Cancel = False
                  [color=black]ПОСЛЕ ЭТОГО ФАЙЛ СОХРАНЯЕТСЯ ПОД ТЕКУЩИМ ИМЕНЕМ, А НЕ ПОД ТЕМ, КОТОРЫЙ ВЫБРАЛ ПОЛЬЗОВАТЕЛЬ. ВО КАК. ЧТО НУЖНО СДЕЛАТЬ, КАКОМУ ПАРАМЕТРУ ПРИСВОИТЬ ВЫБРАННОЕ ПОЛЬЗОВАТЕЛЕМ ИМЯ, ЧТОБЫ СОХРАНЕНИЕ ПРОИЗОШЛО КАК НАДО . [/color]
                  End If
                  End Sub
                  [/COLOR]
                  Ещё обнаружил, что при вызове команды «Сохранить как» открывается стандартное окно сохранения, даже
                  [COLOR=blue]SaveAsUI = False[/COLOR]
                  не помогает. Вот блин, никак не могу как следует извратиться. Можно конечно просто запретить любое сохранение и всё.
                  Что посоветуете?

                  Хм, прикольная получилась задачка, я раз десять подвесил свой 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

                  Чтобы посмотреть как работает этот код можешь открыть приложенный файл поставить breakpoint на If lEvent = 0 Then в событии _BeforeSave и нажать кнопку сохранить и двигаясь по шагам (через F8 ) увидишь как для второго события устанавливается Cancel=False, а при возвращаении к первому Cancel становится равным =True (если этого не сделать, то получим зависание Excel’я, он будет пытаться сохранить файл, который мы уже сохранили под другим именем, у Excel крышу тогда снесет)

                  Источник

                   
                  scorpio_md
                   
                  (2005-12-16 11:35)
                  [0]

                  Подскажите плиз, как закрыть екселевское приложение без запроса на сохранение, пробовал

                  xls.quit;
                  xls.quit(2);
                  — По аналогии с WORD — ругается, неизветсный параметр


                   
                  Scorpio ©
                   
                  (2005-12-16 15:07)
                  [1]

                  Мастера подскажите как мне всетаки закрыть ексель без сохранения, а то мозги уже кипят.


                   
                  Zz_
                   
                  (2005-12-16 15:09)
                  [2]

                  DisplayAlerts


                   
                  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]

                  xls.DisplayAlerts := false;


                   
                  Vlad ©
                   
                  (2005-12-16 15:49)
                  [5]


                  > Scorpio ©   (16.12.05 15:16) [3]

                  Можно его обмануть :-)

                  XLS.WorkBooks[1].Saved := True;
                  XLS.Quit;


                   
                  Scorpio ©
                   
                  (2005-12-16 16:03)
                  [6]

                  Всем спасибо, теперь у меня все работает.


                  I have a excel automation application written in Delphi, that accesses a given excel workbook and extracts applying some internal logic different data of the sheets.

                  It has worked perfectly for years on Excel 2003 and 2007.

                  Recently some users have Excel 2010. On those users, when my application exits, Excel shows a dialog box asking the user to Save the unmodified worksheet. The message says something about versions of the formulas to be saved in a new 2010 format. Sorry I don’t have the exact words because it is not an english office package.

                  How can my app prevent excel 2010 showing this annoying and useless box?

                  Most of the users have Excel 2007, so most of the files that my application needs to process, regardless of the actual Excel version of the user running my app, are in that format, and will be in the future, so migrating all the files is not an option.

                  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 крышу тогда снесет)

                  Понравилась статья? Поделить с друзьями:
                • Delphi excel добавить один лист
                • Delphi excel добавить лист в книгу
                • Delphi excel для всего листа
                • Delphi excel данные массив
                • Delphi excel границы одной ячейки