のようだ Set Object = Nothing
は、このコードのFs
オブジェクトを破棄しませんでした:
Sub Test2()
Dim Fs As New FileSystemObject
Set Fs = Nothing
MsgBox Fs.Drives.Count ' this line works
End Sub
最後の行はエラーなしで動作します!。つまり、Fs
オブジェクトはまだ存在しますよね。
では、このFs
オブジェクトを破棄する方法を説明します。
オブジェクトを適切に破棄する別の方法は、With
ブロックへのオブジェクト参照を生成することです(つまり、ローカル変数を宣言しないでください)。
Sub Test()
With New FileSystemObject
MsgBox .Drives.Count
End With
End Sub
オブジェクトはWith
ブロック内にのみ存在し、実行がEnd With
トークンに到達すると、カスタムクラスモジュールで試行すると、クラスのClass_Terminate
ハンドラーが実行され、適切な破棄が効果的に確認されます。オブジェクトの。
As New
の癖について すでに説明したように 、そのスコープ内でオブジェクト参照をNothing
に設定する場合は、As New
を使用して宣言しないでください。VBAwillオブジェクト参照をNothing
に設定しますが、オブジェクトを確認するためだけに再参照するとすぐに、新しいインスタンスが作成されます(「役立つ」)。 Is Nothing
。
補足として、この(迷惑な)直観に反する動作は、具体的には Rubberduck の推論の背後にあるものですオブジェクト変数は自己割り当てですコードインスペクション:
(注:検査したいコードがある場合は、実際のVBEでWebサイトよりもmuch高速に実行されることを確認してください)
(まだ明確になっていない場合:私はRubberduckプロジェクトに深く関わっています)
「宣言してインスタンス化する」パターンに関係する必要があり、ほとんどの場合「回避する」パターンとして扱われます
それらを分割すると、次のように設定した後にNothing
を取得します。
Sub Test2()
Dim Fs As FileSystemObject
Set Fs = New FileSystemObject
Set Fs = Nothing
MsgBox Fs.Drives.Count ' this line DOESN'T work
End Sub
この修正されたコードは正常に動作するようです。同じ行にdim/newのニュアンスがあるようです。うまくいけば、他の誰かが推論に関してより良いアイデアを与えることができます。
他の人がコメントしたように、それが潜水艦内で薄暗い場合、それはとにかく潜水艦が完了した後に収集されます。
Sub Test2()
Dim Fs As FileSystemObject
Set Fs = New FileSystemObject
Set Fs = Nothing
End Sub