如何构建一个可以与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 吗?
Empty
与 Variant
类型一起使用。将 String
或 Long
设置为 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
我正在阅读一个文本文件,其中包含有关机械紧固件的数据。我构建了一个具有以下属性的对象紧固件(通过 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 吗?
Empty
与 Variant
类型一起使用。将 String
或 Long
设置为 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