Excel макрос не отвечает

Как избежать «(не отвечает)» ?

SkyPro

Дата: Вторник, 12.11.2013, 18:57 |
Сообщение № 1

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

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

Сообщений: 1206


Репутация:

255

±

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


2010

Добрый вечер, уважаемые.
Подскажите, пожалуйста, каким образом можно избежать «зависания» экселя при обработке длительных и ресурсовемких операций?
Как избавиться от «не отвечает»?
Макрос выполняется успешно и эксель «развисает» по окончании обработки. Но вот в эту минуту, пока он «не отвечает», лучше его не трогать, иначе есть возможность «повесить» до выбивания из процессов.
Вариант оптимизации кода — не вариант (как оптимизировать заполнение циклом пары миллионов значений в массив?).
Апгрейдить железо — тоже не вариант :)


skypro1111@gmail.com

Сообщение отредактировал SkyProВторник, 12.11.2013, 18:57

 

Ответить

Hugo

Дата: Вторник, 12.11.2013, 19:02 |
Сообщение № 2

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

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

Попробуйте DoEvents воткнуть в длинные циклы.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

SkyPro

Дата: Вторник, 12.11.2013, 19:11 |
Сообщение № 3

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

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

Сообщений: 1206


Репутация:

255

±

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


2010

А как их «втыкать» ?
К примеру вот сюда:
[vba]

Код

Sub Tmp()
Dim i&
Dim x(1 To 30000000) As Byte
For i = 1 To 30000000
      x(i) = Round(Rnd)
Next
For i = 1 To 30000000
      If x(i) = 0 Then
          x(i) = 1 + x(i) + 1
      Else
          x(i) = 0 + x(i) + 1
      End If
Next
End Sub

[/vba]
Мне просто понять принцип «запихивания».


skypro1111@gmail.com

Сообщение отредактировал SkyProВторник, 12.11.2013, 19:12

 

Ответить

KuklP

Дата: Вторник, 12.11.2013, 19:14 |
Сообщение № 4

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

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

Сообщений: 2369


Репутация:

486

±

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


2003-2010

[vba]

Код

Sub Tmp()
Dim i&
Dim x(1 To 30000000) As Byte
For i = 1 To 30000000
doevents
       x(i) = Round(Rnd)
Next
For i = 1 To 30000000
doevents
       If x(i) = 0 Then
           x(i) = 1 + x(i) + 1
       Else
           x(i) = 0 + x(i) + 1
       End If
Next
End Sub

[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

Hugo

Дата: Вторник, 12.11.2013, 19:21 |
Сообщение № 5

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

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

Я бы во втором цикле засунул в

[vba]

Код

    If x(i) = 0 Then
doevents
‘и почему не
         x(i) = x(i) + 2
‘?

[/vba]

Будет чуть побыстрее.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

SkyPro

Дата: Вторник, 12.11.2013, 19:24 |
Сообщение № 6

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

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

Сообщений: 1206


Репутация:

255

±

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


2010

т.е. в каком-либо цикле перед операцией присваивания?

PS: Я просто для примера пару циклов сделал. Это не реальный код для работы :)
Сначала написал 1 + x(i) , а потом решил еще добавить нагрузки :)


skypro1111@gmail.com

Сообщение отредактировал SkyProВторник, 12.11.2013, 19:25

 

Ответить

Hugo

Дата: Вторник, 12.11.2013, 19:27 |
Сообщение № 7

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

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

Да не обязательно перед.
Главное периодически давать шевелиться системе.
Можно не на каждом шаге, а например на каждом сотом — если вычисление этого сотого не займёт больше времени, чем выгода от редкого doevents :)


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

SkyPro

Дата: Вторник, 12.11.2013, 19:30 |
Сообщение № 8

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

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

Сообщений: 1206


Репутация:

255

±

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


2010

Можно не на каждом шаге, а например на каждом сотом

Т.е. еще один if и счетчик?

Спасибо вам за помощь. А то я смотрел в эти дуэвентс, но нифига не понимал куда их запихивать.


skypro1111@gmail.com

Сообщение отредактировал SkyProВторник, 12.11.2013, 19:31

 

Ответить

Hugo

Дата: Вторник, 12.11.2013, 19:34 |
Сообщение № 9

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

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

Можно счётчик, можно mod — я обычно mod использовал, правда для statusbar’а.
Но нужно померить, что выгоднее по скорости.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

SkyPro

Дата: Вторник, 12.11.2013, 19:50 |
Сообщение № 10

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

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

Сообщений: 1206


Репутация:

255

±

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


2010

Спасибо, посмотрю как этот мод можно припахать :)


skypro1111@gmail.com

 

Ответить

Hugo

Дата: Вторник, 12.11.2013, 21:23 |
Сообщение № 11

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

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

[vba]

Код

If i Mod 100 = 0 Then DoEvents

[/vba]
С статусбаром точно ускоряет работу — если выводить каждый i то медленно и глазом трудно уследить.
Если ли смысл с DoEvents — точно не знаю, но можешь померить.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

RAN

Дата: Вторник, 12.11.2013, 21:47 |
Сообщение № 12

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

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

Сообщений: 5645

Есть смысл.
Делал файл, где создавался прогрессбар и читалось два текстовых файла (10 000 и 360 000 строк), а потом все это безобразие загонялось в словарь. На 2007 и ХР все вроде работало, а на W7 и 2010 прогрессбар прятался за окно Excel, и носа не высовывал до окончания загрузки. Вылезал только при начале обработки загруженных данных. Оказалось — DoEvents не в ту строчку воткнул. А без DoEvents было совсем грустно. Особенно если учесть, что время обработки при максимальном поиске составляло ~ 5 часов, а на минимуме — от 5 до 25 минут.
В итоге в кажду загрузку и формирование словаря воткнул по DoEvents, а в цикл обработки
[vba]

Код

If i Mod 100 = 0 Then DoEvents

[/vba]


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

Сообщение отредактировал RANВторник, 12.11.2013, 21:48

 

Ответить

Не работают макросы в Excel? Включите их выполнение, добавьте специальный модель с кодом, проверьте версию ОС и Эксель, убедитесь в соответствии пакета приложений, активируйте Майкрософт Офис, снимите блокировку файла, проверьте систему безопасности и применяемые библиотеки. Ниже подробно рассмотрим, в чем могут быть причины подобной неисправности, и какие шаги предпринимать для ее устранения.

Причины

Для начала стоит разобраться, почему не работает макрос в Excel, ведь от этого зависят дальнейшие шаги. К основным причинам стоит отнести:

  1. Функция отключена.
  2. Отключение отслеживания событий.
  3. Устаревшая операционная система.
  4. Несоответствие разработчика пакета офисных приложений.
  5. Устаревшая версия Майкрософт Офис.
  6. Неактивированная версия Excel.
  7. Заблокированный файл.
  8. Неправильные настройки безопасности.
  9. Отсутствие необходимой библиотеки и т. д.

Выше рассмотрены основные причины, почему не удается выполнить макрос в Excel. Все они могут быть решены самостоятельно с помощью приведенных ниже рекомендации. Подробнее на решении вопроса остановимся ниже.

Что делать

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

Включите опцию

Первое, что необходимо сделать — включить функцию для обеспечения ее работоспособности. Здесь многое зависит от версии Эксель.

Если не работают макросы в Excel 2003, сделайте следующие шаги:

  1. Войдите в «Сервис».
  2. Перейдите в раздел «Безопасность».
  3. Кликните «Уровень макросов «Низкий».

В случае, когда не работают макросы в Excel 2007, включите их следующим образом:

  1. Жмите на кнопку «Офис».
  2. Войдите в параметры Excel.
  3. Кликните на «Центр управления безопасности».
  4. Войдите в «Параметры центра управления безопасностью».
  5. Жмите на «Параметры макросов».
  6. Кликните на «Разрешить все …».

В ситуации, когда не работают макросы в Excel 2016, сделайте следующие шаги:

  1. Войдите в раздел «Файл».
  2. Кликните на кнопку «Параметры».
  3. Зайдите в «Центр управления безопасностью».
  4. Войдите в «Параметры центра управления безопасностью».
  5. Кликните на «Параметры …».
  6. Жмите на «Разрешить все …».

После внесения изменений параметра безопасности перезапустите приложение Excel, а именно закройте его полностью и откройте снова. Лишь после этого изменения вступают в силу.

Добавьте нужный модуль в книгу

Бывают ситуации, когда макросы включены, но не работают в Excel из-за отключения каким-либо элементом отслеживания событий. В таком случае сделайте следующее:

  1. Перейдите в редактор VBA с помощью клавиш Alt+F11.
  2. Вставьте указанный ниже код.

Sub Reset_Events()

Application.EnableEvents = True

End Sub

  1. Для выполнения кода поставьте курсор в любой точке между началом и концом.
  2. Кликните F5.

Проверьте операционную систему

В ситуации, когда не отображаются макросы в Excel, обратите внимание на тип операционной системы. К примеру, Майкрософт Офис, который подходит для Виндовс, на Мак ОС уже работать не будет. Причина в том, что в приложении используются разные библиотеки. Даже если надстройки и функционируют, могут быть сбои в работе. Вот почему при появлении проблем нужно проверить ОС на соответствие.

Обратите внимание на разработчика

Если в Экселе не работают макросы, причиной может быть другой разработчик. Так, пользователи Excel часто применяют OpenOffice или LibreOffice. Эти пакеты созданы на разных языках программирования, которые имеют индивидуальные особенности. Так, если надстройки написаны на Visual Basic for Application, он может не работать в указанных выше офисных приложениях. Вот почему необходимо уточнять, для какого пакета создан макрос / надстройка.

Проверьте версию Майкрософт Офис

В Макрософт Офис 2003 применяются надстройки xla для Excel. В современных версиях расширение поменялось на xlam. Если ставить макросы старого типа в приложения Офис 2007 и больше, никаких трудностей не происходит. Если же вы попытаетесь поставить новую надстройку на старую версию Excel, она зачастую не работает. Вот почему важно обратить внимание на этот параметр при выборе.

Убедитесь в наличии пакета VBA

Одной из причин, почему не запускается макрос в Excel, может быть отсутствие пакета VBA. Для успешного запуска надстройки необходимо, чтобы этот пакет был установлен. Иногда он уже установлен в Офис, но так происходит не всегда. Для проверки жмите комбинацию на Alt+F11. Если после этого появляется Visual Basic, компонент можно считать установленным. В ином случае его нужно поставить. Для этого:

  • Зайдите в «Пуск», а далее «Панель управления / Программы и компоненты».

  • Выберите программу Майкрософт Офис.
  • Жмите на кнопку «Изменить».

  • Запустить файл установки Setup.exe.
  • Кликните на «Добавить или удалить компоненты».
  • Выберите в списке Visual Basic и установите его.

Активируйте Офис

Если в Excel 2007 не работает кнопка «макросы», причиной может быть отсутствие активации приложения. Для этого жмите на кнопку «Активировать» и следуйте инструкции. В большинстве случаев такая опция является платной.

Снимите блокировку файла

Учтите, что документ, полученный с другого ПК / ноутбука, может заблокироваться. Для разблокировки файла нужно нажать ПКМ и в разделе «Общие» кликнуть на «Разблокировать».

 Проверьте библиотеки

В случае, когда параметры макросов не активны в Excel, причиной может быть появление ошибки «Can’t find project or library». При этом, надстройка работает на другом ПК / ноутбуке, а здесь возникают проблемы. Ошибку легко устранить, если в окне, которое идет за сообщением об ошибке, снять отметки в полях Missing. Для вызова окна можно выбрать пункт меню Tools / References.

Проверьте настройки безопасности

В ситуации, когда не работают макросы в Excel, можно добавить надежные расположения или настроить доступ к объектной модели VBA. Для этого в Офис 2007 необходимо сделать следующее:

  1. Войдите в Меню
  2. Кликните на пункт «Параметры».
  3. Жмите на «Центр управления безопасностью».
  4. Войдите в «Параметры центра управления безопасностью».
  5. Кликните на «Параметры макросов» и «Доверять доступ к объектной модели проектов».

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

В комментариях расскажите, какой из приведенных выше вариантов вам помог, и что еще можно сделать.

Отличного Вам дня!

Отказ макроса или надстройки от выполнения своих функций имеет ряд причин. Рассмотрим наиболее распространенные из них.

Операционная система

Вплоть до Office 2016 пакет приложений Microsoft Office выпускается в различных версиях, для Windows и для Mac OS. Встроенный в приложения Office язык программирования при этом использует отличающиеся друг от друга библиотеки операционной системы. В связи с этим макрос/надстройка, написанная для работы в приложениях под Windows, может не работать, либо работать некорректно в MacOS. Проверьте операционную систему, для которой разрабатывался макрос/надстройка.

Разработчик пакета офисных приложений

Кроме Microsoft Office, пользователи достаточно часто используют альтернативные пакеты офисных приложений, такие как OpenOffice или LibreOffice. Приложения этих пакетов также имеют встроенные языки программирования, но эти языки отличаются друг от друга. Макросы или надстройки, написанные в Visual Basic for Application в приложениях пакета Microsoft Office, не будут работать в приложениях OpenOffice или LibreOffice. Уточните, для какого пакета офисных программ разработан макрос/надстройка.

Наличие компонента VBA

Для того, чтобы можно было запустить макрос или надстройку в каком-либо приложении пакета Office, необходимо, чтобы с этим пакетом был установлен компонент VBA – встроенный язык программирования Visual Basic for Application. В некоторых версиях Office этот пакет может устанавливаться отдельно. Проверьте, установлен ли этот компонент на компьютере. Нажмите сочетание клавиш Alt+F11, если после этого появляется окно редактора Visual Basic, то компонент установлен. В случае, если компонент отсутствует, его необходимо установить.

Версия Microsoft Office

Microsoft Office 2003 использует надстройки с расширением .xla (для Excel), .dot (для Word) и так далее. В более поздних версиях расширения надстроек изменились: .xlam (для Excel), .dotm (для Word). При установке надстроек старого формата в приложения Office 2007 и выше никаких проблем не происходит, а вот при попытке установить надстройку нового формата в приложения пакета Office 2003, возникает сообщение о том, что надстройки не обнаружены. Убедитесь в том, что используемая надстройка предназначена именно для той версии Office, в которой Вы работаете.

Активация Microsoft Office

Убедитесь в том, что Microsoft Office не требует активации. Проведите активацию, чтобы избежать каких-либо ограничений при использовании приложений.

Снятие блокировки файла

Файл, полученный с другого компьютера или из сети интернет может быть заблокирован. Чтобы разблокировать такой файл, необходимо кликнуть на нем правой кнопкой мыши и на вкладке «Общие» нажать кнопку «Разблокировать».

snyatie blokirovki s fajla

Система безопасности

Если все вышеизложенное не ответило на вопрос «почему не работает макрос?», то, скорее всего, дело в настройках системы безопасности. Перейдите на страницу https://macros-vba.ru/knigi/vba/nastrojki-sistemy-bezopasnosti и проделайте то, что написано в разделах «Надежные расположения» и «Настройка доступа к объектной модели VBA».

Используемые библиотеки

Еще одна ситуация при которой не работает макрос сопровождается появлением сообщения Can’t find project or library при этом тот же самый макрос может без нареканий работать на другом компьютере. В разных версиях приложений, в которые встроен VBA могут использоваться разные библиотеки, в связи с чем могут возникать подобные ошибки. Ошибку можно устранить, если в окне, которое следует за сообщением об ошибке снять флажки, установленные в пунктах, содержащих слово MISSING.

cant find project or library

Это окно также можно вызвать и самостоятельно, если в редакторе VB выбрать пункт меню Tools/References.

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

Другие материалы по теме:

Я немного новичок в программировании, и я не особо разбираюсь в отладке в частности. Я в настоящее время сталкиваюсь с проблемой с этим кодом. Это делает Excel не отвечает в течение 15 минут при исполнении.

Что я ищу, так это чтобы дата извлекалась из wb(ZTP Tracker Sharepoint) и смотрела, есть ли запись в другой wb (Warning Tracker) в течение 5 дней, а затем возвращает Да или Нет.

Посмотрите на фактический код:

Sub warning_lookup()

Sheets("Summary").Select

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.DisplayAlerts = False

For cell = 2 To 1001

    Value = Cells(cell, 3)
    If Cells(cell, 5) = "Yes" Or Cells(cell, 5) = "No" Then
        If Cells(cell, 5) = "Yes" Then
            For Each x In ['Warning Tracker'!A:A]
                If x.Value = Value Then
                    If Sheets("Warning Tracker").Cells(x.Row, 3) > Cells(cell, 4) - 1 And Sheets("Warning Tracker").Cells(x.Row, 3) < Cells(cell, 4) + 6 Then
                        Cells(cell, 6) = "Yes"
                    End If
                End If
            Next
        End If

        If Cells(cell, 5) = "No" Then
            Cells(cell, 6) = ""
        Else: If Cells(cell, 6) = isblank Then Cells(cell, 6) = "No"

        End If
    End If
Next

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.CutCopyMode = False

End Sub

2017-09-14 13:27

3

ответа

Я думаю, что эта строка:

  For Each x In ['Warning Tracker'!A:A]

Принимает навсегда. Вы говорите: «Для каждой ячейки во всем столбце А». В Excel 2007 или более поздней версии, то есть более 1 миллиона ячеек, необходимо проверить, x.value = Value,

Измените цикл for на что-то более ограничительное:

  For each x in Range("A1:A50000")

Вы могли бы также заставить программу выяснить, какими должны быть эти 50000 при каждом запуске:

 Dim lastRow as integer
 lastRow = Range("A999999").end(xlUp).Row
 For each x in Range("A1:A" & lastRow)
     ....

В этом примере переменная lastRow будет содержать последнюю строку на рабочем листе, значение которой находится в столбце А.

Кроме того, ваш синтаксис выглядит очень странно в нескольких строках.

  1. Else: If это в стиле фанк. Этот Колон не должен быть там. (возможно, это работает, но я никогда не видел это раньше)
  2. isblank это не вещь в VBA. isBlank обрабатывается как переменная без значения в этом случае, поэтому он может работать случайно…?
  3. Ваш вложенный if Заявления могут быть объединены в одно. Это не обязательно плохо, но все это вложение может привести к затруднению чтения кода.

Пример объединения вложенных ifs:

If Cells(cell, 5) = "Yes" Or Cells(cell, 5) = "No" Then
    If Cells(cell, 5) = "Yes" Then

Может быть:

If (Cells(cell, 5) = "Yes" Or Cells(cell, 5) = "No") AND Cells(cell, 5) = "Yes" Then

2017-09-14 13:32

У вас есть пара вещей, которые могут вызвать ошибки (или заморозить ваш компьютер)

  1. If Cells(cell, 6) = isblank не является допустимым синтаксисом VBA, он должен быть If IsEmpty(Cells(cell, 6)) Then,

  2. Цикл по всей колонке «A:A» будет длиться вечно:

замените ваш:

For Each x In ['Warning Tracker'!A:A]

в цикл, где есть актуальные данные:

For Each x In Sheets("Warning Tracker").Range("A1:A" & Sheets("Warning Tracker").Cells(Sheets("Warning Tracker").Rows.Count, "A").End(xlUp).Row)

Попробуйте заменить ваш цикл с кодом ниже (нет необходимости Select лист, вы можете использовать With Sheets("Summary") вместо):

Код

With Sheets("Summary")
    For cell = 2 To 1001

        Value = .Cells(cell, 3)
        If .Cells(cell, 5) = "Yes" Then
            For Each x In Sheets("Warning Tracker").Range("A1:A" & Sheets("Warning Tracker").Cells(Sheets("Warning Tracker").Rows.Count, "A").End(xlUp).Row)
                If x.Value = Value Then
                    If Sheets("Warning Tracker").Cells(x.Row, 3) > .Cells(cell, 4) - 1 And Sheets("Warning Tracker").Cells(x.Row, 3) < .Cells(cell, 4) + 6 Then
                        .Cells(cell, 6) = "Yes"
                    End If
                End If
            Next
        End If

        If .Cells(cell, 5) = "No" Then
            .Cells(cell, 6) = ""
        Else
            If IsEmpty(.Cells(cell, 6)) Then .Cells(cell, 6) = "No"
        End If
    Next
End With

2017-09-14 13:39

Он не отвечает из-за огромного объема работы, которую вы просили выполнить, пока обновление экрана отключено и не дает никаких признаков того, что что-то происходит.

Предполагая, что вы выполняете это в Excel 2007 или более поздней версии, вы создали цикл, который потенциально сравнивает содержимое 3 ячеек с другими 3 ячейками в общей сложности 1 048 576 000 раз. (1001-2+1 ячейка х 1 048 576 клеток в большой петле + 1001-2+ еще 1 после)

Это потенциально 3,15 миллиарда сравнений клеток. Выполнение шагов, изложенных ниже, уменьшает количество итераций цикла, что может значительно ускорить процесс, в зависимости от количества мертвого пространства в диапазонах.

Другие вещи, которые следует учитывать:

  • Загрузите сравниваемые диапазоны в массивы, которые гораздо быстрее сравнивать, чем ячейки.
  • Создайте индикатор прогресса, используя строку состояния, чтобы пользователь не начал думать, что Excel не работает.
  • Выполняйте DoEvents время от времени, каждые X сравнений. Это позволит происходить другим вещам, которые могут заставить пользователя думать, что что-то пошло не так.

2017-09-14 14:08

Не так давно очередной раз столкнулся с ошибками приложения 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. Заново открываем [проблемный] файл, в верхней части, в строке статуса — включаем макросы посредством кнопки Включить содержимое.

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