Здравствуйте все.
Я разгадал причину с помощью Ваших простых примеров. Спасибо Вам огромное!!!
Проблема крылась не в работе Excel, а в обработке объекта json.
Во вложении приложил файл с json строкой, которая приходит от API, но думаю это особо и не к чему.
Вот как примерно выглядит обработка ответа:
Как писал sokol92 "Память освобождается после завершения работы макросов VBA.", действительно, память не освобождается после выхода из цикла, но, позволю себе поправить sokol92'а, память освобождается после завершения работы не макроса, а процедуры/функции, уничтожая все данные, связанные с этой процедурой/функцией и на которые нет ссылок в других местах кода. Моя же проблема заключалась в том, что в коде я не создавал ссылку на массив объектов в цикле, а отдавал это каким-то внутренним силам VBA, в результате чего своими силами я не мог очистить память Nothing'ом. Память не очищалась при помощи Set oResponse = Nothing, потому что была ссылка на коллекцию oResponse("items").
Если создать переменную для такой коллекции и передавать ее в качестве коллекции для перебора, а после цикла по oResponse("items") присвоить ей Nothing, то память очищается при каждой итерации.
Пример:
Многие, наверное, скажут, что как такое можно было не знать и не понимать, но я не знал
Я разгадал причину с помощью Ваших простых примеров. Спасибо Вам огромное!!!
Проблема крылась не в работе Excel, а в обработке объекта json.
Во вложении приложил файл с json строкой, которая приходит от API, но думаю это особо и не к чему.
Вот как примерно выглядит обработка ответа:
Код |
---|
Dim oRequestList As Collection Dim oRequest As ServerXMLHTTP60 Dim oResponse as Object Dim oItem As Object Dim oRow As Object 'создание асинхронных http-запросов и добавление их в oRequestList For Each oRequest In oRequestList oRequest.waitForResponse Set oResponse = JsonConverter.ParseJson(oRequest.responseText) 'обработка json ответа For Each oItem In oResponse("items") For Each oRow In oItem("rows") ' обработка строки Next oRow Next oItem Set oResponse = Nothing Next oRequest |
Как писал sokol92 "Память освобождается после завершения работы макросов VBA.", действительно, память не освобождается после выхода из цикла, но, позволю себе поправить sokol92'а, память освобождается после завершения работы не макроса, а процедуры/функции, уничтожая все данные, связанные с этой процедурой/функцией и на которые нет ссылок в других местах кода. Моя же проблема заключалась в том, что в коде я не создавал ссылку на массив объектов в цикле, а отдавал это каким-то внутренним силам VBA, в результате чего своими силами я не мог очистить память Nothing'ом. Память не очищалась при помощи Set oResponse = Nothing, потому что была ссылка на коллекцию oResponse("items").
Если создать переменную для такой коллекции и передавать ее в качестве коллекции для перебора, а после цикла по oResponse("items") присвоить ей Nothing, то память очищается при каждой итерации.
Пример:
Код |
---|
Dim oRequestList As Collection Dim oRequest As ServerXMLHTTP60 Dim oResponse as Object Dim oItem As Object Dim oRow As Object Dim oItems As Object Dim oRows As Object 'создание асинхронных http-запросов и добавление их в oRequestList For Each oRequest In oRequestList oRequest.waitForResponse Set oResponse = JsonConverter.ParseJson(oRequest.responseText) 'обработка json ответа Set oItems = oResponse("items") For Each oItem In oItems Set oRows = oItem("rows") For Each oRow In oRows ' обработка строки Next oRow Next oItem Set oRows = Nothing Set oItems = Nothing Set oResponse = Nothing Next oRequest |
Многие, наверное, скажут, что как такое можно было не знать и не понимать, но я не знал
