如何构建一个可以与vba中的0区分开来的默认空对象?

How can I build a default empty object that can be differentiated from 0 in vba?

我正在阅读一个文本文件,其中包含有关机械紧固件的数据。我构建了一个具有以下属性的对象紧固件(通过 class):

type as string
number as long
master as long
slave as long

我要补一个扣件合集:

Cfastener as collection

在文本文件中,类型、编号、主从可以随机出现,并不总是全部存在。为了解决这个问题,我定义了一个当前紧固件(某种缓冲区)和一个默认的 "empty" 紧固件:

currentfastener as fastener
initfastener as fastener
with initfastener
    .type = "-1"
    .number = -1
    .master = -1
    .slave = -1
end with

我阅读了我的文本文件,当我检测到引用这些属性之一的关键字时,我测试了 current fastener:

中的值
Do until .atendofstream
    line = .readline
    Select case line
        Case masterkeyword
            if currentfastener.master <> -1 then 'We already have a master. This means that we need to save the currentfastener and start a new one.
                Cfasteners.add currentfastener
                currentfastener = initfastener
            else 'master is "empty": we fill the currentfastener. 
                currentfastener.master= "value read from the text stream"
            end if
    End Select
Loop

到目前为止,我使用 -1 表示数字,"-1" 表示字符串作为默认的空参数。直到现在它都很好,因为参数无法获得这个值。但是现在,我想给主从添加一个空间位置,可以是-1。所以我想回到我的第一个想法,那就是将所有 initfixation 参数定义为 empty.

但如果我没记错的话,0 值与 vba 中的 empty 值是不可能区分的,这会造成麻烦。

你知道一个默认值,它不是 0,可以区分 0 而不是 -1 吗?

EmptyVariant 类型一起使用。将 StringLong 设置为 Empty 然后用 IsEmpty() 测试它的空性是行不通的。

可以 使用变体来存储您的数据,但是,然后您可以安全地使用 Empty 值来表示 empty/missing 值。

您说得对,VB 会将 Empty 转换为 0 以进行数字比较。例如:

Dim v As Variant
Debug.Print (v = 0)        ' => True 

但是您可以使用 VarType() 函数来测试变体是否具有 Empty 值:

Dim v As Variant
Debug.Print VarType(v) = vbEmpty    ' => True (empty/uninitialized)
v = 0
Debug.Print VarType(v) = vbEmpty    ' => False
v = Empty
Debug.Print VarType(v) = vbEmpty    ' => True (empty)

将所有这些声明为变体。

 type as string
 number as long
 master as long
 slave as long

声明后的默认值为vbEmpty。

你可以测试这个

Dim av As Variant

If IsEmpty(av) Then Debug.Print "if isempty(av ) "

' I Wouldn't use this (it works but is overkill)
' If VarType(av) = vbEmpty Then Debug.Print "If VarType(av)= vbEmpty "

您可以显式分配 Empty 例如

av = Empty

VB 会将 Empty 转换为 0 以进行数字比较。

Sub ExperimentsWithVariants()

Dim avar As Variant

' is not set

' When a variant has not been assigned

Debug.Print "-----------------------"
Debug.Print "NOT SET:"
Debug.Print "-----------------------"
Debug.Print "aVar = Empty ", (avar = Empty)      ' True
Debug.Print "aVar", avar                         '             '' ie blank
Debug.Print "IsNull(aVar)", (IsNull(avar))       ' False
Debug.Print "IsEmpty(aVar)", (IsEmpty(avar))     ' True
Debug.Print "aVar = """"", (avar = "")           ' True
Debug.Print "aVar = 0", (avar = 0)               ' True

If avar = Empty Then
    Debug.Print " "
    Debug.Print "avar = Empty so the above would be the saem if you set avar = Empty explicitly"
    Debug.Print " """
Else
    avar = Empty
    Debug.Print " "
    Debug.Print "-----------------------"
    Debug.Print " SET TO Empty"
    Debug.Print "-----------------------"
    Debug.Print "aVar = Empty ", (avar = Empty)      ' True
    Debug.Print "aVar", avar                         '            '' ie blank
    Debug.Print "IsNull(aVar)", (IsNull(avar))       ' False
    Debug.Print "IsEmpty(aVar)", (IsEmpty(avar))     ' True
    Debug.Print "aVar = """"", (avar = "")           ' True
    Debug.Print "aVar = 0", (avar = 0)               ' True
End If

avar = Null
Debug.Print " "
Debug.Print "-----------------------"
Debug.Print " SET TO NULL"
Debug.Print "-----------------------"
Debug.Print "aVar = Empty ", (avar = Empty)      ' Null
Debug.Print "aVar", avar                         ' Null
Debug.Print "IsNull(aVar)", (IsNull(avar))       ' True
Debug.Print "IsEmpty(aVar)", (IsEmpty(avar))     ' False
Debug.Print "aVar = """"", (avar = "")           ' Null
Debug.Print "aVar = 0", (avar = 0)               ' Null


avar = ""
Debug.Print " "
Debug.Print "-----------------------"
Debug.Print " SET TO """""
Debug.Print "-----------------------"
Debug.Print "aVar = Empty ", (avar = Empty)      ' True
Debug.Print "aVar", avar                         '            '' ie blank
Debug.Print "IsNull(aVar)", (IsNull(avar))       ' False
Debug.Print "IsEmpty(aVar)", (IsEmpty(avar))     ' False
Debug.Print "aVar = """"", (avar = "")           ' True
Debug.Print "aVar = 0", (avar = 0)               ' False
' Note
' Is empty returns false, whereas ="" returns NULL




End Sub