🦔
VBAで Set Obj = Nothig が意味消失する書き方がある
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! :-)
おすすめ参考記事
バグになる具体例まで書かれており解説が丁寧で参考にさせて頂いた。
Discussion