При запуске макроса excel зависает

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

Посоветуйте как найти причину зависания Excel при выполнении макроса.  
Что имеем: макрос, который бежит по листам книги и создает копии этих листов в новой книге.  
Все просто и всегда работало, по ка не обновился парк ПК.  
Данный макрос без проблем работал на XP c Excel 2003, 2007 и продолжает работать на аналогичной системе под VirtualBox, а вот с новыми ПК на которых установлен Windows 7 и Excel 2010 возникает проблема на 2х из 5 одинаковых ПК висит с непонятной закономерностью, то может обработать 3 листа, то 5 , то 7, а затем зависает.  
Конфигурация на всех ПК одна и та же, все ставилось с одного образа.  
Память потестил, проблем нет.  
СП1 повторно установить не удается, говорит нет продуктов для обновления.  
Что еще покрутить? Как найти корень зла?

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

Оптимизировать то нечего, алгоритм прост:  
Открыта оригинальная книга, создаем новую, идем на первую на первый лист, копируем его, вставляем в новую книгу, опять возвращаемся в оригинальную книгу, копируем второй лист, вставляем в созданную книгу и так до конца…  
НУ и перед копированием нового листа очищаем буфер

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

roka, чтобы найти корень зла, нужно хотя бы то, с чего начинать «зрить в корень».  
Общий ответ уже получен.

 

Hugo

Пользователь

Сообщений: 23257
Регистрация: 22.12.2012

Сюдя по описанию процесса — проще текущей книге сделать saveas :)  
Ну и может быть до/потом удалить лишние листы.  

  А если на каждый лист нужна новая книга — то тут вставлять ничего не нужно, просто копируем-сохраняем.

 

я так понимаю, уважаемый roka, что гуру ненавязчиво Вам намекают насчёт того, что неплохо бы приложить пример Вашего макроса. Если Вы, конечно, хотите получить конкретный совет, а не поговорить о гипотетических причинах.

 

слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

и свои пять копеек, чтоб еще пообиднее : наглухо — вместе пишется

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

слэн, все правильно — у некоторых на гвоздик… :)

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

{quote}{login=roka}{date=25.10.2011 01:52}{thema=}{post}выкладываю макрос{/post}{/quote}

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

Я рад, что вас удалось повеселить.  
Макрос принципиально не выкладывал, ибо он меня удовлетворял и всегда и везде работал.  
Проблемы начались именно с Excel 2010 и не везде.

 

слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

на проблемной машине поставьте в цикл оператор  
doevents  

  и, когда «зависнет» — остановите ctrl+break-ом чтобы посмотреть где что циклится..  

  так просто не разобраться..

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

{quote}{login=The_Prist}{date=25.10.2011 02:21}{thema=}{post}Ничего себе просто копирует…  
На странное поведение может повлиять принтер. Если точнее — драйвера к принтеру на конкретной машине. Попробуйте удалить код установок страницы (With Sheets(sname).PageSetup … End With) и запустить на проблемных машинах без него.  
{/post}{/quote}  
Параметры печати отключены чекбоксом, не участвуют в данный момент в процессе.  
Зависон происходит во время КопированияВставки

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

{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}Параметры печати отключены чекбоксом, не участвуют в данный момент в процессе.  
Зависон происходит во время КопированияВставки{/post}{/quote}У меня вообще интерес пропал. Сначала «просто код копирования» не хотели показывать, а теперь еще и нюансы всплывают…Уже известно, где зависон….{/post}{/quote}  
Так в самом начале было написано:  
…. висит с непонятной закономерностью, то может обработать 3 листа, то 5 , то 7, а затем зависает

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

{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}Параметры печати отключены чекбоксом, не участвуют в данный момент в процессе.  
Зависон происходит во время КопированияВставки{/post}{/quote}У меня вообще интерес пропал. Сначала «просто код копирования» не хотели показывать, а теперь еще и нюансы всплывают…Уже известно, где зависон….{/post}{/quote}  
Так в самом начале было написано:  
…. висит с непонятной закономерностью, то может обработать 3 листа, то 5 , то 7, а затем зависает{/post}{/quote}  
Логически делаю заключение, что на копированиивставке проблема, т.к. до сохранения дело не доходит.

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

{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}  
Не доходит. Процесс перебирания листов видно. 4-7 листов обрабатывает на проблемном компе и зависает, на следующие не переходит. Ладно бы если на одном и том же листе это было, а то на разных. Всего в книге листов 40. Такое чувство, что память переполняется. в Диспетчере задач смотрю вроде ок все, правда в это время Эксель дает 30% нагрузку на процессор.

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

Не доходит. Процесс перебирания листов видно. 4-7 листов обрабатывает на проблемном компе и зависает, на следующие не переходит. Ладно бы если на одном и том же листе это было, а то на разных. Всего в книге листов 40. Такое чувство, что память переполняется. в Диспетчере задач смотрю вроде ок все, правда в это время Эксель дает 30% нагрузку на процессор.

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

Вот что удалось выяснить в результате анализа настроек Экселя на всех ПК.  
На тех, которых макрос работал прекрасно, было установлено: «Сохранять файлы в следующем формате: Книга Excel 97-2003», на проблемных было просто в формате «Книга Excel».  
После установки значений сохранять в формате 97-2003, на этих компах исчезла проблема с зависанием.  
Странно все это :(

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

{quote}{login=The_Prist}{date=25.10.2011 03:18}{thema=Re: }{post}{quote}{login=roka}{date=25.10.2011 03:13}{thema=}{post}Вот что удалось выяснить в результате анализа настроек Экселя на всех ПК.  
На тех, которых макрос работал прекрасно, было установлено: «Сохранять файлы в следующем формате: Книга Excel 97-2003», на проблемных было просто в формате «Книга Excel».  
После установки значений сохранять в формате 97-2003, на этих компах исчезла проблема с зависанием.  
Странно все это :({/post}{/quote}Странно то, что помощь нужна Вам, а советы Вы не слушаете. Я Вам рекомендовал строку с условием при сохранении убрать и показал на что заменить.    
Но у Вас же «до сохранения не доходит»…{/post}{/quote}  
и точно не доходит, но ради научного эксперемента сейчас попробую

 

ran

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

Замените xlExcel8 на -4143, и будет вам щастье!  
Где собака порылась не известно, но методом научного тыка установлено — так работает всегда.

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

Что за гадость происходит с цитированием. :( отправляет не то что пишу.  
Поэкспериментировал с SaveAs    
Установка в Экселе Сохранять в формате Книга Excel  
И строка в коде:  
Можно просто:  
Workbooks(newbookname).SaveAs (pname & «» & nname), FileFormat:=xlExcel8  
Будет работать во всех версиях. Единственное, если nname не содержит расширение я бы посоветовал записывать так:  
Workbooks(newbookname).SaveAs (pname & «» & nname & «.xls»), FileFormat:=xlExcel8  

  Результата не дало, продолжает висеть

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

расширение определено:  
nname = «КНИГА » + Workbooks(bname).Sheets(«Главный»).Cells(6, 6) + » » + Workbooks(bname).Sheets(«Главный»).Cells(5, 6) + «.xls»

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

Может проблема в том, что главная книга в формате 2003, а код  
 Workbooks.Add xlWorksheet  
 newbookname = ActiveWorkbook.Name  
создает книгу в формате 2010 и в момент копирования листов со сложным форматированием идет разность в форматах и в результате чего происходит зависание?

 

ran

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

{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, и будет вам щастье!  
Где собака порылась не известно, но методом научного тыка установлено — так работает всегда.{/post}{/quote}И Вы не правы! Для Excel xlExcel8 и -4143 имеют одинаковую силу. Это будет иметь значение, если Вы будете обращаться к Excel из другой программы — тогда надо указывать числовую константу. А внутри Excel это дело не изменит. {/post}{/quote}  
Я тоже так думал. Однако при использовании xlExcel8 возникала ошибка, а после замены на -4143 ошибка исчезла. (EX 2007)

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

-4143 — проблемы не решает.  
думаю использовать вначале макроса: Application.DefaultSaveFormat = xlExcel8  
а перед концом Application.DefaultSaveFormat = xlOpenXMLWorkbook

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

{quote}{login=roka}{date=25.10.2011 05:01}{thema=}{post}-4143 — проблемы не решает.  
думаю использовать вначале макроса: Application.DefaultSaveFormat = xlExcel8  
а перед концом Application.DefaultSaveFormat = xlOpenXMLWorkbook{/post}{/quote}  
Так вот это — xlExcel8 в 2003 вызовет ошибку! Вы хоть читайте, что Вам советуют.  
The_Prist писал — xlNormal. Воспринимается всеми версиями.

Я сам — дурнее всякого примера! …

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

Еще раз повторяю, ошибка появляется далеко до сохранения, это можно по коду определить, раз все листы в книге не отрабатывает. Пробовал всякие -4143 и xlNormal на авось, авось не пришел.  
А вот Application.DefaultSaveFormat = xlExcel8 в начале макроса, решило проблему  
Видимо, т.к. главная книга в формате 2003, то и новую книгу надо сразу как-то создавать в формате офиса 2003.

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

{quote}{login=KukLP}{date=25.10.2011 05:08}{thema=Re: }{post}{quote}{login=roka}{date=25.10.2011 05:01}{thema=}{post}-4143 — проблемы не решает.  
думаю использовать вначале макроса: Application.DefaultSaveFormat = xlExcel8  
а перед концом Application.DefaultSaveFormat = xlOpenXMLWorkbook{/post}{/quote}  
Так вот это — xlExcel8 в 2003 вызовет ошибку! Вы хоть читайте, что Вам советуют.  
The_Prist писал — xlNormal. Воспринимается всеми версиями.{/post}{/quote}  
xlNormal — это только для 2003 офиса, 2007 и 2010 воспринимает как книгу в новом формате.  
Для работы макроса в разных версиях офиса у меня и стояло обработка.  
   If Application.Version = «12.0» Or Application.Version = «14.0» Then  
       Workbooks(newbookname).SaveAs (pname + «» + nname), FileFormat:=xlExcel8  
   Else: Workbooks(newbookname).SaveAs (pname + «» + nname)  
   End If  
Определяем версию в которой работаем, если 2007 или 2010, то xlExcel8, если нет (в данный момент только ниже) то без параметров и идет как xlNormal

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Что Вы говорите! Я выполнил в 2007:  
Public Sub www()  
ThisWorkbook.SaveAs ThisWorkbook.Name & («1.xls»), xlNormal  
End Sub  
И потом нормально открыл в 2003

Я сам — дурнее всякого примера! …

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Добавлю, в 2003 так же работает.

Я сам — дурнее всякого примера! …

 

roka

Пользователь

Сообщений: 384
Регистрация: 25.12.2012

#30

25.10.2011 17:43:31

{quote}{login=KukLP}{date=25.10.2011 05:29}{thema=}{post}Добавлю, в 2003 так же работает.{/post}{/quote}  
Да что вы к xlNormal привязались, говорю же проблема до сохранения.  
Допустим решили, что xlNormal круче, чем xlExcel8 (Записал для себя)  
Но проблема гораздо раньше проявляется, далеко до сохранения.

Спасибо за ссылку, обязательно изучу материал. Я пока только осваиваю 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.

RRS feed

  • 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 = xlCalculationManual  

    Thanks,

    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

  • 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

  • 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 here

        End If
      Loop until blnIteration =1

    End 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 ‘ DoEventsas 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

  • 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 = 1

    Sleep 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
    Loop

    End 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 ошибка макроса

При этом было замечено, что непосредственно перед возникновением ошибки приложения 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: вставка нового листа

Выполните приведенную последовательность действий:

  1. Открываем [проблемный] .xlsm-файл (файл с макросами).
  2. Не нажимаем кнопку Включить содержимое.
  3. Добавляем в книгу Excel новый лист: правая кнопка мыши на ярлыках Лист1/Лист2/Лист3 → ВставитьЛист.
  4. Сохраняем электронную таблицу. Закрываем Excel.
  5. Открываем проблемный файл заново и включаем макросы.

Решение 2: перекомпиляция проекта

Выполните последовательность действий:

  1. Запускаем и открываем новую книгу Excel (не ваш проблемный файл).
  2. Открываем меню Файл — выбираем Параметры — далее открываем Центр управления безопасностью и заходим в Параметры центра управления безопасностью.
  3. В разделе Параметры макросов — выставляем чекбокс Отключить все макросы с уведомлением.
  4. В разделе Надежные расположения — выставляем чекбокс Отключить все надежные расположения.
  5. В разделе Надежные документы — выставляем чекбокс Отключить надежные документы.
  6. Жмем везде OK. Закрываем Excel.

  7. Открываем [проблемный] .xlsm-файл (файл с макросами).
  8. Не нажимаем кнопку Включить содержимое.
  9. Открывает редактор Visual Basic при помощи комбинации клавиш Alt+F11. Либо можно использовать обходной маневр: в настройках включаем меню Разработчик, после этого в появившемся сверху в ленте меню Разработчик выбираем пункт Visual Basic.
  10. В открывшемся окне редактора Visual Basic (VBA редактор) пересохраняем проект: для этого жмем на панели инструментов кнопку Сохранить (изображение дискетки или комбинация Ctrl+S).
  11. Выбираем из меню Debug — выбираем пункт меню Compile VBA Project:

    recompile vba project

  12. Еще раз сохраняем проект кнопкой Сохранить.
  13. Закрываем редактор Visual Basic.

  14. Сохраняем файл Excel через меню Файл — опцию Сохранить (или нажатием на значок дискетки в левом верхнем углу, либо комбинация клавиш Ctrl+S).
  15. Возвращаем все установки безопасности, сделанные на предыдущих шагах (пункты 2-5).
  16. Закрываем xlsm-файл.
  17. Заново открываем [проблемный] файл, в верхней части, в строке статуса — включаем макросы посредством кнопки Включить содержимое.

Решение 3: добавление модуля

Дополнительное решение состоит в том, что бы внести изменения в макрос без перекомпиляции.

  1. Открываем [проблемный] .xlsm-файл (файл с макросами).
  2. Не нажимаем кнопку Включить содержимое.
  3. Открывает редактор Visual Basic (при помощи комбинации клавиш Alt+F11).
  4. Открываем меню Tools → пункт Options. В открывшемся окне переходим на вкладку General и деактивируем чекбокс Compile on Demand:

    compile on demand

    Закрываем окно Опции нажатием клавиши OK.

  5. В левом фрейме окна проекта (Project) спускаемся вниз, находим раздел Modules, жмем на нём правую кнопку → пункт InsertModule:

    vba insert module

  6. Далее просто закрываем окно редактора Visual Basic, сохраняем основной xslm-документ и закрываем Excel.
  7. Заново открываем [проблемный] файл, в верхней части, в строке статуса — включаем макросы посредством кнопки Включить содержимое.

Понравилась статья? Поделить с друзьями:
  • При запуске word пишет недостаточно памяти
  • При делении на ноль программа ms excel выдает сообщение об ошибке
  • При двойном щелчке левой кнопкой мыши документ word
  • При двойном клике по файлу не открывается excel
  • При группировке в excel плюсик сверху