Каковы преимущества установки объектов на «Ничто» - PullRequest
0 голосов
/ 27 июня 2018

Я заметил, что некоторые люди будут использовать Set Object = Nothing в процедурах закрытия. Мне удалось выяснить, почему это полезно для экземпляров Access, но ни один ответ не был удовлетворительным, когда дело доходит до этого для Excel, поэтому Какая польза от установки объектов в Nothing?

Я добавил его в свой код в качестве примера для поддержки этого вопроса, но разве это пустая трата пространства? Если это хорошая практика, почему?

Что касается кода, нет проблем с или без Set = Nothing. Я получаю данные из системного экспорта, в котором есть лишние столбцы, которые нам не нужны. Чтобы уменьшить количество итераций копирования / вставки, я собираю все диапазоны с объединением, за исключением двух. Порядок последних двух столбцов необходимо изменить, поэтому я был вынужден скопировать / вставить их отдельно.

With CurrentBook.ActiveSheet

    Dim LRow2 As Long
    LRow2 = .Range("BG" & .Rows.Count).End(xlUp).Row

    Dim Range1 As Range: Set Range1 = .Range("A2:C" & LRow2)
    Dim Range2 As Range: Set Range2 = .Range("F2:F" & LRow2)
    Dim Range3 As Range: Set Range3 = .Range("H2:H" & LRow2)
    Dim Range4 As Range: Set Range4 = .Range("M2:M" & LRow2)
    Dim Range5 As Range: Set Range5 = .Range("P2:P" & LRow2)
    Dim Range6 As Range: Set Range6 = .Range("S2:S" & LRow2)
    Dim Range7 As Range: Set Range7 = .Range("V2:V" & LRow2)
    Dim Range8 As Range: Set Range8 = .Range("X2:X" & LRow2)
    Dim Range9 As Range: Set Range9 = .Range("AD2:AD" & LRow2)
    Dim Range10 As Range: Set Range10 = .Range("AR2:AX" & LRow2)
    Dim Range11 As Range: Set Range11 = .Range("AY2:AY" & LRow2)
    Dim Range12 As Range: Set Range12 = .Range("AZ2:AZ" & LRow2)

End With

Dim CopyRange As Range: Set CopyRange = Union(Range1, Range2, Range3, Range4, Range5, Range6, Range7, Range8, Range9, Range10)
CopyRange.Copy
ws.Range("A2").PasteSpecial xlPasteValues

    Range12.Copy
    ws.Range("S2").PasteSpecial xlPasteValues

        Range11.Copy
        ws.Range("T2").PasteSpecial xlPasteValues

'''''''''''''''
''''Closing''''
'''''''''''''''

Closing:
CurrentBook.Close False
ws.Range("A1").Select

Application.ScreenUpdating = True
Application.DisplayAlerts = True

Set MyFile = Nothing: Set ws = Nothing: Set CurrentBook = Nothing
Set Range1 = Nothing: Set Range2 = Nothing: Set Range3 = Nothing: Set Range4 = Nothing: Set Range5 = Nothing
Set Range6 = Nothing: Set Range7 = Nothing: Set Range8 = Nothing: Set Range9 = Nothing:
Set Range10 = Nothing: Set Range11 = Nothing: Set Range12 = Nothing
Set CopyRange = Nothing

Exit Sub

1 Ответ

0 голосов
/ 27 июня 2018

Если бы это был управляемый код .NET (то есть сборщик мусора ), вам бы пришлось Release каждый отдельный COM-объект, к которому вы когда-либо обращались, иначе процесс хоста (EXCEL.EXE) будет скорее всего, работает в фоновом режиме, потребляет память и не может полностью разрушиться.

Но это код VBA (то есть подсчитанный по ссылке ), более того, код VBA, который использует объекты, которыми управляет приложение хоста - эти объекты умрут, когда приложение хоста закроется, и когда это произойдет, Контекст выполнения VBA давно отсутствует.

Другими словами, все эти Set ... = Nothing инструкции полностью избыточны.


В некоторых конкретных случаях, когда вы имеете дело со сторонней библиотекой API / типов, возможно, что объекты не очищаются полностью. Например, вы можете создать экземпляр Access.Application и обнаружить, что «призрачный» процесс ACCESS.EXE остается открытым в диспетчере задач даже после выхода из Excel: это признак того, что вы как-то, где-то и где-то пропускаете ссылку на объект, и Set ... = Nothing может помочь предотвратить это.

Однако я бы не рекомендовал систематически обнулять все ссылки на объекты подобным образом. Только когда не делает это вызывает проблему. И даже тогда это будет один или два объекта, которые тянут все вниз, а не все из них . Если ACCESS.EXE правильно завершает работу, нет причин загромождать код такими инструкциями.

Также помогает избежать хранения ссылок на объекты в глобальном состоянии. Если все локально, теоретически все задействованные объекты уничтожаются, как только выходит из локальной области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...