【问题标题】:VBA check if object is setVBA检查是否设置了对象
【发布时间】:2011-02-07 13:39:26
【问题描述】:

我有一个全局变量,它是我的自定义类的一个实例。

如何检查对象是否已设置或是否需要初始化?

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    使用全局变量时,可能会遇到对象为空的情况。所以,代码:

    If Not obj Is Nothing Then
      'obj is already set
    Else
      'set obj
    End If
    

    产生“需要对象”错误。

    在这种情况下,以下工作:

    'First check it is initialized 
    If IsObject(obj) Then
         'Then check if it is set
         If Not obj Is Nothing Then
            'obj is set
         Else
            'set obj
         End If
    End If
    

    【讨论】:

      【解决方案2】:

      执行此操作的(不)安全方法 - 如果您可以不使用选项显式 - 是...

      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 会自动将未声明的变量实例化为 Empty Variant 类型。它消除了对辅助布尔值来管理行为的需要。

      【讨论】:

      • 没有Option Explicit,任何人都不应该拥有任何VBA代码。除了问题,它一无所获。要“切换”行为,请使用条件编译。
      • @andre,是的,公平点。没有它我感觉很好,因为我使用匈牙利符号表示范围,但如果可以的话,这些天我尽量避免使用 vba。我看到的大部分内容是关于显式声明、名称安全和避免可怕的变体。你的主要原因是什么?
      • 事实上,我得到“Nothing”作为 typename 的结果,而不是“Empty”
      【解决方案3】:
      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
      

      【讨论】:

      • 当我用谷歌搜索它却一无所获时,我知道它必须很简单!感谢您的帮助!
      • 请注意,检查obj Is Nothing 与检查IsNothing(obj) 不同!感谢您提供正确的语法来检查...不知道为什么IsNothing() 的行为不同...
      • 我发现Not (obj Is Nothing)Not obj Is Nothing 更容易理解。我的大脑不知道什么是“Not obj”!
      • 你也可以写:If obj IsNot Nothing 我觉得它比其他的更清晰。它也有点像 C# (ojb != null)
      猜你喜欢
      • 2019-07-23
      • 2012-03-10
      • 2020-05-11
      • 1970-01-01
      • 2014-09-15
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多