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?

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.