Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как заставить макрос не выполняться после сохранения книги? - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как заставить макрос не выполняться после сохранения книги? (Макросы/Sub)
Как заставить макрос не выполняться после сохранения книги?
light26 Дата: Понедельник, 08.01.2018, 16:08 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1301
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
Доброго времени суток
Как "заставить" макрос выполняться один раз. В моем случае, после выбора листа и последующего сохранения книги, открываться она должна уже в сохраненном варианте, а не повторно следовать макросу[vba]
Код

Private Sub Workbook_Open()
Application.ScreenUpdating = False
     Sheets("Выбор").Visible = True
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
          Sheets("Приветствие").Visible = False
         Application.ScreenUpdating = True
End Sub
[/vba]
К сообщению приложен файл: 9210390.xls(71.5 Kb)


Я не волшебник. Я только учусь
 
Ответить
СообщениеДоброго времени суток
Как "заставить" макрос выполняться один раз. В моем случае, после выбора листа и последующего сохранения книги, открываться она должна уже в сохраненном варианте, а не повторно следовать макросу[vba]
Код

Private Sub Workbook_Open()
Application.ScreenUpdating = False
     Sheets("Выбор").Visible = True
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
          Sheets("Приветствие").Visible = False
         Application.ScreenUpdating = True
End Sub
[/vba]

Автор - light26
Дата добавления - 08.01.2018 в 16:08
bmv98rus Дата: Понедельник, 08.01.2018, 16:37 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 1258
Репутация: 214 ±
Замечаний: 0% ±

Excel 2013/2016
При сохранении (workbook_beforesave) записать признак в одну из потаенных ячеек и потом проверить это признак при открытии, если он есть , то не продолжать.
Ну или инверсировать это.
Или утсановить это признак при выполнении workbook_open? Это даже лучше, для отладки и подготовки шаблона.


Сообщение отредактировал bmv98rus - Понедельник, 08.01.2018, 16:40
 
Ответить
СообщениеПри сохранении (workbook_beforesave) записать признак в одну из потаенных ячеек и потом проверить это признак при открытии, если он есть , то не продолжать.
Ну или инверсировать это.
Или утсановить это признак при выполнении workbook_open? Это даже лучше, для отладки и подготовки шаблона.

Автор - bmv98rus
Дата добавления - 08.01.2018 в 16:37
light26 Дата: Понедельник, 08.01.2018, 17:00 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1301
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
bmv98rus, для особо одаренных: перед выполнением макроса вставляю строку, которая проверяет есть ли в А1 листа 1 какое-либо значение и, если есть, то end sub. А для workbook_beforesave прописываю А1="5" (например). Я все правильно понял?


Я не волшебник. Я только учусь
 
Ответить
Сообщениеbmv98rus, для особо одаренных: перед выполнением макроса вставляю строку, которая проверяет есть ли в А1 листа 1 какое-либо значение и, если есть, то end sub. А для workbook_beforesave прописываю А1="5" (например). Я все правильно понял?

Автор - light26
Дата добавления - 08.01.2018 в 17:00
light26 Дата: Понедельник, 08.01.2018, 17:20 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1301
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
Где я допустил ошибку?[vba]
Код

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
     Sheets("Выбор").Visible = True
  Sheets("Выбор").Select
    Range("A1").FormulaR1C1 = "5"
    Sheets("Выбор").Visible = False
     Application.ScreenUpdating = True
End Sub

Private Sub Workbook_Open()
Application.ScreenUpdating = False
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
If ActiveSheet.Range("A1").Value = "5" Then Exit Sub
Else
Application.ScreenUpdating = False
     Sheets("Выбор").Visible = True
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
          Sheets("Приветствие").Visible = False
         Application.ScreenUpdating = True
End If
End Sub
[/vba]


Я не волшебник. Я только учусь

Сообщение отредактировал light26 - Понедельник, 08.01.2018, 17:45
 
Ответить
СообщениеГде я допустил ошибку?[vba]
Код

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
     Sheets("Выбор").Visible = True
  Sheets("Выбор").Select
    Range("A1").FormulaR1C1 = "5"
    Sheets("Выбор").Visible = False
     Application.ScreenUpdating = True
End Sub

Private Sub Workbook_Open()
Application.ScreenUpdating = False
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
If ActiveSheet.Range("A1").Value = "5" Then Exit Sub
Else
Application.ScreenUpdating = False
     Sheets("Выбор").Visible = True
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
          Sheets("Приветствие").Visible = False
         Application.ScreenUpdating = True
End If
End Sub
[/vba]

Автор - light26
Дата добавления - 08.01.2018 в 17:20
bmv98rus Дата: Понедельник, 08.01.2018, 17:49 | Сообщение № 5
Группа: Проверенные
Ранг: Старожил
Сообщений: 1258
Репутация: 214 ±
Замечаний: 0% ±

Excel 2013/2016
ошибки
1. проверять надо прежде выполнения всего что в Workbook_Open
2. А какой при этом ActiveSheet? Надежда на то что остался тот который при записи был?
3. не Workbook_BeforeClose а Workbook_BeforeSave
4. Как написал, лучше тригер писать после выполнения того что более выполнять не надо
5. синтаксиси
[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then Exit Sub
End If
[/vba] end if или не нужен или нужно Exit Sub переносить на другую строку или отделять от then разделителем |
6. я б написал так
[vba]
Код
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
If Sheet100.Range("A1").Value <> 5 Then
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
    Sheets("Приветствие").Visible = False
    Sheet100.Range("A1").Value = 5
End If
        Application.ScreenUpdating = True
End Sub
[/vba] заменив Sheet100 на что либо присутствующее или скрытый новый лист.


Сообщение отредактировал bmv98rus - Понедельник, 08.01.2018, 18:02
 
Ответить
Сообщениеошибки
1. проверять надо прежде выполнения всего что в Workbook_Open
2. А какой при этом ActiveSheet? Надежда на то что остался тот который при записи был?
3. не Workbook_BeforeClose а Workbook_BeforeSave
4. Как написал, лучше тригер писать после выполнения того что более выполнять не надо
5. синтаксиси
[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then Exit Sub
End If
[/vba] end if или не нужен или нужно Exit Sub переносить на другую строку или отделять от then разделителем |
6. я б написал так
[vba]
Код
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
If Sheet100.Range("A1").Value <> 5 Then
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
    Sheets("Приветствие").Visible = False
    Sheet100.Range("A1").Value = 5
End If
        Application.ScreenUpdating = True
End Sub
[/vba] заменив Sheet100 на что либо присутствующее или скрытый новый лист.

Автор - bmv98rus
Дата добавления - 08.01.2018 в 17:49
light26 Дата: Понедельник, 08.01.2018, 17:57 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1301
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
Sheet100
В "Shiit100" число является порядковым номером листа, так ведь?


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Sheet100
В "Shiit100" число является порядковым номером листа, так ведь?

Автор - light26
Дата добавления - 08.01.2018 в 17:57
bmv98rus Дата: Понедельник, 08.01.2018, 18:04 | Сообщение № 7
Группа: Проверенные
Ранг: Старожил
Сообщений: 1258
Репутация: 214 ±
Замечаний: 0% ±

Excel 2013/2016
нет это имя объекта. Вам проще привычным Sheets("ИМЯ") использовать. и я там строчку вставил , забыл ей в прошлый раз.
 
Ответить
Сообщениенет это имя объекта. Вам проще привычным Sheets("ИМЯ") использовать. и я там строчку вставил , забыл ей в прошлый раз.

Автор - bmv98rus
Дата добавления - 08.01.2018 в 18:04
light26 Дата: Понедельник, 08.01.2018, 18:07 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1301
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
проверять надо прежде выполнения всего что в Workbook_Open
так я так и делаю
А какой при этом ActiveSheet? Надежда на то что остался тот который при записи был?
Ну я понял так, что после [vba]
Код
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
[/vba] можно применить ActiveSheet
3. не Workbook_BeforeClose а Workbook_BeforeSave
Я подумал, что раз уж нужно прописать 5 после закрытия файла, то пусть будет Workbook_BeforeClose
If ActiveSheet.Range("A1").Value = "5" Then Exit Sub
End If
Так тоже ругается


Я не волшебник. Я только учусь
 
Ответить
Сообщение
проверять надо прежде выполнения всего что в Workbook_Open
так я так и делаю
А какой при этом ActiveSheet? Надежда на то что остался тот который при записи был?
Ну я понял так, что после [vba]
Код
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
[/vba] можно применить ActiveSheet
3. не Workbook_BeforeClose а Workbook_BeforeSave
Я подумал, что раз уж нужно прописать 5 после закрытия файла, то пусть будет Workbook_BeforeClose
If ActiveSheet.Range("A1").Value = "5" Then Exit Sub
End If
Так тоже ругается

Автор - light26
Дата добавления - 08.01.2018 в 18:07
light26 Дата: Понедельник, 08.01.2018, 18:12 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1301
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
[vba]
Код
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
If Sheets("Выбор").Range("A1").Value <> "5" Then
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
    Sheets("Приветствие").Visible = False
End If
        Application.ScreenUpdating = True
End Sub
[/vba] не дал желаемого результата :(
По-прежнему открывается лист "Выбор" только с цифрой 5 в А1


Я не волшебник. Я только учусь
 
Ответить
Сообщение[vba]
Код
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
If Sheets("Выбор").Range("A1").Value <> "5" Then
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
    Sheets("Приветствие").Visible = False
End If
        Application.ScreenUpdating = True
End Sub
[/vba] не дал желаемого результата :(
По-прежнему открывается лист "Выбор" только с цифрой 5 в А1

Автор - light26
Дата добавления - 08.01.2018 в 18:12
bmv98rus Дата: Понедельник, 08.01.2018, 18:17 | Сообщение № 10
Группа: Проверенные
Ранг: Старожил
Сообщений: 1258
Репутация: 214 ±
Замечаний: 0% ±

Excel 2013/2016
Так тоже ругается

это ка краз как неправильно
или[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then Exit Sub
[/vba]или[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then
   Exit Sub
End If
[/vba]или[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then | Exit Sub
End If
[/vba]или совсем безуиное[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then | Exit Sub | End If
[/vba]
но выйдя так из подпрограммы вы оставите
[vba]
Код
Application.ScreenUpdating = False
[/vba], что печально.
 
Ответить
Сообщение
Так тоже ругается

это ка краз как неправильно
или[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then Exit Sub
[/vba]или[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then
   Exit Sub
End If
[/vba]или[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then | Exit Sub
End If
[/vba]или совсем безуиное[vba]
Код
If ActiveSheet.Range("A1").Value = "5" Then | Exit Sub | End If
[/vba]
но выйдя так из подпрограммы вы оставите
[vba]
Код
Application.ScreenUpdating = False
[/vba], что печально.

Автор - bmv98rus
Дата добавления - 08.01.2018 в 18:17
light26 Дата: Понедельник, 08.01.2018, 18:19 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1301
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
Нашел где собака порылась ))) Оказывается иногда мозги включать нужно ))))
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
это тут совсем не надо и тогда
[vba]
Код
Private Sub Workbook_Open()
Application.ScreenUpdating = False

If Sheets("Выбор").Range("A1").Value <> "5" Then
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
    Sheets("Приветствие").Visible = False
End If
        Application.ScreenUpdating = True
End Sub
[/vba]


Я не волшебник. Я только учусь

Сообщение отредактировал light26 - Понедельник, 08.01.2018, 18:19
 
Ответить
СообщениеНашел где собака порылась ))) Оказывается иногда мозги включать нужно ))))
Sheets("Выбор").Visible = True
Sheets("Выбор").Select
это тут совсем не надо и тогда
[vba]
Код
Private Sub Workbook_Open()
Application.ScreenUpdating = False

If Sheets("Выбор").Range("A1").Value <> "5" Then
    Sheets("Зеленый").Visible = False
    Sheets("Белый").Visible = False
    Sheets("Приветствие").Visible = False
End If
        Application.ScreenUpdating = True
End Sub
[/vba]

Автор - light26
Дата добавления - 08.01.2018 в 18:19
light26 Дата: Понедельник, 08.01.2018, 18:22 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1301
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
что печально.
Ну да, печально. Но ее же можно до Then прописать?


Я не волшебник. Я только учусь
 
Ответить
Сообщение
что печально.
Ну да, печально. Но ее же можно до Then прописать?

Автор - light26
Дата добавления - 08.01.2018 в 18:22
light26 Дата: Понедельник, 08.01.2018, 18:23 | Сообщение № 13
Группа: Друзья
Ранг: Старожил
Сообщений: 1301
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
Спасибо, Михаил. Очень признателен за помощь


Я не волшебник. Я только учусь
 
Ответить
СообщениеСпасибо, Михаил. Очень признателен за помощь

Автор - light26
Дата добавления - 08.01.2018 в 18:23
bmv98rus Дата: Понедельник, 08.01.2018, 18:31 | Сообщение № 14
Группа: Проверенные
Ранг: Старожил
Сообщений: 1258
Репутация: 214 ±
Замечаний: 0% ±

Excel 2013/2016
можно до Then прописать?

после и до Exit SUB
В те давние года, когда я учился, подобные выходы из циклов или подпрограмм считались плохим тоном, а некоторыми языками и не поддерживались, по сему полее правильная конструкция у меня в пятом сообщении. Даже читается проще, то делаем, а то нет, а не если да, то бежим от сюда :-)
 
Ответить
Сообщение
можно до Then прописать?

после и до Exit SUB
В те давние года, когда я учился, подобные выходы из циклов или подпрограмм считались плохим тоном, а некоторыми языками и не поддерживались, по сему полее правильная конструкция у меня в пятом сообщении. Даже читается проще, то делаем, а то нет, а не если да, то бежим от сюда :-)

Автор - bmv98rus
Дата добавления - 08.01.2018 в 18:31
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как заставить макрос не выполняться после сохранения книги? (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2018 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!