Здравствуйте все.
Я разгадал причину с помощью Ваших простых примеров. Спасибо Вам огромное!!!
Проблема крылась не в работе 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 |
Многие, наверное, скажут, что как такое можно было не знать и не понимать, но я не знал