Excel макрос после закрытия

powerking11

1 / 1 / 0

Регистрация: 28.04.2016

Сообщений: 103

1

Автосохранение книги при закрытии

18.12.2020, 15:49. Показов 3060. Ответов 4

Метки vba access, vba excel (Все метки)


Студворк — интернет-сервис помощи студентам

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

Visual Basic
1
2
3
Sub AutoClose()
  If ActiveDocument.Saved = False Then ActiveDocument.Save
End Sub

В книгу и модуль, сначала работает..
Открываешь снова изменяешь документ, нажимаешь закрыть — справшивает.
То есть макрос не работает



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

18.12.2020, 16:20

2

WORD или Excel или еще где? Чтобы макрос работал его нужно вешать на событие закрытия книги.
в эксель

Visual Basic
1
Private Sub Workbook_BeforeClose(Cancel As Boolean)

в ворд

Visual Basic
1
Private Sub Document_Close()



0



Kubuntovod

Эксперт NIX

2670 / 786 / 176

Регистрация: 14.01.2013

Сообщений: 3,672

18.12.2020, 17:29

3

Visual Basic
1
Documents.Save NoPrompt:=True, OriginalFormat:=wdOriginalDocumentFormat

Оно?



0



Igor_61

89 / 49 / 18

Регистрация: 03.06.2019

Сообщений: 187

19.12.2020, 18:10

4

Цитата
Сообщение от powerking11
Посмотреть сообщение

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

В Excel:

Visual Basic
1
2
3
Application.DisplayAlerts = False
        ThisWorkbook.Save
        Application.DisplayAlerts = True



1



powerking11

1 / 1 / 0

Регистрация: 28.04.2016

Сообщений: 103

21.12.2020, 14:32

 [ТС]

5

Igor_61, спасибо работает

Добавлено через 3 минуты
Igor_61,

PureBasic
1
2
3
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.Save ' принудительное сохранение перед закрытием
End Sub

Но лучше так



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

21.12.2020, 14:32

Помогаю со студенческими работами здесь

При закрытии одной книги записать информацию во вторую
Всем привет) столкнулся с проблемой: есть две книги в одну заношу информацию, и во вторую заношу…

Excel При закрытии книги VB проект остается не выгруженным
В Excel на VBA написал проект, однако при закрытии книги этот проект почему-то остается не…

Как при закрытии книги эксель — убрать иконку
Добрый вечер.
Помогите решить вопрос.

При открытии файл эксель подгружает иконку (.ico) по…

Сделать так, чтобы при закрытии книги удалялась кнопка
Добрый день!

Вопрос, наверное, простой, но я с ним промучалась уже два дня. Как программно…

Запуск макроса при закрытии любой активной рабочей книги
Есть макрос, в книге макросов, но как его запустить при закрытии любой активной рабочей книги?…

Сохранение книги Excel в другом месте при закрытии файла
Здравствуйте, помогите макросом: на съемном носителе, который открывается с разных машин есть книга…

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

Или воспользуйтесь поиском по форуму:

5

Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).

Описание

В Microsoft Excel можно создать макрос Microsoft Visual Basic для приложений (VBA), который подавляет запрос на Сохранение изменений при закрытии книги. Это можно сделать, указав состояние книги, в которой хранится сохраненное свойство, или подавить все оповещения для книги.

Дополнительные сведения

ПРИМЕЧАНИЕ. Корпорация Майкрософт предоставляет примеры программирования только для иллюстрации, не выполняя либо подразумеваемых. Сюда относится, но не ограничивается подразумеваемым гарантийным обязательством о товаре или пригодности для определенной цели. В этой статье предполагается, что вы знакомы с языком программирования, который вы продемонстрировали, и с инструментами, используемыми для создания и отладки процедур. Специалисты службы поддержки Майкрософт могут объяснить особенности конкретных процедур. Однако они не изменяют эти примеры для предоставления дополнительной функциональности или создания процедур, отвечающих вашим конкретным требованиям. 

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

  1. Запустите Excel и откройте новую книгу.

  2. Нажмите клавиши ALT + F11, чтобы запустить редактор Visual Basic.

  3. В меню Вставка выберите пункт модуль.

  4. Введите пример кода макроса на лист модуля.

  5. Нажмите клавиши ALT + F11, чтобы вернуться в Excel.

  6. В Microsoft Office Excel 2003 и более ранних версиях Excel в меню Сервис выберите пункт макрос , а затем — макросы.

    В Microsoft Office Excel 2007 в группе код на вкладке разработчик нажмите кнопку макросы

    Если вкладка разработчик

    недоступна, выполните указанные ниже действия.

        помощью. Нажмите кнопку Microsoft Office , а затем — Параметры Excel.

    байт. В категории популярные в разделе Основные параметры работы с Excelвыберите пункт Показать
    .
            Флажок «Разработчик» на ленте
    и нажмите кнопку ОК.

  7. Выберите нужный макрос и нажмите кнопку выполнить.

Свойство Saved возвращает значение false , если после последнего сохранения книги были внесены изменения.

Для указания макроса, который должен выполняться при закрытии книги, можно использовать зарезервированное имя подпрограммы Auto_Close . Таким образом, вы можете управлять обработкой документа, когда пользователь закрывает документы в Excel.

Пример 1: Закрытие книги без сохранения изменений

Чтобы принудительно закрыть книгу, не сохраняя никаких изменений, введите следующий код в модуль Visual Basic этой книги:
 


    ДоЧерний элемент Auto_Close ()


        ThisWorkbook. Save = true


    End Sub

Если для свойства Saved установлено значение true, приложение Excel отправляет сообщение о том, что книга уже была сохранена, и после последнего сохранения изменения не произошел.

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


    Sub Клосебук ()


        Application. Дисплайалертс = false


        Активеворкбук. Close


        Application. Дисплайалертс = true


    End Sub

Кроме того, можно использовать аргумент SaveChanges метода Close .

Следующий макрос закрывает книгу без сохранения изменений.

   

Sub CloseBook2()


   

   

ActiveWorkbook.Close savechanges:=False

   

End Sub

Пример 2: Закрытие книги и сохранение изменений

Чтобы принудительно сохранить изменения в книге, введите следующий код в модуль Visual Basic этой книги:
 


    ДоЧерний элемент Auto_Close ()


        Если ThisWorkbook. Save = false, то


            ThisWorkbook. Save End, если


    End Sub

Эта подпроцедура проверяет, было ли для сохраненного свойства File задано значение false. Если да, то книга была изменена с момента последнего сохранения, и эти изменения будут сохранены.

Нужна дополнительная помощь?

В Excel 2007 и более поздних версиях файлы с макросами имеют другое расширение.

Файлы без vba имеют расширение xlsx.

Файлы с макросами должны быть сохранены в виде книги с поддержкой макросов с расширением xlsm.

Для обоих типов файлов также существуют варианты шаблона, т.е. xltx и xltm соответственно.

Формат файла по умолчанию для нового файла — xlsx, если вы не измените этот параметр в настройках Excel.

Если вы включите макросы vba в файл xlsx, а затем попытаетесь сохранить его, вы увидите сообщение о том, что вы не можете сохранить макросы в файле xlsx:

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

Вы видели сообщение. Вы предприняли действие НЕ сохранять файл с макросами.

Таким образом, макросы не сохраняются вместе с файлом.

Вот как это работает.

Автоматическое снятие фильтра после закрытия файла

KIMVSR

Дата: Понедельник, 04.04.2016, 14:19 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 118


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Здравствуйте,

Скажите, пожалуйста, имеется ли возможность прописать через VBA такую опцию, как:
— автоматическое снятие всех фильтров в документе после закрытия файла;
— автоматическое сложение (закрытие) все сгруппированных областей после закрытия файла;

В документе уже имею VBA скрипт на «запароливание» документа при закрытии, может его можно как-то дополнить, чтобы вышеупомянутые опции работали?

[vba]

Код

Private Sub Workbook_BeforeClose(Cancel As Boolean)
For Each sh In ThisWorkbook.Sheets(Array(«Sheet1», «Sheet2», «Sheet3», «Sheet4″»))
    With sh
        .Unprotect «password»
        .Protect Password:=»password», Userinterfaceonly:=True, Scenarios:=True, AllowFiltering:=True
    End With
Next
End Sub

[/vba]
Заранее благодарен за помощь!

Сообщение отредактировал KIMVSRПонедельник, 04.04.2016, 14:19

 

Ответить

SLAVICK

Дата: Понедельник, 04.04.2016, 14:32 |
Сообщение № 2

Группа: Модераторы

Ранг: Старожил

Сообщений: 2290


Репутация:

766

±

Замечаний:
0% ±


2019

Пробуйте так:
[vba]

Код

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim sh As Worksheet
For Each sh In ThisWorkbook.Sheets(Array(«Sheet1», «Sheet2», «Sheet3», «Sheet4»))
    On Error Resume Next
    With sh
        .ShowAllData ‘снятие всех фильтров
        .Outline.ShowLevels RowLevels:=1, ColumnLevels:=1 ‘сгруппирование
        .Unprotect «password»
        .Protect Password:=»password», Userinterfaceonly:=True, Scenarios:=True, AllowFiltering:=True
    End With
Next
End Sub

[/vba]


Иногда все проще чем кажется с первого взгляда.

 

Ответить

_Boroda_

Дата: Понедельник, 04.04.2016, 14:35 |
Сообщение № 3

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Такой вариант. И да, Ким, это все происходит не после закрытия, а до. И еще — Ваш кусок кода нужно вешать на открытие, о чем Андрей ниже и пишет.
[vba]

Код

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    For Each sh In ThisWorkbook.Sheets(Array(«Sheet1», «Sheet2», «Sheet3», «Sheet4»))
        With sh
            .ShowAllData
            .Outline.ShowLevels RowLevels:=1, ColumnLevels:=1
            .Unprotect «password»
            .Protect Password:=»password», Userinterfaceonly:=True, Scenarios:=True, AllowFiltering:=True
        End With
    Next
End Sub

[/vba]
Добавлено
Что-то мы с Ярославом сегодня друг дружку повторяем.
http://www.excelworld.ru/forum/2-22612-182272-16-1459762032


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

RAN

Дата: Понедельник, 04.04.2016, 15:26 |
Сообщение № 4

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

[vba]

Код

Private Sub Workbook_BeforeClose(Cancel As Boolean)

[/vba]
[vba]

Код

Userinterfaceonly:=True

[/vba]
Это как раз то, чего в супе не хватает! :D


Быть или не быть, вот в чем загвоздка!

 

Ответить

KIMVSR

Дата: Вторник, 05.04.2016, 12:37 |
Сообщение № 5

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 118


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

SLAVICK, _Boroda_, спасибо ребят, всё отлично работает! Огромное спасибо за помощь!

Единственное, скроллбары не сдвигаются вверх и влево после закрытия и сохранения. Т.е. если я сдвину скроллбары так, что таблицу вообще не будет видно и затем сохранюсь — при открытии таблица будет выглядеть именно так, как я её оставил. Эти скроллбары возможно как-то через VBA прописать, чтобы они в нулевую позицию возвращались?

И еще — Ваш кусок кода нужно вешать на открытие, о чем Андрей ниже и пишет.

Саш, на самом деле тот кусок кода у меня висит и на открытие, и на закрытие:
[vba]

Код

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    For Each sh In ThisWorkbook.Sheets(Array(«Sheet1», «Sheet2»))
        With sh
            .ShowAllData
            .Outline.ShowLevels RowLevels:=1, ColumnLevels:=1
            .Unprotect «password»
            .Protect Password:=»password», Userinterfaceonly:=True, Scenarios:=True, AllowFiltering:=True
        End With
    Next
End Sub

Private Sub Workbook_Open()
For Each sh In ThisWorkbook.Sheets(Array(«Sheet1», «Sheet2»))
    With sh
        .Unprotect «password»
        .Protect Password:=»password», Scenarios:=True, AllowFiltering:=True
        .EnableOutlining = True
    End With
Next
End Sub

[/vba]
Т.е. теперь код выглядит вот так. Работает так, как надо! :P

RAN, ваш намёк понял, исправил! Спасибо! :D

Сообщение отредактировал KIMVSRВторник, 05.04.2016, 13:11

 

Ответить

SLAVICK

Дата: Вторник, 05.04.2016, 14:23 |
Сообщение № 6

Группа: Модераторы

Ранг: Старожил

Сообщений: 2290


Репутация:

766

±

Замечаний:
0% ±


2019

. Эти скроллбары возможно как-то через VBA прописать, чтобы они в нулевую позицию возвращались?

Можно:
[vba][/vba]
Если есть закрепленные области — тогда сложнее нужно активировать ячейку ниже закрепленной строки и правее закрепленного столбца.


Иногда все проще чем кажется с первого взгляда.

 

Ответить

KIMVSR

Дата: Вторник, 05.04.2016, 14:30 |
Сообщение № 7

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 118


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

SLAVICK, закреплённые области есть: ячейка ниже закреплённой строки и правее закреплённого столбца получается G8 и на другом листе F8.

Скажите, пожалуйста, что обозначает этот код данные внутри скобок? Выбор ячейки A1?
Я прописал предложенный вами код на закрытие таким образом:
[vba]

[/vba]
Можно как-то в эту строчку добавить Sheet1 и Sheet2, если у меня разные ячейки, на которые я хочу ссылаться?
Sheet1 G8 и Sheet2 F8,

И огромное вам спасибо за помощь!!! yes

Сообщение отредактировал KIMVSRВторник, 05.04.2016, 14:35

 

Ответить

SLAVICK

Дата: Вторник, 05.04.2016, 14:37 |
Сообщение № 8

Группа: Модераторы

Ранг: Старожил

Сообщений: 2290


Репутация:

766

±

Замечаний:
0% ±


2019

то обозначает этот код данные внутри скобок? Выбор ячейки A1?

Так точно :D
если листов немного — тогда можно прописать условия для каждого, если много — самую правую и самую нижнюю ячейки.
Т.е. для

[vba][/vba]

Можно как-то в эту строчку добавить Sheet1 и Sheet2, если у меня разные ячейки

[vba]

Код

        .Unprotect «password»
        If .Name = «Sheet1» Then .Cells(8, «g»).Select Else .Cells(8, «f»).Select

[/vba]


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICKВторник, 05.04.2016, 14:46

 

Ответить

KIMVSR

Дата: Вторник, 05.04.2016, 15:18 |
Сообщение № 9

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 118


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

[vba]

Код

If .Name = «Sheet1» Then .Cells(8, «g»).Select Else .Cells(8, «f»).Select

[/vba]

Не совсем так. У меня на Sheet1 ячейка G8, а на Sheet2 — F8.
Тогда так?

[vba]

Код

If .Name = «Sheet1» Then .Cells(8, «G»).Select

[/vba]
[vba]

Код

If .Name = «Sheet2» Then .Cells(8, «F»).Select

[/vba]
Т.е. как бы две сразу строчки подряд в код на закрытие прописать? Или чушь спорол?
[moder]Код нужно оформлять кнопкой #. Исправил за Вас.[/moder]

Сообщение отредактировал SLAVICKВторник, 05.04.2016, 15:36

 

Ответить

SLAVICK

Дата: Вторник, 05.04.2016, 15:39 |
Сообщение № 10

Группа: Модераторы

Ранг: Старожил

Сообщений: 2290


Репутация:

766

±

Замечаний:
0% ±


2019

Не совсем так. У меня на Sheet1 ячейка G8, а на Sheet2 — F8.

И какая разница в результате — пробовали?
Что в лоб, что по лбу — результат тот же :D
Просто я написал:
[vba]

Код

Если имя листа «Sheet1» — тогда  .Cells(8, «G») иначе .Cells(8, «F»)

[/vba]
а Вы сделали вместо одной проверки — две. Так тоже можно. yes


Иногда все проще чем кажется с первого взгляда.

 

Ответить

KIMVSR

Дата: Вторник, 05.04.2016, 15:51 |
Сообщение № 11

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 118


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Работает, но не совсем так, как надо. Постараюсь объяснить:
У меня два листа (Sheet1 и Sheet2). На обоих листах есть таблицы.
Предположим, я сдвигаю скролл-бар на Sheet1 и затем перехожу на Sheet2 — там тоже сдвигаю скролл-бар.
Затем я закрываю файл, находясь на листе Sheet2.
Скрипт для Sheet2 срабатывает отлично: скролл-бар возвращается в указанную ячейку, скажем так.
Но вот сдвинутый скролл-бар на Sheet1 так и остаётся в сдвинутом положении после закрытия.

Короче говоря, код срабатывает только на том листе, на котором я нахожусь во время закрытия файла.
А я бы хотел, чтобы при закрытии скролл-бары обоих листов возвращались в исходную позицию.
Такое возможно?

Сообщение отредактировал KIMVSRВторник, 05.04.2016, 15:52

 

Ответить

_Boroda_

Дата: Вторник, 05.04.2016, 15:54 |
Сообщение № 12

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Вам не нужны Ифы, Вам нужно безо всяких условий тупо перебрать все листы
[vba]

Код

Sheets(«Sheet1»).Cells(8, «G»).Select
Sheets(«Sheet2»).Cells(8, «F»).Select

[/vba]
Добавлено.
Все верно ниже написано. Так не прокатит. Поторопился.


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

SLAVICK

Дата: Вторник, 05.04.2016, 16:00 |
Сообщение № 13

Группа: Модераторы

Ранг: Старожил

Сообщений: 2290


Репутация:

766

±

Замечаний:
0% ±


2019

А — понял.
В код добавить активацию листа:
[vba]

Код

With sh
       .Activate
       .Unprotect «password»
        If .Name = «Sheet1» Then .Cells(8, «g»).Select Else .Cells(8, «f»).Select

[/vba]


Иногда все проще чем кажется с первого взгляда.

 

Ответить

KIMVSR

Дата: Вторник, 05.04.2016, 16:07 |
Сообщение № 14

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 118


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Саш, твой вариант не работал, к сожалению. Т.е. всё было точно также, как и с ифом (срабатывал только на активном листе).
SLAVICK, работает так, как надо! Здорово!

Ребят, большущие вам спасибо! pray

 

Ответить

Если Вам нужно сохранить данные в конкретном документе, то поглядите на variables.

Sub docVariables()
    Dim aVar As Variable
    Dim isVarExist As Boolean
    Dim fName As String

    isVarExist = False
    fName = "Иванов Иван"
    ' Проверка на существование переменной
    For Each aVar In ActiveDocument.Variables
         If aVar.Name = "FullName" Then isVarExist = True: Exit For
    Next aVar
    ' Если переменная уже существует, то меняем её значение
    ' в противном случае создаём её
    If isVarExist Then
         ActiveDocument.Variables("FullName").Value = fName
    Else
        ActiveDocument.Variables.Add Name:="FullName", Value:=fName
    End If
    ' Обращение к переменной
    MsgBox ActiveDocument.Variables("FullName").Value
    ' Удаление переменной
    ActiveDocument.Variables("FullName").Delete
End Sub

Вот статья на эту тему: https://support.microsoft.com/en-us/kb/306281.
Данный способ подходит только MS Word, в Excel, к сожалению, variables нет. Для него можно предложить хранение значений на скрытых листах.

Понравилась статья? Поделить с друзьями:
  • Excel макрос получить ячейку
  • Excel макрос получить адрес ячейки
  • Excel макрос поиска ячейки
  • Excel макрос поиска текста в ячейке
  • Excel макрос поиска по книгам