VBA ตรวจสอบว่ามีการตั้งค่าวัตถุหรือไม่


91

ฉันมีตัวแปรส่วนกลางที่เป็นอินสแตนซ์ของคลาสที่ฉันกำหนดเอง

ฉันจะตรวจสอบได้อย่างไรว่าออบเจ็กต์ถูกตั้งค่าหรือว่าฉันต้องการเริ่มต้นหรือไม่

คำตอบ:


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

หรือหากคุณต้องการวิธีอื่น:

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

2
ฉันรู้ว่ามันต้องเรียบง่ายเมื่อฉัน Googled และไม่พบอะไรเลย! ขอบคุณสำหรับความช่วยเหลือของคุณ!
Icode4food

3
โปรดทราบว่าการตรวจสอบobj Is Nothingไม่เหมือนกับการตรวจสอบIsNothing(obj)! ขอบคุณสำหรับไวยากรณ์ที่ถูกต้องในการตรวจสอบสิ่งนี้ ... ไม่แน่ใจว่าทำไมถึงIsNothing()ทำงานแตกต่างกัน ...
Matt Browne

1
ผมพบว่าเข้าใจง่ายกว่าNot (obj Is Nothing) Not obj Is Nothingสมองของฉันไม่รู้ว่า "Not obj" คืออะไร!
Martin F

คุณยังสามารถเขียน: ถ้า obj IsNot Nothing ซึ่งฉันพบว่ามันชัดเจนกว่าส่วนที่เหลือมาก นอกจากนี้ยังรู้สึกเหมือนกันกับ C # (ojb! = null)
Alexandre

4

วิธีที่ปลอดภัย (ยกเลิก) ในการทำเช่นนี้ - หากคุณตกลงที่จะไม่ใช้ตัวเลือกที่ชัดเจน - คือ ...

Not TypeName(myObj) = "Empty"

นอกจากนี้ยังจัดการกับกรณีที่ไม่ได้ประกาศวัตถุ สิ่งนี้มีประโยชน์หากคุณต้องการแสดงความคิดเห็นในการประกาศเพื่อปิดพฤติกรรมบางอย่าง ...

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

วิธีนี้ใช้ได้ผลเนื่องจาก VBA จะสร้างอินสแตนซ์ตัวแปรที่ไม่ได้ประกาศโดยอัตโนมัติเป็นประเภทตัวแปรว่าง ช่วยลดความจำเป็นในการใช้บูลีนเสริมเพื่อจัดการพฤติกรรม


4
ไม่เคยมีใครควรจะมีรหัส VBA ใด ๆ Option Explicitโดยไม่ มันไม่ได้รับอะไรเลยนอกจากปัญหา หากต้องการ "เปลี่ยน" ลักษณะการทำงานให้ใช้การคอมไพล์ตามเงื่อนไข
Andre

@andre ใช่จุดยุติธรรม ฉันรู้สึกโอเคถ้าไม่มีมันเพราะฉันใช้สัญกรณ์ฮังการีสำหรับขอบเขต แต่ฉันพยายามหลีกเลี่ยง vba ในทุกวันนี้ถ้าทำได้ สิ่งที่ฉันเห็นส่วนใหญ่เกี่ยวกับการประกาศอย่างชัดเจนความปลอดภัยของชื่อและการหลีกเลี่ยงตัวแปรที่น่ากลัว อะไรคือเหตุผลสำคัญของคุณ?
Cool Blue

ในความเป็นจริงฉันได้รับ "Nothing" อันเป็นผลมาจากชื่อพิมพ์ไม่ใช่ "ว่างเปล่า"
Patrick Lepelletier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.