roka Пользователь Сообщений: 384 |
Посоветуйте как найти причину зависания Excel при выполнении макроса. |
roka Пользователь Сообщений: 384 |
Оптимизировать то нечего, алгоритм прост: |
vikttur Пользователь Сообщений: 47199 |
roka, чтобы найти корень зла, нужно хотя бы то, с чего начинать «зрить в корень». |
Hugo Пользователь Сообщений: 23257 |
Сюдя по описанию процесса — проще текущей книге сделать saveas А если на каждый лист нужна новая книга — то тут вставлять ничего не нужно, просто копируем-сохраняем. |
я так понимаю, уважаемый roka, что гуру ненавязчиво Вам намекают насчёт того, что неплохо бы приложить пример Вашего макроса. Если Вы, конечно, хотите получить конкретный совет, а не поговорить о гипотетических причинах. |
|
слэн Пользователь Сообщений: 5192 |
и свои пять копеек, чтоб еще пообиднее : наглухо — вместе пишется |
vikttur Пользователь Сообщений: 47199 |
слэн, все правильно — у некоторых на гвоздик… |
roka Пользователь Сообщений: 384 |
|
roka Пользователь Сообщений: 384 |
{quote}{login=roka}{date=25.10.2011 01:52}{thema=}{post}выкладываю макрос{/post}{/quote} |
roka Пользователь Сообщений: 384 |
Я рад, что вас удалось повеселить. |
слэн Пользователь Сообщений: 5192 |
на проблемной машине поставьте в цикл оператор и, когда «зависнет» — остановите ctrl+break-ом чтобы посмотреть где что циклится.. так просто не разобраться.. |
roka Пользователь Сообщений: 384 |
{quote}{login=The_Prist}{date=25.10.2011 02:21}{thema=}{post}Ничего себе просто копирует… |
roka Пользователь Сообщений: 384 |
{quote}{login=The_Prist}{date=25.10.2011 02:26}{thema=Re: Re: }{post}{quote}{login=roka}{date=25.10.2011 02:24}{thema=Re: }{post}Параметры печати отключены чекбоксом, не участвуют в данный момент в процессе. |
roka Пользователь Сообщений: 384 |
{quote}{login=roka}{date=25.10.2011 02:36}{thema=Re: Re: Re: }{post}{quote}{login=The_Prist}{date=25.10.2011 02:26}{thema=Re: Re: }{post}{quote}{login=roka}{date=25.10.2011 02:24}{thema=Re: }{post}Параметры печати отключены чекбоксом, не участвуют в данный момент в процессе. |
roka Пользователь Сообщений: 384 |
{quote}{login=The_Prist}{date=25.10.2011 02:44}{thema=Re: Re: Re: Re: Re: }{post}{quote}{login=roka}{date=25.10.2011 02:39}{thema=Re: Re: Re: Re: }{post}Логически делаю заключение, что на копированиивставке проблема, т.к. до сохранения дело не доходит.{/post}{/quote}Не доходит или не сохраняет? Может доходит, но на сохранении падает?{/post}{/quote} |
roka Пользователь Сообщений: 384 |
Не доходит. Процесс перебирания листов видно. 4-7 листов обрабатывает на проблемном компе и зависает, на следующие не переходит. Ладно бы если на одном и том же листе это было, а то на разных. Всего в книге листов 40. Такое чувство, что память переполняется. в Диспетчере задач смотрю вроде ок все, правда в это время Эксель дает 30% нагрузку на процессор. |
roka Пользователь Сообщений: 384 |
Вот что удалось выяснить в результате анализа настроек Экселя на всех ПК. |
roka Пользователь Сообщений: 384 |
{quote}{login=The_Prist}{date=25.10.2011 03:18}{thema=Re: }{post}{quote}{login=roka}{date=25.10.2011 03:13}{thema=}{post}Вот что удалось выяснить в результате анализа настроек Экселя на всех ПК. |
ran Пользователь Сообщений: 7091 |
Замените xlExcel8 на -4143, и будет вам щастье! |
roka Пользователь Сообщений: 384 |
Что за гадость происходит с цитированием. отправляет не то что пишу. Результата не дало, продолжает висеть |
roka Пользователь Сообщений: 384 |
расширение определено: |
roka Пользователь Сообщений: 384 |
Может проблема в том, что главная книга в формате 2003, а код |
ran Пользователь Сообщений: 7091 |
{quote}{login=The_Prist}{date=25.10.2011 03:31}{thema=Re: }{post}{quote}{login=RAN}{date=25.10.2011 03:25}{thema=}{post}Замените xlExcel8 на -4143, и будет вам щастье! |
roka Пользователь Сообщений: 384 |
-4143 — проблемы не решает. |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
{quote}{login=roka}{date=25.10.2011 05:01}{thema=}{post}-4143 — проблемы не решает. Я сам — дурнее всякого примера! … |
roka Пользователь Сообщений: 384 |
Еще раз повторяю, ошибка появляется далеко до сохранения, это можно по коду определить, раз все листы в книге не отрабатывает. Пробовал всякие -4143 и xlNormal на авось, авось не пришел. |
roka Пользователь Сообщений: 384 |
{quote}{login=KukLP}{date=25.10.2011 05:08}{thema=Re: }{post}{quote}{login=roka}{date=25.10.2011 05:01}{thema=}{post}-4143 — проблемы не решает. |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Что Вы говорите! Я выполнил в 2007: Я сам — дурнее всякого примера! … |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Добавлю, в 2003 так же работает. Я сам — дурнее всякого примера! … |
roka Пользователь Сообщений: 384 |
#30 25.10.2011 17:43:31 {quote}{login=KukLP}{date=25.10.2011 05:29}{thema=}{post}Добавлю, в 2003 так же работает.{/post}{/quote} |
Спасибо за ссылку, обязательно изучу материал. Я пока только осваиваю VBA и сам понимаю что получилось громоздко. Но давайте по существу.
Сделал костыли…
Дело в том, что MultiPage’и не могут обработать параметры выдаваемые им во время загрузки формы (могут только после загрузки формы), добавил промежуточную форму, вынес обработку MultiPage’ев в отдельную процедуру, вроде как пашет… но это вот как раз не оптимизация кода, а совсем наоборот. Что скажете?
Добавлено через 3 минуты
… а нет, не пашет
Теперь вот:
Сигнатура проблемы:
Имя события проблемы: BEX
Имя приложения: EXCEL.EXE
Версия приложения: 14.0.4756.1000
Отметка времени приложения: 4b9c08e8
Имя модуля с ошибкой: unknown
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 00000000
Смещение исключения: 00000000
Код исключения: c0000005
Данные исключения: 00000008
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Дополнительные сведения об этой проблеме:
LCID: 1049
skulcid: 1049
Добавлено через 16 минут
Сообщение от chumich
назначил ей макрос Start и форма открылась по нажатию. Excel «стоит»
Вы попробуйте закрыть Excel и выполнить Start из другой книги по кнопке с панели инструментов. Погоняйте стартовую форму, поюзайте контролы, может выдаст ошибку. У меня периодически отрабатывает без ошибок. Да и фиг бы с ней, но на работе постоянно открыто 10-15 книг и один такой крит уведёт все книги с собой не сохранив.
Добавлено через 9 минут
Вот кусок дампа или как его там, я тут вообще не шарю…
sharedOfficeSoftwareProtectionPlatformOSPPCEXT.D LL». Невозможно найти или открыть PDB-файл.
«EXCEL.EXE» (Win32). Загружено «C:WindowsSysWOW64crypt32.dll». Символы загружены.
«EXCEL.EXE» (Win32). Загружено «C:WindowsSysWOW64msasn1.dll». Символы загружены.
«EXCEL.EXE» (Win32). Загружено «C:WindowsSysWOW64WinSCard.dll». Символы загружены.
«EXCEL.EXE» (Win32). Загружено «C:WindowsSysWOW64winhttp.dll». Символы загружены.
«EXCEL.EXE» (Win32). Загружено «C:WindowsSysWOW64webio.dll». Символы загружены.
«EXCEL.EXE» (Win32). Загружено «C:WindowsSysWOW64winmm.dll». Символы загружены.
«EXCEL.EXE» (Win32). Загружено «C:WindowsSysWOW64FM20ENU.DLL». Невозможно найти или открыть PDB-файл.
Поток 0x174c завершился с кодом 0 (0x0).
Необработанное исключение по адресу 0x74A3CB49 в EXCEL.EXE: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x00000000.
- Remove From My Forums
-
Question
-
Hi,
I am running a macro which contains the continuous loop inside the macro, while running it existing opened excel sheets are hanging and even if i open new sheet observed the same problem.
Even i could not succeeded after I use below statements. Thanks in advace for your help.
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManualThanks,
Ashok
All replies
-
If you want to use the worksheet while the macro is running, then deep inside your loops include the
DoEvents
statement. This will allow you (the user) to share focus with the macro while it is running.
Just be aware that the macro will run a little slower than it would if it did not have to share.
gsnu201208
-
Proposed as answer by
Friday, August 17, 2012 5:52 AM
-
Marked as answer by
Quist Zhang
Thursday, August 30, 2012 8:13 AM -
Unmarked as answer by
Quist Zhang
Thursday, August 30, 2012 8:14 AM
-
Proposed as answer by
-
Hi Gary,
Thanks for the quick response. Can you please elaborate the suggestion which you suggested as above.
1. Please find the below line of code which i am using in my MACRO.
«Private Declare Function GetAsyncKeyState Lib «user32″ (ByVal vKey As Long) As Integer»
2. After declaring the above line i am using the below condition to chechk the Input KeyStroke in a continuous loop.
«If GetAsyncKeyState() Then»
I hope you would be get much clarity on my problem now. Thanks in advance for your time.
Thanks,
Ashok
-
Hi,
Can any one please help on above issue.
Thanks,
Ashok
-
Hi AshokReddyS,
Could please provide more code on this? It might be helpful for troubleshooting.
Sample for DoEvents can be seen on
this page.regards,
Fermin-
Edited by
Fermin Wenlock
Thursday, August 23, 2012 1:43 PM
-
Edited by
-
Hi Fermin
Thanks for your reply, please find the sample code which i am using in my logic. My excel is hanging or freezing While iterating in Do loop untill if we press the ‘HOME’ key from keyboard. I hope this will give some idea what i am expecting..
Thanks in advance for your help…Private Declare Function GetAsyncKeyState Lib «user32» (ByVal vKey As Long) As Integer
Public Sub myExitKeyStroke()
blnIteration = 0
Do
If GetAsyncKeyState(VK_HOME) Then
blnIteration = 1
‘some statements hereEnd If
Loop until blnIteration =1End Sub
Thanks,
Ashok
-
Perhaps:
Private Declare Function GetAsyncKeyState Lib «user32» (ByVal vKey As Long) As Integer
Public Sub myExitKeyStroke()
blnIteration = 0
Do
If GetAsyncKeyState(VK_HOME) Then
blnIteration = 1
‘some statements here
End If
DoEvents
Loop Until blnIteration = 1
End Sub
gsnu201208
-
Hi Gary,
Thanks for the quick response….
I tried with ‘ DoEvents‘ as suggested above but i could not succeeded(still opened excels are hanging). Please help in this regard.
Thanks,
Ashok
-
Hi,
Any update please on the above issue….
-
The GetAsyncKeyState function may be polling the keypresses too aggressively, or consuming too much CPU time, or something.
Adding a wait period as an inner loop within the function appeared to give a working solution on my computer (Win7, Excel 2010):
Sub HomeWaiter() Dim blnIteration As Integer, timeRef As Single blnIteration = 0 Do timeRef = Timer ' Set now as the reference time Do While Timer < timeRef + 0.05 ' Loop until 1/20 second has elapsed; can reduce/increase delay DoEvents ' Process application events Loop If CBool(GetAsyncKeyState(VK_HOME)) Then blnIteration = 1 Debug.Print "Home pressed" ' Plus additional code End If Loop Until blnIteration = 1 End Sub
-
Edited by
Brian Skinn
Tuesday, August 28, 2012 8:27 PM
Clarity
-
Edited by
-
Hi Brian,
Thanks for your quick response. As you suggested above, I tried it but it is always waiting at ‘Do While’ statement until I click ‘F5 key or Run’ then only it is moving to next step.
I am adding my code below for more clarity to you on my issue. The thing is as i used my code below I wanted my code to listen always/continuously, so whenever I press ‘Print screen’ button it should do some job and when I press the ‘Left
Arrow’ my loop should stop.I hope the above explanation will give you clarity to resolve my issue. Thanks in advance…
Private Declare Function GetAsyncKeyState Lib «user32» (ByVal vKey As Long) As Integer
Private Declare Function GetKeyState Lib «user32» (ByVal nVirtKey As Long) As Integer
Private Declare Sub keybd_event Lib «user32» ( ByVal bVk As Byte, ByVal bScan As Byte, _
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const VK_SNAPSHOT As Long = 44
Private Const VK_LMENU As Long = 164
Private Const KEYEVENTF_KEYUP As Long = 2
Private Const KEYEVENTF_EXTENDEDKEY As Long = 1
Private Declare Sub Sleep Lib «kernel32.dll» (ByVal dwMilliseconds As Long)Sub MyTest()
Dim i, val
i = 1Sleep 2000& ‘ pause 2 seconds while the cmd window opens
Do While i = 1
On Error Resume Next
val = GetAsyncKeyState(44)
If val = -32767 Then
MsgBox «print screen key is pressed»
Call test() ‘some function call here
End If‘Left Arrow to exit
If GetAsyncKeyState(37) Then
i = 0
End If
LoopEnd Sub
Thanks,
Ashok
-
Ashok,
So, adding my ‘waiting’ loop into your code doesn’t work?
Dim timeRef As Single ... ... Do While i = 1 On Error Resume Next ' Start of my added code loop timeRef = Timer ' Set now as the reference time Do While Timer < timeRef + 0.05 ' Loop until 1/20 second has elapsed; can reduce/increase delay DoEvents ' Process application events Loop ' End of my added code loop val = GetAsyncKeyState(44) ' Rest of your code Loop
Also: what do you mean «until I click ‘F5 or Run'»? Are you trying to examine the behavior in the debugger? I don’t think it will be possible to use the debugger with any sort of ‘real-time keypress sensing’ code like this — the code that senses
the keypresses won’t be running when the VB Editor is in Debug mode… -
Hi Brian,
Thanks for the response. I tried with your code but it is explicitly pausing at ‘Do While’ even i did not keep Breakpoint at the ‘Do While’ statement, if i click on F5 or RUN button in macro editor then it is moving to next step. That is what i observed
while executing the above line of code.Did you get a chance to look into my above code? Please help me in this…
Thanks,
Ashok
-
Ashok,
Are you saying that the code acts as though you have a breakpoint set at the «Do While i = 1» line? That is, even though you don’t want it to pause there, it’s pausing there?
Also: why do you have «On Error Resume Next» in your code, but no error-handling? It’s an extremely bad idea to disable error handling outside the context of trapping for errors in a specific, contained section of code.
-Brian
-
There is a known problem — but no comment from Microsoft — with code sometimes stopping as though a breakpoint had been set. Although it often returns, closing all Office applications is usually enough to clear it. If that
doesn’t work, it may help to create a completely new workbook and copy the VBA source code to it.If you get this consistently you can suppress it by setting Application.EnableCancelKey to False but this should be used with extreme caution as you won’t be able to break out if your code still hangs and you will
have to cancel Excel through the Task Manager.
Enjoy,
Tony
www.WordArticles.com -
Hi Tony,
Any update on the above issue? It would be great for your help…
Ashok
-
This has been an issue since, I believe, Office 2007. There has never been any comment or update from Microsoft, and I don’t expect one now. As it is intermittent I can’t say whether it’s fixed, even in 2013. Sorry.
Enjoy,
Tony
www.WordArticles.com
I have an issue running an Excel Macro. I have read a lot of threads and tried all of the suggestions but no change in performance. I have run the same file/macro on 2 machines, details below. No matter what change on Laptop 2 (problematic machine), iteration time was unchanged.
Laptop 1:
Dell Precision M4800
2015
Intel i7-4800MQ @2.70GHz, 32GB 64-bit
Windows 10 Enterprise
Version 1909
OS 18363.1734
Excel 16.0.13127.21734 64-bit
Laptop 2:
Macbook Pro 15″ mid-2020
2021
Intel i9-9980HK @2.4GHz, 64GB 64-bit
Windows 10 Home
Version 20H2
OS 19042.1237
Excel 16.0.14326.20384 64-bit
Running the same file, same macro on both machines
1.5M+ calculations per iteration (cell formulas), 7 output cells
Laptop 1 = 11 seconds per iteration; Outlook, multiple Excel files open, Teams chat, Teams meeting, 3 sessions File Explorer, 2 sessions Chrome (multiple/many tabs each), has not rebooted in over a week (I know.. hard to believe); noticed slower operation of other programs, no change in performance of macro with other programs open
Laptop 2 = 24 seconds per iteration; no additional programs open or running, freezes system
Laptop 2:
Rebooted
Ran in Normal view (was not in Page Layout)
Disabled hardware acceleration
Ran with Wifi on and off
Ran clean boot
Ran diagnostic mode
Disabled all startup programs
Ran repair on 32-bit version
Uninstalled 32-bit/re-installed 64-bit Office 365
Не так давно очередной раз столкнулся с ошибками приложения Excel при попытке включения макросов после открытия файлов .xlsm. Вспомнил, что подобные проблемы преследуют пользователей довольно давно, но чаще всего они наблюдались с Excel 2013 и Excel 2016. Характерные особенности этой группы ошибок следующие:
- Приложение Excel закрывается при открытии файла с макросами (при включенном режиме безопасности Включить все макросы);
- Ошибка приложения Excel возникает при попытке включить содержимое (нажатии соответствующей кнопки);
- Ошибка приложения Excel возникает при сохранении файла с макросами;
Ну и по горячим следам очередного инцидента, дабы не откладывать на потом, решил для себя собрать небольшой хаб по ошибкам приложения Excel с последующей модификацией, дабы опять не терять время на поиск информации в Сети и на составление облака причин.
Суть в том, что в процессе открытия файла xlsm, и при отключенных макросах, в верхней части основного окна (над таблицей), высвечивается строка уведомления: ПРЕДУПРЕЖДЕНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ Запуск макросов отключен, с кнопкой включения содержимого (макросов). Как только пользователь её нажимает, Excel попросту аварийно завершается (падает) с ошибкой Программа Microsoft Excel не работает и характерным окном уведомления:
При этом было замечено, что непосредственно перед возникновением ошибки приложения Excel никаких системных обновлений и обновлений пакета Office не устанавливалось. Возможно, каким-то образом задействованы последние обновления на Office, но прямой связи я не заметил, а подробного исследования проблемы не проводил. При этом зависимости от версии операционной системы (мною лично сбои наблюдались на Windows 10 LTSC и Windows 7 Professional) так же выявлено не было. При анализе аварийного дампа приложения (*.hdmp) обычно можно увидеть подобную информацию исключения (вывод урезан):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
. . . EXCEPTION_RECORD: (.exr —1) ExceptionAddress: 00007ff86a1e05ac (VBE7+0x00000000001405ac) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 Parameter[0]: 0000000000000001 Parameter[1]: 0000000000000010 Attempt to write to address 0000000000000010 DEFAULT_BUCKET_ID: NULL_CLASS_PTR_WRITE PROCESS_NAME: EXCEL.EXE ERROR_CODE: (NTSTATUS) 0xc0000005 — <Unable to get error code text> EXCEPTION_CODE: (NTSTATUS) 0xc0000005 — <Unable to get error code text> EXCEPTION_CODE_STR: c0000005 EXCEPTION_PARAMETER1: 0000000000000001 EXCEPTION_PARAMETER2: 0000000000000010 WRITE_ADDRESS: 0000000000000010 . . . |
обычно это NTSTATUS с кодом c0000005 — Access violation, доступ запрещен. И чаще всего в дампе можно увидеть такой вот стек потока (вывод оптимизирован для улучшения представления):
. . . STACK_TEXT: 000000b9`1acfdd00 000001d3`2fb24e90 : 000001d3`5a0e0ef0 00000000`00000000 : VBE7+0x1405ac 000000b9`1acfdd08 000001d3`24c1fe20 : 00000000`00000000 000001d3`2fda9640 : 0x000001d3`2fb24e90 000000b9`1acfdd10 000001d3`6cf35760 : 000001d3`2fda9640 000001d3`045c9b30 : 0x000001d3`24c1fe20 000000b9`1acfdd18 000001d3`5a0e0ef0 : 000001d3`045c9b30 000001d3`2fcbb2b0 : 0x000001d3`6cf35760 000000b9`1acfdd20 00000000`00000000 : 000001d3`2fcbb2b0 000001d3`2fcbb318 : 0x000001d3`5a0e0ef0 . . . |
из которого единственное что понятно, так это то, что падение Excel происходит в недрах функций библиотеки vbe7.dll (среда исполнения VBA), подгруженной в адресное пространство процесса. Это указывает на проблемы с обработчиком VBA-скриптов, в контексте Excel чаще именуемых макросами.
НЕРЕШЕННОЕ: при отладке приложений из комплекта MS Office, вы не увидите имен функций в стеке вызовов, поскольку отсутствуют отладочные символы как к основным исполняемым файлам (Excel/Word/Outlook), так и к многочисленным библиотекам. Интересно, есть ли какое-либо решение?
VBA
Так что же такое VBA и для чего он предназначается?
VBA (Visual Basic for Application) — язык макропрограммирования, основанный на языке Visual Basic.
В приложениях, входящих в комплект MS Office, таких как Excel, Word, PowerPoint и Access, VBA используется для автоматизации множества рутинных задач (напр.: повторяющихся однотипных действий), позволяет создавать формы для общения с пользователем и предлагает множество иного богатого функционала. При помощи VBA доступно управление электронной таблицей посредством объектно-ориентированной модели кода/данных, при помощи VBA-кода входные данные таблиц могут быть обработаны и представлены в итоговых (результирующих) таблицах и диаграммах (графиках). Таблица становится интерфейсом кода, позволяя легко работать, изменять его и управлять расчётами. На выходе VBA проект, используемый в структурах описанных выше приложений (электронные таблицы Excel, презентации PowerPoint, базы Access), компилируется в специальный бинарный исполняемый файл, который размещается внутри файла основного формата. Применительно к Excel это файл vbaProject.bin, который располагается внутри *.xslm-файла в директории /xl, представляющий собой бинарный исполняемый файл проекта, содержащий макрос в откомпилированном (готовом к исполнению) виде.
Наиболее вероятной причиной сбоя является повреждение блока кода VBA, содержащегося в книге Excel. Об истоках этого остается только догадываться, возможно что в структуре .xlsm-файла, в процессе работы с документом, происходят какие-то [непредвиденные разработчиками] изменения, способные приводить блок кода в неработоспособное состояние.
Решение 1: вставка нового листа
Выполните приведенную последовательность действий:
- Открываем [проблемный] .xlsm-файл (файл с макросами).
- Не нажимаем кнопку Включить содержимое.
- Добавляем в книгу Excel новый лист: правая кнопка мыши на ярлыках Лист1/Лист2/Лист3 → Вставить → Лист.
- Сохраняем электронную таблицу. Закрываем Excel.
- Открываем проблемный файл заново и включаем макросы.
Решение 2: перекомпиляция проекта
Выполните последовательность действий:
- Запускаем и открываем новую книгу Excel (не ваш проблемный файл).
- Открываем меню Файл — выбираем Параметры — далее открываем Центр управления безопасностью и заходим в Параметры центра управления безопасностью.
- В разделе Параметры макросов — выставляем чекбокс Отключить все макросы с уведомлением.
- В разделе Надежные расположения — выставляем чекбокс Отключить все надежные расположения.
- В разделе Надежные документы — выставляем чекбокс Отключить надежные документы.
- Жмем везде OK. Закрываем Excel.
- Открываем [проблемный] .xlsm-файл (файл с макросами).
- Не нажимаем кнопку Включить содержимое.
- Открывает редактор Visual Basic при помощи комбинации клавиш Alt+F11. Либо можно использовать обходной маневр: в настройках включаем меню Разработчик, после этого в появившемся сверху в ленте меню Разработчик выбираем пункт Visual Basic.
- В открывшемся окне редактора Visual Basic (VBA редактор) пересохраняем проект: для этого жмем на панели инструментов кнопку Сохранить (изображение дискетки или комбинация Ctrl+S).
- Выбираем из меню Debug — выбираем пункт меню Compile VBA Project:
- Еще раз сохраняем проект кнопкой Сохранить.
- Закрываем редактор Visual Basic.
- Сохраняем файл Excel через меню Файл — опцию Сохранить (или нажатием на значок дискетки в левом верхнем углу, либо комбинация клавиш Ctrl+S).
- Возвращаем все установки безопасности, сделанные на предыдущих шагах (пункты 2-5).
- Закрываем xlsm-файл.
- Заново открываем [проблемный] файл, в верхней части, в строке статуса — включаем макросы посредством кнопки Включить содержимое.
Решение 3: добавление модуля
Дополнительное решение состоит в том, что бы внести изменения в макрос без перекомпиляции.
- Открываем [проблемный] .xlsm-файл (файл с макросами).
- Не нажимаем кнопку Включить содержимое.
- Открывает редактор Visual Basic (при помощи комбинации клавиш Alt+F11).
- Открываем меню Tools → пункт Options. В открывшемся окне переходим на вкладку General и деактивируем чекбокс Compile on Demand:
Закрываем окно Опции нажатием клавиши OK.
- В левом фрейме окна проекта (Project) спускаемся вниз, находим раздел Modules, жмем на нём правую кнопку → пункт Insert → Module:
- Далее просто закрываем окно редактора Visual Basic, сохраняем основной xslm-документ и закрываем Excel.
- Заново открываем [проблемный] файл, в верхней части, в строке статуса — включаем макросы посредством кнопки Включить содержимое.