VBA memeriksa apakah objek sudah disetel

92

Saya memiliki variabel global yang merupakan turunan dari kelas khusus saya.

Bagaimana cara memeriksa apakah objek telah disetel atau jika saya perlu memulainya?

Icode4food
sumber

Jawaban:

139
If obj Is Nothing Then
    ' need to initialize obj: '
    Set obj = ...
Else
    ' obj already set / initialized. '
End If

Atau, jika Anda lebih suka sebaliknya:

If Not obj Is Nothing Then
    ' obj already set / initialized. '
Else
    ' need to initialize obj: '
    Set obj = ...
End If
stakx - tidak lagi berkontribusi
sumber
2
Saya tahu itu harus sederhana ketika saya mencarinya di Google dan tidak menemukan apa pun! Terima kasih atas bantuan Anda!
Icode4food
3
Perhatikan bahwa memeriksa obj Is NothingTIDAK sama dengan memeriksa IsNothing(obj)! Terima kasih atas sintaks yang benar untuk memeriksa ini ... tidak yakin mengapa IsNothing()berperilaku berbeda ...
Matt Browne
1
Saya merasa Not (obj Is Nothing)lebih mudah untuk memahami daripada Not obj Is Nothing. Otak saya tidak tahu apa itu "Not obj"!
Martin F
Anda juga dapat menulis: If obj IsNot Nothing yang menurut saya jauh lebih jelas daripada yang lain. Ini juga terasa sama seperti C # (ojb! = Null)
Alexandre
4

Cara (tidak) aman untuk melakukan ini - jika Anda setuju dengan tidak menggunakan opsi eksplisit - adalah ...

Not TypeName(myObj) = "Empty"

Ini juga menangani kasus jika objek belum dideklarasikan. Ini berguna jika Anda hanya ingin mengomentari deklarasi untuk menonaktifkan beberapa perilaku ...

Dim myObj as Object
Not TypeName(myObj) = "Empty"  '/ true, the object exists - TypeName is Object

'Dim myObj as Object
Not TypeName(myObj) = "Empty"  '/ false, the object has not been declared

Ini berfungsi karena VBA akan membuat instance variabel yang tidak dideklarasikan secara otomatis sebagai jenis Varian Kosong. Ini menghilangkan kebutuhan akan Boolean tambahan untuk mengelola perilaku.

Biru Keren
sumber
4
Tidak ada yang boleh memiliki kode VBA tanpa Option Explicit. Itu tidak menghasilkan apa-apa kecuali masalah. Untuk "mengganti" perilaku, gunakan Kompilasi Bersyarat.
Andre
@ andre, ya, poin yang adil. Saya merasa baik-baik saja tanpanya karena saya menggunakan notasi hungaria untuk scope, tapi saya mencoba menghindari vba hari ini jika saya bisa. Sebagian besar yang saya lihat adalah tentang deklarasi eksplisit, keamanan nama, dan menghindari varian yang ditakuti. Apa alasan utama Anda?
Cool Blue
Sebenarnya saya mendapatkan "Tidak ada" sebagai hasil dari nama jenis, dan bukan "Kosong"
Patrick Lepelletier