Зупинка виконання Excel макросу
Макроси в Excel є потужним інструментом, що дозволяє автоматизувати завдання та покращити продуктивність роботи. Однак іноді може виникнути необхідність зупинити виконання макросу, особливо якщо він виконується з помилками або займає багато часу.
Існує кілька простих способів припинити роботу макросу в Excel. Один із них - використовувати комбінацію клавіш Ctrl+Break. Це призведе до зупинки виконання макросу та переключення на режим розробки, де ви можете проаналізувати код макросу та виправити помилку.
Якщо комбінація клавіш Ctrl+Break не допомогла зупинити макрос; можна скористатися іншим методом. У меню "Розробник" виберіть "Переключиться в режим конструктора макросів" і натисніть кнопку "Зупинити роботу макросу". Це призведе до негайної зупинки виконання макросу.
Якщо ви бажаєте передбачити можливість зупинення макросу всередині його коду, ви можете використовувати умовні оператори. Наприклад, ви можете задати змінну, яка перевірятиметься на кожній ітерації макросу, і якщо вона набуває певного значення, виконання макросу буде припинено. Не забудьте оновити змінну відповідним чином усередині макросу, щоб уникнути зависання чи нескінченного циклу.
Зупинка виконання Excel макросу
Існує кілька простих способів зупинити виконання Excel макросу:
- Натисніть кнопку "Зупинити" на панелі інструментів VBA. Це зупинить виконання макросу і поверне керування користувачеві.
- Використовуйте комбінацію клавіш Ctrl+Break на клавіатурі. Це також припинить виконання макросу та поверне керування.
- Додати до макросу спеціальну команду Exit Sub або Exit Function у потрібному місці. Це відразу припинить виконання макросу і вийде із нього.
Зверніть увагу, що припинення виконання макросу може призвести до непередбачуваних результатів, тому варто бути обережним та використовувати ці способи лише за необхідності.
Важливо пам'ятати, що зупинка виконання макросу має бути здійснена акуратно і в безпечному місці коду. Наприклад, якщо макрос виконує якусь складну операцію, краще припинити його роботу після завершення цієї операції або перед наступною важливою командою.
Таким чином, зупинка виконання Excel макросу є досить простою і може бути виконана декількома способами. Важливо розуміти, що ручне припинення виконання макросу може призвести до небажаних наслідків, тому варто використовувати цю можливість обережно і лише в крайніх випадках.
Простий спосіб припинити роботу макросу в Excel
Якщо вам потрібно зупинити виконання макросу в Excel, є кілька простих способів, які допоможуть вам впоратися з цим завданням.
Перший спосіб – натиснути на кнопку "Зупинити" під час виконання макросу. Для цього відкрийте вкладку "Розробник" у меню Excel, виберіть "Зупинити" та натисніть на неї. Це призведе до зупинення макросу та припинення його роботи.
Другий спосіб – використовувати поєднання клавіш "Ctrl + Pause Break". Натискання на ці клавіші також призведе до зупинки макросу та припинення його виконання.
Якщо ви не бачите вкладку "Розробник" у меню Excel, необхідно включити її. Для цього виберіть "Файл" у верхньому лівому куті програми, а потім виберіть "Параметри". У вікні виберіть "Стужку" і позначте галочкою "Розробник" у списку вкладок.
Пам'ятайте, що зупинка макросу може спричинити некоректну роботу вашої роботи в Excel. Тому перед зупинкою макросу рекомендується зберігати вашу роботу, щоб уникнути втрати даних.
Як перервати виконання макросу в Excel без збереження змін
Іноді виникають ситуації, коли необхідно перервати виконання макросу в Excel і не зберігати зміни. Це може статися, якщо макрос викликає небажані чи непередбачені наслідки, і ви хочете зупинити його виконання та повернутися до вихідного стану документа. У такому разі використовуйте такі кроки.
- Натисніть комбінацію клавіш Ctrl+Break на клавіатурі. Це перерве виконання макросу і поверне вас до основного інтерфейсу Excel.
- Виберіть опцію "Не зберігати" у спливаючому вікні "Зберегти як". Це запобігатиме збереженню внесених макросом змін до документа.
- Закрийте файл без збереження змін, вибравши опцію "Ні"Коли Excel запропонує зберегти зміни. Це поверне вас до оригінального документа без внесених макросом змін.
Якщо вам не вдається перервати виконання макросу за допомогою комбінації Ctrl+Break, спробуйте наступний метод:
- Натисніть кнопку "Стоп" у вкладці "Розробник" на верхній панелі інструментів Excel.
- Виберіть опцію "Не зберігати" у спливаючому вікні "Зберегти як".
- Закрийте файл без збереження змін, вибравши опцію "Ні", коли Excel запропонує зберегти зміни.
Тепер ви знаєте, як перервати виконання макросу в Excel і не зберігати внесені ним зміни в документі. Це дозволить вам уникнути проблем та повернутися до вихідного стану файлу.
Припинення роботи макросу в Excel без втрати даних
Макроси в Excel являють собою автоматизовані дії, які можуть значно спростити виконання завдань, що повторюються. Однак іноді виникає необхідність припинити роботу макросу в процесі виконання, щоб уникнути втрати даних або небажаних змін.
Існує кілька способів зупинити виконання макросу в Excel:
1. Використовуйте комбінацію клавіш
Ви можете зупинити макрос, натиснувши комбінацію клавіш Ctrl+Break на клавіатурі.Це призведе до негайної зупинки макросу та повернення до робочої книги Excel. Однак, ця дія може призвести до втрати незбережених даних, тому рекомендується зберегти робочу книгу перед використанням цієї комбінації клавіш.
2. Використовуйте діалогове вікно "Переривання макросу"
Якщо ваш макрос зациклений або продовжує працювати довше за очікуване, Excel може показати діалогове вікно "Переривання макросу". У цьому вікні можна вибрати "Прорвати" для негайної зупинки макросу або "Продовжити" для продовження виконання макросу.
3. Використовуйте команду "Зупинити"
У деяких випадках ви можете вставити команду "Зупинити" безпосередньо в код макросу. Ця команда призведе до припинення виконання макросу у місці, де вона була вставлена.
Примітка: Якщо ви використовуєте команду "Зупинити" у своєму макросі, переконайтеся, що код макросу був збережений до його виконання, щоб уникнути можливої втрати даних або небажаних змін.
Знання цих способів припинення роботи макросу в Excel дозволить зберегти цінні дані і уникнути потенційних неприємностей у разі, якщо макрос виконується довше, ніж планувалося. Використовуйте ці інструменти відповідно до ситуації, щоб ефективно управляти макросами в Excel.
Як зупинити макрос у Excel із збереженням змін
В Excel макроси дозволяють автоматизувати завдання, що повторюються, і спростити роботу з великими обсягами даних. Однак іноді виникає необхідність зупинити виконання макросу в процесі роботи. Важливо знати, як це зробити, щоб зберегти всі зміни, внесені макросом. У цій статті ми розглянемо простий спосіб зупинити макрос у Excel із збереженням змін.
Для того, щоб зупинити макрос у Excel із збереженням змін, необхідно виконати такі кроки:
| Крок 1: | Натисніть комбінацію клавіш Ctrl + Break або Ctrl + Pause. Це зупинить виконання макросу та відкриє режим налагодження. |
| Крок 2: | У режимі налагодження натисніть кнопку End на панелі інструментів. Це припинить виконання макросу та поверне вас до робочого аркуша. |
| Крок 3: | Збережіть усі зміни, внесені макросом, натиснувши комбінацію клавіш Ctrl + S або вибравши пункт меню Файл - Зберегти. |
Тепер ви знаєте, як зупинити макрос в Excel зі збереженням змін. Цей простий спосіб дозволить вам контролювати виконання макросів і зберігати всі зміни, щоб не втратити цінні дані.
Спосіб припинити виконання макросу в Excel без перезапуску програми
При роботі з макросами в Excel може виникнути необхідність припинити виконання макросу під час його роботи. Це може бути корисно, якщо макрос виконується занадто довго, або якщо він викликає помилки або небажану поведінку програми.
Існує кілька способів примусово зупинити виконання макросу в Excel, але один з найпростіших і найнадійніших – використання клавіш. Ctrl+Pause. Натискання цього сполучення клавіш призведе до зупинки виконання макросу та переведення програми в режим паузи.
Після того, як виконання макросу було зупинено, можна змінити його код або виправити помилку, після чого можна продовжити виконання макросу. Для цього необхідно вибрати опцію "Продовжити" у діалоговому вікні "Перервати макрос" або натиснути клавішу F5 на клавіатурі.
Якщо це не допомагає, а макрос продовжує виконуватись або викликати помилки, можна спробувати зупинити його виконання за допомогою команди End у коді макросу. Для цього необхідно вставити рядок End у потрібному місці коду макросу. Ця команда негайно припинить виконання макросу і перейде до наступної інструкції або завершить роботу повністю, залежно від контексту виконання.
Важливо пам'ятати, що припинення виконання макросу за допомогою команди End може призвести до втрати даних або некоректної роботи програми. Тому перед використанням цієї команди рекомендується зберегти всі зміни та простежити, щоб вона не призводила до небажаних наслідків.
Як уникнути виконання макросу в Excel при відкритті файлу
Виконання макросів в Excel може бути корисним, однак іноді користувачі можуть зіткнутися з ситуацією, коли макроси шкідливі або необхідно запобігти їх автоматичному виконанню. Ось кілька способів, які допоможуть вам уникнути виконання макросу під час відкриття файлу в Excel.
1. Перевірте параметри безпеки: відкрийте Excel і виберіть "Файл" > "Параметри" > "Центр безпеки". Тут можна встановити рівень безпеки, щоб Excel автоматично блокував макроси при відкритті файлів з підозрілим вмістом.
2. Вимкніть макроси: якщо ви хочете повністю уникнути виконання макросів, ви можете вимкнути їх. Для цього відкрийте Excel та виберіть "Файл" > "Параметри" > "Центр керування безпекою" та натисніть кнопку "Налаштування макросів". Тут встановіть прапорець "Завжди відключати всі макроси без попередження" та збережіть зміни.
3. Використовуйте файли у форматі .xlsx: якщо у вас є вибір у форматі файлу, збережіть документ у форматі .xlsx замість .xlsm або .xlsb. Файли .xlsx не можуть містити макроси, тому вони не будуть автоматично виконуватися під час відкриття.
4. Відкрийте файли в режимі читання: при відкритті файлу в режимі читання макроси будуть автоматично вимкнені і не виконуються. Для цього виберіть файл, натисніть правою кнопкою миші та оберіть "Відкрити за допомогою" > "Режим для читання".
Використовуючи вказані способи, ви зможете уникнути виконання макросів при відкритті файлу в Excel та убезпечити свою роботу з даними. Це особливо важливо при отриманні файлів від недовірених джерел або під час роботи з конфіденційною інформацією.
Зупинити виконання макросу VBA
Чи можливо якось зупинити виконання макросу без завершення процесу, якщо він, припустимо, зайшов у нескінченний цикл і викликав зависання всього Excel?
16.5k 8 8 золотих знаків 27 27 срібних знаків 56 56 бронзових знаківБез коду якось не дуже зрозуміла ситуація та умови в яких виникає нескінченний цикл чи ви говорите про будь-які варіанти коли потрібна "срібна куля"?
Можна в циклі використовувати DoEvents, тоді думаю його можна зупинити без особливих зусиль. Якщо, звичайно, мова про це.
Для примусового ручного зупинення VBA-коду використовується поєднання клавіш Ctrl-Break. Однак якщо в коді немає DoEvents, можна дуже довго чекати, поки це поєднання проб'ється до дебагера.
При написанні/налагодженні DoEvents. Але в робочому коді не повинно бути можливості зациклювання. Наприклад, перевірка значення змінної: If bf=True Then Exit For
1 відповідь 1
Один із варіантів контролю нескінченного циклу це контроль за часом. Тобто. задаємо максимально допустимий інтервал часу після закінчення якого відбувається вихід з циклу. Наприклад.
TimeInterval = 25 'секунд t1 = Timer ' задаємо початковий час Do ' нескінченний цикл tElepsed = Timer - t1 If tElapsed > TimeInterval The Exit Do End if 'тіло циклу ' Loop
Подібні
Підписатися на стрічку
Для підписки на стрічку скопіюйте та вставте це посилання у вашу програму для читання RSS.
Site design/logo © 2025 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2025.1.7.20880
Як скасувати дії макросу
Багато хто з тих, хто програмує в VBA знають, що після дій макросу зникає можливість скасування дій. І якщо зі скасуванням тих дій, які були скоєні до виконання макросу, точно можна розпрощатися (неможливо буде це зробити), то скасувати дії макросу можливо. І рано чи пізно кожен програмуючий у VBA ставить питання: як можна скасувати дії, вчинені макросом? Спочатку треба зрозуміти, в яких ситуаціях це нам треба. Наприклад, було виконано код, який зіпсував або видалив дані у файлі, але ці дані ще потрібні. Найпростіше, що можна зробити, це закрити файл без збереження і відкрити заново. Всі дані будуть на місці (якщо, звичайно, код не мав рядка, що зберігає файл).Другий спосіб: це перед виконанням макросу робити резервну копію файлу – тоді Ваші вихідні дані завжди будуть цілі.
Але як зробити відміну дій макросу через стандартну кнопку на панелі або поєднанням клавіш Ctrl + Z і чи можна? Відповідь – можна. Але одразу питання: а наскільки це потрібно? В яких ситуаціях це може стати в нагоді? Я навскідку відразу не сказав би, якби не був розробником програм та надбудов у середовищі Microsoft Excel. Саме в надбудовах скасування дій найбільш затребуване, як на мене. Наприклад, надбудова поєднує комірки. Об'єднали випадково в. У стандартній ситуації після такого макросу не можна скасувати дії. Закривати файл без збереження? Якось негарно виходить, якщо продукт є комерційним. І тоді доводиться перекручуватися і намагатися уможливити скасування дій макросу. У моїй надбудові MulTEx у деяких командах скасування дій команд якраз і застосовується. Найбільш поширене рішення щодо скасування дій макросу полягає в запам'ятовуванні властивостей комірок, що змінюються:
'Створюємо свій тип даних користувача Type SaveRange vFormula As Variant sAddr As String lColor As Long lColorIndex As Long End Type 'Змінні для запам'ятовування даних Public wbWBook As Excel.Workbook Public wsSh As Excel.Worksheet Public vOldVals() As SaveRange '--------------------------------------------------------------------------------------- ' Procedure : Fill_Numbers 'Purpose: Основна процедура. Це той код, який вносить зміни на лист ' і дії якого нам необхідно скасувати ' Процедура заповнює виділені осередки номерами ' і змінює колір заливки '--------------------------------------------------------------------------------------- Sub Fill_Numbers() Dim rCell As Range, li As Long ' Спочатку запам'ятовуємо значення виділених осередків на аркуші ReDim vOldVals(1 To Selection.Count) 'Запам'ятовуємо активну книгу 'це на випадок, якщо скасування дій буде здійснюватися з іншої книги Set wbWBook = ActiveWorkbook 'Запам'ятовуємо активний лист 'на випадок, якщо скасування дій буде здійснюватися з іншого аркуша Set wsSh = ActiveSheet 'Запам'ятовуємо значення (заносимо до масиву) li = 1 For Each rCell In Selection 'Запам'ятовуємо адресу осередку vOldVals(li).sAddr = rCell.Address 'запам'ятовуємо формулу(якщо немає формули - значення) vOldVals(li).vFormula = rCell.Formula 'Запам'ятовуємо колір заливки осередку vOldVals(li).lColor = rCell.Interior.Color 'запам'ятовуємо індекс кольору заливки (щоб на заливати безбарвні осередки) vOldVals(li).lColorIndex = rCell.Interior.ColorIndex li = li + 1 Next rCell '====================================== 'Виконуємо основні дії (власне той код, який треба буде скасувати) li = 1 For Each rCell In Selection rCell = li rCell.Interior.ColorIndex = li li = li + 1 Next rCell '====================================== 'Призначаємо стандартному виклику скасування дій виконання нашого макросу повернення значень Application.OnUndo "Скасувати заповнення осередків номерами", "Restore_Vals" End Sub '--------------------------------------------------------------------------------------- ' Procedure : Restore_Vals ' Purpose : Процедура скасування дії (повернення значень) '--------------------------------------------------------------------------------------- Sub Restore_Vals() Dim li As Long 'У разі непередбаченої помилки переходимо на мітку 'і показуємо повідомлення про помилку On Error GoTo Erreble 'Активуємо книгу, в якій було зроблено зміни wbWBook.Activate 'Активуємо лист, в якому було зроблено зміни wsSh.Activate 'Повертаємо значення For li = 1 To UBound(vOldVals) Range(vOldVals(li).sAddr).Formula = vOldVals(li).vFormula Якщо заливка була безбарвна, то ColorIndex = xlNone 'значить виставляємо безбарвність If Not vOldVals(li).lColorIndex = xlNone Then Range(vOldVals(li).sAddr).Interior.Color = vOldVals(li).lColor Else Якщо колір був - повертаємо його Range(vOldVals(li).sAddr).Interior.ColorIndex = xlNone End If Next li Exit Sub 'Показуємо повідомлення про неможливість скасування дії Erreble: MsgBox "Не можна скасувати дію!", vbCritical, "Error" End Sub
'Створюємо свій тип даних Type SaveRange vFormula As Variant sAddr As String lColor As Long lColorIndex As Long End Type 'Змінні для запам'ятовування даних Public wbWBook As Excel.Workbook Public wsSh As Excel.Worksheet Public vOldVals() -------------------------------------------------- --------------------------------- ' Procedure : Fill_Numbers ' Purpose : Основна процедура.Це той код, який вносить зміни на лист ' і дії якого нам необхідно скасувати ' Процедура заповнює виділені осередки номерами ' і змінює колір заливки '---------------------- -------------------------------------------------- --------------- Sub Fill_Numbers() Dim rCell As Range, li As Long ' Спочатку запам'ятовуємо значення виділених осередків на аркуші ReDim vOldVals(1 To Selection.Count) 'Запам'ятовуємо активну книгу 'це на випадок, якщо скасування дій буде здійснюватися з іншої книги Set wbWBook = ActiveWorkbook 'Запам'ятовуємо активний лист 'на випадок, якщо скасування дій буде здійснюватися з іншого аркуша Set wsSh = ActiveSheet 'Запам'ятовуємо значення(заносимо до масиву) li = 1 For Each rCell In Selection 'запам'ятовуємо адресу осередку vOldVals(li).sAddr = rCell.Address 'запам'ятовуємо формулу(якщо немає формули - значення) vOldVals(li).vFormula = rCell.Formula 'запам'ятовуємо колір заливки осередку vOldVals(li).lColor = rCell.Interior.Color 'запам'ятовуємо індекс кольору заливки(щоб на заливати безбарвні осередки) vOldVals(li).lColoInd ColorIndex li = li + 1 Next rCell '====================================== 'Виконуємо основні дії (власне той код, який треба буде скасувати) li = 1 For Each rCell In Selection '====================================== 'Призначаємо стандартному виклику скасування дій виконання нашого макросу повернення значень Application.OnUndo "Скасувати заповнення осередків номерами", "Restore_Vals" End Sub '---------------------------------- -------------------------------------------------- --- ' Procedure : Restore_Vals ' Purpose : Процедура скасування дії (повернення значень) '-------------------------------- -------------------------------------------------- ----- Sub Restore_Vals() Dim li As Long 'У разі непередбаченої помилки переходимо на мітку 'і показуємо повідомлення про помилку On Error GoTo Erreble 'Активуємо книгу, в якій було зроблено зміниwbWBook.Activate 'Активуємо лист, в якому були зроблені зміни wsSh.Activate 'Повертаємо значення For li = 1 To UBound(vOldVals) Range(vOldVals(li).sAddr).Formula = vOldVals(li).vFormula 'якщо заливка була безбарвна , то ColorIndex = xlNone 'значить виставляємо безбарвність If Not vOldVals(li).lColorIndex = xlNone Then Range(vOldVals(li).sAddr).Interior.Color = vOldVals(li).lColor Else 'якщо колір був - повертаємо його Ran vOldVals (li).sAddr).
Коментарі до коду я намагався зробити максимально докладними, тому думаю, що більше нема чого роз'яснювати. До того ж за стародавньою традицією я доклав до статті приклад з цим кодом :) Єдине, що можу додати: тип SaveRange може бути доповнений ще будь-якими змінними, крім vFormula , sAddr і lColor . Наприклад колір кордону комірки, колір шрифту і т.д. Все залежить від того, які зміни Ви робитимете кодом і що захочете потім повернути.
Скасувати дії макросу. (62,0 КіБ, 3 607 завантажень)
Код, наведений вище, безперечно хороший, але якщо кількість змінних осередків досить велика, то код буде дуже уповільнювати роботу. Тому якщо є можливість додавати/видаляти аркуші в книгах, то можна схитрувати: зробити резервну копію аркуша, аркуш зробити дуже прихованим і як тільки буде потрібно скасування дії - повернути цей аркуш, видаливши вихідний (з уже зіпсованими даними):
'Змінні для запам'ятовування даних Public wbWBook As Workbook Public wsSh As Worksheet, wsActSh As Worksheet, sSh_Name As String, lShPoz As Long '--------------------------------------------------------------------------------------- ' Procedure : Fill_Numbers 'Purpose: Основна процедура. Це той код, який вносить зміни на лист ' і дії якого нам необхідно скасувати ' Процедура заповнює виділені осередки номерами ' і змінює колір заливки '--------------------------------------------------------------------------------------- Sub Fill_Numbers() Dim rCell As Range, li As Long 'Запам'ятовуємо активну книгу 'це на випадок, якщо скасування дій буде здійснюватися з іншої книги Set wbWBook = ActiveWorkbook 'Запам'ятовуємо активний лист 'на випадок, якщо скасування дій буде здійснюватися з іншого аркуша Set wsActSh = ActiveSheet lShPoz = wsActSh.Index sSh_Name = wsActSh.Name Application.ScreenUpdating = 0 wsActSh.Copy , wbWBook.Sheets(wbWBook.Sheets.Count) Set wsSh = wbWBook.Sheets(wbWBook.Sheets.Count) wsSh.Visible = xlVeryHidden wsActSh.Activate Application.ScreenUpdating = 1 '====================================== 'Виконуємо основні дії (власне той код, який треба буде скасувати) li = 1 For Each rCell In Selection rCell = li rCell.Interior.ColorIndex = li li = li + 1 Next rCell '====================================== 'Призначаємо стандартному виклику скасування дій виконання нашого макросу повернення значень Application.OnUndo "Скасувати заповнення осередків номерами", "Restore_Vals" End Sub '--------------------------------------------------------------------------------------- ' Procedure : Restore_Vals ' Purpose : Процедура скасування дії (повернення значень) '--------------------------------------------------------------------------------------- Sub Restore_Vals() 'У разі непередбаченої помилки переходимо на мітку 'і показуємо повідомлення про помилку On Error GoTo Erreble Application.ScreenUpdating = 0 'Активуємо книгу, в якій було зроблено зміни wbWBook.Activate 'робимо видимим резервний лист wsSh.Visible = -1 'Видаляємо вихідний лист, дані в якому вже змінені Application.DisplayAlerts = 0 wsActSh.Delete Application.DisplayAlerts = 1 'призначаємо резервному листу ім'я вихідного wsSh.Name = sSh_Name wsSh.Move wbWBook.Sheets(lShPoz) 'Активуємо резервний лист wsSh.Activate Application.ScreenUpdating = 0 Exit Sub 'Показуємо повідомлення про неможливість скасування дії Erreble: MsgBox "Не можна скасувати дію!", vbCritical, "www.excel-vba.ru" End Sub
'Змінні для запам'ятовування даних Public wbWBook As Workbook Public wsSh As Worksheet, wsActSh As Worksheet, sSh_Name As String, lShPoz As Long '------------------------ -------------------------------------------------- ------------- ' Procedure : Fill_Numbers ' Purpose : Основна процедура.Це той код, який вносить зміни на лист ' і дії якого нам необхідно скасувати ' Процедура заповнює виділені осередки номерами ' і змінює колір заливки '---------------------- -------------------------------------------------- --------------- Sub Fill_Numbers() Dim rCell As Range, li As Long 'Запам'ятовуємо активну книгу 'це на випадок, якщо скасування дій буде здійснюватися з іншої книги Set wbWBook = ActiveWorkbook 'Запам'ятовуємо активний лист 'на випадок, якщо скасування дій буде здійснюватися з іншого аркуша Set wsActSh = ActiveSheet lShPoz = wsActSh.Index sSh_Name = wsActSh.Name Application.ScreenUpdating = 0 wsActSh.Copy , wbWBook.Sheets(wbWBook wbWBook.Sheets(wbWBook.Sheets.Count) wsSh.Visible = xlVeryHidden wsActSh.Activate Application.ScreenUpdating = 1 '====================================== 'Виконуємо основні дії (власне той код, який треба буде скасувати) li = 1 For Each ========================= 'Призначаємо стандартному виклику скасування дій виконання нашого макросу повернення значень Application.OnUndo "Скасувати заповнення осередків номерами", "Restore_Vals" End Sub '------------------------------------------------ --------------------------------------- ' Procedure : Restore_Vals ' Purpose : Процедура скасування дії( повернення значень) '------------------------------------------------- -------------------------------------- Sub Restore_Vals() 'У разі непередбаченої помилки переходимо на мітку 'і показуємо повідомлення про помилку On Error GoTo Erreble Application.ScreenUpdating = 0 'Активуємо книгу, в якій були зроблені зміни wbWBook.Activate 'робимо видимим резервний лист wsSh.Visible = -1 'Видаляємо вихідний лист, дані в якому вже змінені Application. DisplayAlerts = 0 wsActSh.Delete Application.DisplayAlerts = 1 'призначаємо резервному аркушу ім'я вихідного wsSh.Name = sSh_Name wsSh.MovewbWBook.Sheets(lShPoz) 'Активуємо резервний лист wsSh.Activate Application.ScreenUpdating = 0 Exit Sub 'Показуємо повідомлення про неможливість скасування дії Erreble: MsgBox "Не можна скасувати дію!", vbCritical, "www.excel-vba.ru" End
Tips_Restore_Macro_HiddenSh.xls (45,0 КіБ, 2 493 завантажень)
Звичайно, в цьому прийомі теж є недолік - якщо на цей лист посилаються формули з інших листів, є великий шанс отримати в цих формулах помилку #ПОСИЛКА! (# REF!), т.к. вихідний лист видаляється.
У цьому випадку можна з резервного листа копіювати всі комірки та вставляти на робочий лист. Та й взагалі можна багато чого придумати – аж до збереження та подальшого вилучення резервних копій файлів. Все як завжди залежить від завдань та ситуації.
І найбільша ложка дьогтю до обох кодів: VBA не дозволяє таким чином робити БАГАТОКРАТНІ скасування дій (багаторазове Ctrl + Z ), що робить марними спроби запам'ятати покроково кілька різних змін макросами. Скасувати можна буде однаково лише остання запам'ятана дія.
