#excel #exc-bad-access #vba
#excel #исключение — неправильный доступ #vba
Вопрос:
Я сталкиваюсь с повсеместной ошибкой EXC_BAD_ACCESS в Microsoft Office для Mac 2011 на OSX 10.7 (Lion). Также установлено последнее обновление Office (я полагаю, что это было 14.3)
Я запускаю (довольно большой) макрос… Перенос его с ПК Office.
Ошибка возникает при добавлении элемента в коллекцию. Ничего особенного, и я делаю это в миллионе других мест без проблем. (И не изменил его с рабочей версии для ПК).
Итак, хотя это может быть причиной ошибки, я подозреваю, что это связано с памятью коллекции — например, возможно, она выполняет перераспределение за кулисами во время этой конкретной вставки.
В частности, это вставка 2-го элемента в коллекцию. Нет определенного пользователем типа. Ничего особенного. Добавление элемента string. Вставляемые данные являются кошерными. Идентификатор ключа уникален. Использование сбора хлеба и масла.
Другим возможным подозреваемым может быть переменная область видимости (???) … Т. Е. может использоваться переменная с аналогичным именем из другой подпрограммы или что-то дурацкое.
Или, возможно, временная строка, используемая в подпрограмме, является номинальным виновником?
Если я прокомментирую эту строку, остальная часть макроса выполняется нормально (за исключением сбоя отсутствующих данных из контейнера … Который может быть пустым при нормальной работе, так что это обрабатывается нормально)
Я ищу предложения о том, как отследить проблему. И советы по ее устранению.
Является ли страница памяти 64 КБ на Mac такой же, как на ПК?
Может ли это быть физическая оперативная память / виртуальная память / замена? (Кажется слишком последовательным, чтобы быть связанным с системной ОС)
Возможно, в Excel установлен лимит памяти для макросов?
Как я могу использовать дамп ядра для исключения, чтобы отследить проблему?
(Опытный программист, просто не знаком с OSX… И отсутствуют все мои инструменты для разработки ПК вздох)
Ответ №1:
Устранено.
Это была не коллекция.
С помощью некоторой отладки «printf» отследил проблему. Или, по крайней мере, найдено решение.
Следующее несколько умозрительно относится к тому, что происходило.
Ранее был создан, заполнен и передан в подпрограмму массив вариантов …
Dim nameList(50) As Variant
... populated ...
Call SomeSub(nameList)
...
sub SomeSub(nameList)
Затем в подразделении массив вариантов был повторен с использованием цикла «Для каждого» (который разбился)
For outerLoopIndex=0 To 100
Dim currName
For Each currName In nameList
If testName Like currName Then
addToBucket = True
Exit For ' skip any others since found a site of interest
End If
Next currName
Next outerLoopIndex
Он работал правильно на первом проходе внешнего цикла. Однако данные повреждаются таким образом, что при втором проходе через внешний цикл произошел сбой EXC_BAD_ACCESS.
«Исправление» заключалось в явном объявлении как Variant:
Dim currName As Variant
For Each currName In nameList
...
Возможно, это поможет другим, столкнувшимся с подобными проблемами. Попробуйте явно объявить переменные. Mac Excel, похоже, более чувствителен к таким вещам. 🙂