Сбой Excel VBA при ModifyAppliesToRange без сообщения об ошибке - PullRequest
0 голосов
/ 10 декабря 2018

У меня странная проблема в Excel и VBA.

Я звоню ModifyAppliesToRange на различные FormatCondition, наряду со многими другими FormatCondition связанными вещами.

Некоторое время он работает нормально (около 2-300 вызовов), а затем без всякой причины вижу, что мой Excel (и среда разработки VBA) завершит работу без ошибок ни из моего обработчика ошибок, ни из excel, без уведомлений,ничего, кроме «паузы», где ничего не происходит, пока не произойдет сбой.Это происходит независимо от того, запускаю ли я его нормально или с точкой останова и шагом.

В зависимости от точного содержимого рабочего листа FormatConditions точное число раз, когда оно работает, может меняться.Но если начальные условия одинаковы, то точка отказа одинакова (то есть, она не срабатывает в том же FormatCondition).Ошибка кода:

myCF.ModifyAppliesToRange Union(range1, range2)

, где myCF As FormatCondition

Я пытался

Dim rng As Range
Set rng = Union(range1, range2)
myCF.ModifyAppliesToRange rng

Я проверял: myCF, range1Насколько я могу судить, range2 и rng действительны и показывают действительные строки .Address (для диапазонов).Например, произойдет сбой range1.Address = "$DO$9:$GN$39,$BD$8:$BD$39", range2.Address = "$CI$9:$DN$39", и в результате rng.Address = "$BD$8:$BD$39,$CI$9:$GN$39"

Итак, я попытался

Set rng = Union(Range(CFFrom.AppliesTo.Address), Range(CFTo.AppliesTo.Address))

Та же проблема.

Иногда (при других условиях запуска) он проходит выше ModifyAppliesToRange, но в тот момент, когда я смотрю на myCF.AppliesTo.Address, происходит тот же сбой - будь то наведение мыши на него или показэто в часах, или отображение в немедленном.Тем не менее, rng.Address не дает такой проблемы.

Тем не менее, кажется, что он также прекрасно работает в течение 2-300 раз.

Я подозреваю, что проблема с памятью (но Excel не использует много памяти или ЦП, на компьютере много свободной памяти, я использовал Option Explicit и т. д.) или жесткий предел или ошибка в Excel

Есть идеи относительно того, почему это может происходить?Любые идеи относительно того, как я могу узнать, что закрывает Excel?

ПРИМЕЧАНИЕ: Чтобы дать точный способ воспроизвести это, я должен был бы опубликовать всю свою электронную таблицу и код, который я не хочу делать,Тем не менее, я мог бы быть в состоянии отправить один на один, если это будет необходимо.

1 Ответ

0 голосов
/ 31 июля 2019

Я тоже столкнулся с этой проблемой.Честно говоря, это ошибка Excel.

Однако, согласно этому сообщению на форуме Technet , кажется, что Excel изменяет коллекцию условий форматирования на лету при обновлении условий.Видя, что это может привести к неприятным ошибкам при обработке всех условий в цикле (как я сделал), я сначала переписал свой код, чтобы он сначала собирал все условия для обработки в коллекции, а затем зацикливался на них.Это все еще дало мне сбои Excel;возможно, сами объекты условий также обновляются (создаются / уничтожаются) за кулисами, вызывая устаревшие указатели на удаленные объекты VBA?

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

Dim stillBusy As Boolean
Do
    stillBusy = False
    Dim nextCondition As FormatCondition
    For Each nextCondition In myRange.FormatConditions
      Dim newAreas As Range
      Set newAreas = ResizeAreas(nextCondition.AppliesTo, myRange.Rows.Count)
      If Not AreasEqual(nextCondition.AppliesTo, newAreas) Then
        Call nextCondition.ModifyAppliesToRange(newAreas)
        stillBusy = True
        Exit For
      End If
    Next
Loop While stillBusy    

И хотя это супер неэффективно, это ... чудесным образом работает ?!(теперь).Надеюсь, это также работает для кого-то еще?

Кстати: ResizeAreas и AreasEqual - некоторые из моих собственных вспомогательных функций;ResizeAreas преобразует, например, [A1:A3,C1:D3] в [A1:A6,C1:D6], а AreasEqual проверяет, состоят ли два заданных диапазона из одинаковых ячеек ([A1:A2,B1:B2] и [A1:B2] = True)

...