Страницы: 1
RSS
Закрыть все файлы экселя при открытие xlsb-файла (макросом)
 
Как заставить макросу (наверное, Workbook_Open) закрыть все эксель-файлы перед открытием нового файла?
Этот код всегда будет работать или Нужно что-то добавить?
Код
Private Sub Workbook_Open()
    For Each WB In Workbooks
        If WB.Name <> ThisWorkbook.Name Then
            WB.Close &#39; SaveChanges:=False
        End If
    Next
End Sub

Например, если в открытой книге будет запущена команда "Application.EnableEvents = False", не будет работать "Workbook_Open" и т.д.
Как запускать файл без проблем?
 
в стандартный модуль
Код
sub auto_open()
    For Each WB In Workbooks
       If WB.Name <> ThisWorkbook.Name Then
           WB.Close ' SaveChanges:=False
       End If
   Next
end sub
 
Извините, Андрей, но этот модуль не запускается при запуске файла ...
 
Стандартный модуль
 
Большое спасибо, Господин Андрей!
Вы мне толкнули учить ексель еще и еще :)
 
Сделал файл, где в стандартый модул вставил:
Код
Private sub auto_open()
    For Each WB In Workbooks
       If WB.Name <> ThisWorkbook.Name Then
           WB.Close
       End If
   Next
end sub

Переслал на мейл сотрудникам, но они не могут его использовать, потому что когда запускается файл, не запускается Workbook_Open, который должен игнорировать сообщение "protected view":
Код
Private Sub Workbook_Open()
    Dim sourceWB As Workbook
    Do While sourceWB Is Nothing
        Set sourceWB = ThisWorkbook
        DoEvents
    Loop
End Sub

Что делать в этом случай?
 
Я как понял, если Workbook_Open отсутвует или Application.EnableEvents = True, тогда auto_open работает.
Что-то мне не ясно...
Как они между собой займодействуют?
Изменено: Beso Shioshvili - 07.04.2020 03:33:20
 
Задача:
При открытие моего файла он должен предлогать употребителю закрыть все действующие книги экселя.
Если употребитель не закроет хоть одну из них, мой файл должен закрыться, противном случай должен запускать форму.

проблемы:
1. может быть другие книги оставили Application.EnableEvents = False, тогда Workbook_open не будет запущен.
Поэтому код закрытия других книг сунул в auto_open.

2. Если у пользователя моего файла вылетает строка "PROTECTED VIEW", после нажатия на кнопку "Enable" auto_open не запускается.

Я в Workbook_open записал код для игнорирования "PROTECTED VIEW" и в конце добавил строчки для запуска auto_open.
Мой файл не работает только тогда, когда и Application.EnableEvents = False и вылетает строка "PROTECTED VIEW", вдругих случаях только одна проблема

3. WB.Close не спрашивает о сохранений книги.

Пака а запуске формы нет речи. Думаю, там тоже будут проблемы...
Изменено: Beso Shioshvili - 07.04.2020 03:35:26
 
Ну засуньте в auto_open
Код
Application.Run ThisWorkbook.CodeName & ".Workbook_open"
 
Засунул, но ничего не получается, когда и Application.EnableEvents = False и вылетает строка "PROTECTED VIEW"

Может быть подскажите куда мне его сунуть?..  :(
 
А почему в стандартный модуль, а не в модуль книги?
 
Потому, что когда Application.EnableEvents = False, модуль книги не реагирует...
 
Уважаемый Beso Shioshvili!

Вы верно пишете, что при Application.EnableEvents=False при открытии книги не будет выполняться макрос из модуля книги Workbook.Open. Но это же относится и к макросу auto_open, который размещен в стандартном модуле.
К сообщению прилагается файл Auto.xlsm, содержащий макрос Auto_open. Если этот файл открыть стандартным образом, то будет выдано сообщение "Auto_open". Если же открыть файл так:
Код
Sub test()
  Application.EnableEvents = False
  Workbooks.Open "C:\Temp\Auto.xlsm"
  Application.EnableEvents = True
End Sub

то сообщение не выдается.
Изменено: sokol92 - 05.04.2020 19:55:38
Владимир
 
Дорогой sokol92, имеются 4 варианта:
1. Application.EnableEvents = False       и       вылетает строка "PROTECTED VIEW"
2. Application.EnableEvents = False       и НЕ вылетает строка "PROTECTED VIEW"
3. Application.EnableEvents = True         и       вылетает строка "PROTECTED VIEW"
4 Application.EnableEvents = True          и НЕ вылетает строка "PROTECTED VIEW"

Этот файл работает в трёх последных вариантах, но не работает только в первый вариант.
Раз, он работает во втором варианте, значит НЕ "относится и к макросу auto_open, который размещен в стандартном модуле", но почему - я этого не знаю, к сожалению...
 
У Вас, насколько я понимаю, Excel 2016. Проверьте, пожалуйста, мой пример из сообщения #13. У Вас такое же поведение, как я написал? Если "Да", то Auto_open не отрабатывает при Application.EnableEvents = False.

Что касается "Protected View", то это означает что Excel не считает надежным расположение открываемого файла и поэтому открывает файл в режиме защищенного просмотра. Подробно об этой ситуации и возможных действиях написано здесь.

Прочитал предыдущие сообщения. Идея принудительного закрытия открытых книг мне не нравится - можно потерять ценную для пользователя информацию.
Проще вызов формы (при нажатии на кнопку/автофигуру) оформить так:

Код
If Workbooks.count>1 Then
  ' есть еще какие-то открытые книги, кроме данной
  ' выдаем просьбу пользователю закрыть все книги, кроме текущей
Else
  ' запускаем форму
End If
Изменено: sokol92 - 05.04.2020 20:40:54
Владимир
 
Извините, Господин sokol92, я не в состояние продолжить...
Завтра объезательно прочту ваше мудрое сообщение и продолжу собеседование...
Извините... И спасибо за помощь...  :)  
 
Цитата
sokol92 написал:
У Вас, насколько я понимаю, Excel 2016. Проверьте, пожалуйста, мой пример из сообщения #13. У Вас такое же поведение, как я написал? Если "Да", то Auto_open не отрабатывает при Application.EnableEvents = False.
Здравствуйте, уважаемый sokol92!

Я внимательно прочёл ваше сообщение, протестировал и скажу, что у меня Excell 2016, у меня тоже такое поведение, как вы
написали, Но НЕ соглашусь к убеждению, что "Auto_open не отрабатывает при Application.EnableEvents = False". По моему, дело не в том, что Application.EnableEvents = False, а в том, что вы в первом случай "ВРУЧНУЮ" открываете файл Auto.xlsm, а во втором случай - ПРОГРАМНО. Могу потвердить: откройте приложенный файл "events_FALSE.xlsb", где присутсвуют два макроса:
Код
Private Sub Workbook_Open()
    Application.EnableEvents = False
    MsgBox ("Workbook_Open")
End Sub
Код
Private Sub auto_open()
    Application.EnableEvents = False
    MsgBox ("auto_open")
End Sub

После этого сразу же откройте Auto.xlsm (НО - "ВРУЧНУЮ")
Ваш файл выдаст сообщение "Auto_open".

Цитата
sokol92 написал:
Идея принудительного закрытия открытых книг мне не нравится
Что касается к цитируемому идею - я тоже не хочу вредить пользователю"!

Этот код:
Код
Private sub auto_open()
    For Each WB In Workbooks
       If WB.Name <> ThisWorkbook.Name Then
           WB.Close
       End If
   Next
end sub

даёт возможность пользователю завершить свою работу.
Изменено: Beso Shioshvili - 07.04.2020 02:39:41
 
К сожалению, проблема, которую описал в №8 сообщение, остаётся...  :cry:  
 
Попробуем тогда так:
В стандартный модуль:
Код
Option Explicit
Dim Auto_open_done As Long

Sub Auto_open()
   If Auto_open_done = 0 Then
     Auto_open_done = 1
     
     MsgBox ThisWorkbook.Name & ": Auto_open"
  
    ' Здесь выполняем требуемые действия по закрытию книг и другие
    '
   End If
End Sub

В модуль книги:
Код
Private Sub Workbook_Open()
   Auto_open
End Sub

P.S. Вернитесь, пожалуйста, к сообщению #17 и оформите код VBA соответствующей кнопкой. Модераторы у нас очень строгие. :)  
Владимир
 
Спасибо за подсказку  :)
Я до сих пор не обращал на это внимание...  :oops:  
 
Вы так подразумивали?
Если я правильно понял Вашу подсказку, тогда, к сожалению, не работает...  :(  
 
Beso Shioshvili, если мысль опоздала, можно вернуться и дополнить предыдущее сообщение (если после него еще нет ответов), а не разговаривать с собой.
 
Уважаемый vikttur, уже 5 дней мучаемся.
Вместо замечания по поводу ведения переписки в форуме, было бы полезнее помочь с решением проблемы  :)  
 
Beso Shioshvili, не нужно подсказывать модератору, чем ему заниматься - он выполняет свою работу.
 
Добрый день! Если проблема не имеет решения, то и найти его невозможно.

Если Вы открыли книгу в защищенном просмотре, то никакие макросы из этой книги не выполняются. После нажатия пользователем на кнопку "Разрешить редактирование" происходит повторное открытие книги, при этом макрос "auto_open" не выполняется. Если при этом свойство Application.EnableEvents = False, то никакие макросы, связанные с обработкой событий, выполняться не будут. Точка. Это разумная защита от злоумышленников (malicious user).

Я в #15 предложил альтернативный путь.
Владимир
Страницы: 1
Наверх