Зацикленный .Refresh, вызывающий медленный Excel

Я пытаюсь использовать VBA в Excel для Mac для запроса базы данных. Простой запрос отлично работает, и я использую его уже много лет. Теперь я перехожу к более сложным запросам, где результаты одного запроса (около 1000 записей) последовательно используются для повторного запроса к базе данных (то есть около 1000 последовательных запросов). Результаты (около 5000 записей) возвращаются примерно через 2,5 минуты, но щелчок на листе Excel не отвечает в течение примерно минуты после этого. Это поведение продолжается еще около 2 минут, прежде чем щелчок становится практически мгновенным. Повторный запуск макроса дает аналогичные результаты, но медленнее. Третий раз еще медленнее. Подозреваю утечку памяти. Перезапуск Excel приводит к сбросу проблемы. Вот код фактического запроса:

          With ActiveSheet.QueryTables.Add(Connection:=strURL, Destination:=Range(strStartCell))
        .PostText = "user=" & strUserName & ";password=" & strUserPassword
        .RefreshStyle = xlOverwriteCells
        .SaveData = True
        .BackgroundQuery = False
        .Refresh
    End With

Я попытался отправить только первый запрос (чтобы он получил данные, из которых можно построить другие запросы). Остальным я строю запрос, но не отправляю его. Итак, в этом эксперименте приведенный выше код использовался только один раз. Запустив его таким образом, он возвращается примерно через 8 секунд. Таким образом, остальные 2 минуты и 20+ секунд проходят между моим компьютером и базой данных. Что еще более важно, после запуска таким образом нет задержки после завершения работы. Таким образом, похоже, если это утечка памяти, утечка происходит в процессе запроса или, возможно, в фактической записи данных.

Я программно отключил все обновления экрана, отображение разрыва страницы и вычисления в начале и вернул их к исходным настройкам в конце.

Мой компьютер — Mac mini (конец 2014 г.) Intel Core i7 3 ГГц с Office 2011, но я пытался запустить его на более новом M1 с новейшей версией Excel. Это было намного быстрее, но отставание после возврата результатов, хотя и меньшее, все же было проблемой. Мой компьютер представляет собой место, где электронная таблица будет работать в ближайшем будущем.

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

1 ответ

ChatGPT решил суть моей проблемы. Он указал, что я создаю отдельную таблицу запросов для каждого из моих 1000+ запросов, и они поглощают мою память, что приводит к замедлению работы моего приложения. В нем говорилось, что если я добавлю строку .Delete после блока With... End With, она сотрет предыдущую таблицу запросов и не израсходует всю эту память. Ответ был немного неточным. .Удалить нужно было войти внутрь блока (в конце). Во всяком случае, я попробовал это, и мой код стал несколько медленнее, но когда это было сделано, приложение не стало медленным. Это победа в моей книге.

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

другое редактирование: я работаю на Mac, поэтому ADO мне не поможет.

Вот рабочий запрос:

      With ActiveSheet.QueryTables.Add(Connection:=strURL, Destination:=Range(strStartCell))
        .PostText = "user=" & strUserName & ";password=" & strUserPassword
        .RefreshStyle = xlOverwriteCells
        .SaveData = True
        .BackgroundQuery = False
        .Refresh
        .Delete
End With 

Другие вопросы по тегам