🦔

VBAで Set Obj = Nothig が意味消失する書き方がある

2024/02/28に公開

VBAでは参照した瞬間にNEWされ続ける書き方がある

VBAではオブジェクトやクラスを使う時にNEWを行う書き方が2種類ある

'1.変数宣言時にNEWする書き方
Dim DB_test1 AS New DAO.Database

'2.変数宣言後にSETでNEWする書き方
Dim DB_test2 AS DAO.Database
Set DB_test2 = New DAO.Database

(理解していないと)混乱するケース


'SetでいくらNothigしても意味がない例
'参照されればNEWが暗黙のうちに実行される
Sub Sample1()
 Dim C As New Collection ’この書き方は参照されると都度NEWする
 Set C = Nothing ' ← NothigをSetしても参照されたら自動でNEWされる
    
 MsgBox Cbool(C IS Nothig) ' ← 参照時にNEWされるのでFalse

 C.Add "Test" '実行できる
 '  ↑
 ' ※Nothingしようが参照されるとオブジェクト生成されているため
End Sub


Sub Sample2()
 Dim C Collection 
 Set C = New Collection ’この書き方なら参照しても都度NEWされない
 Set C = Nothing ' ← NothigをSetしたら以降ずっとNothingになる
 
 Debug.Print Cbool(C IS Nothig) ’ ← Nothig状態が保持されるのでTrue
 
 C.Add "Test" '実行できない
 '  ↑
 ' ※NothingがSetされているため
End Sub

変数宣言でNEWすると参照時に生成されるのでInitializeのタイミングも変わる

Class_InitializeTest
Private Sub Class_Initialize()
 Debug.Print "Class.InitializeTest->Initialize!"
End Sub

Sub Message_HelloWorld()
 Debug.Print "hello world! :-) "
End Sub
Module_Tester
Sub Test1()
 Dim c As New Class_InitializeTest
 Debug.Print "call test1"
 Debug.Print "HEX->" & Hex(VarPtr(c))
 c.Message_HelloWorld
End Sub

Sub Test2()
 Dim c As Class_InitializeTest
 Set c = New Class_InitializeTest
 Debug.Print "call test2"
 Debug.Print "HEX->" & Hex(VarPtr(c))
 c.Message_HelloWorld
End Sub
実行結果
## Call Test1()の場合
## ※ Initializeが参照時にされている(変数宣言時にはInitializeされていない)
 call test1
 Class.InitializeTest->Initialize!
 HEX->19BA7D4
 hello world! :-) 

## Call Test2()の場合
## ※ Set c = New Class_InitializeTestの時にInitializeされている
 Class.InitializeTest->Initialize!
 call test2
 HEX->19BA7D4
 hello world! :-) 

おすすめ参考記事

バグになる具体例まで書かれており解説が丁寧で参考にさせて頂いた。
https://thom.hateblo.jp/entry/2016/09/27/221527

Discussion