测试字符串是否为空
Testing if a string is null
我是 VBA 的新手,我还没有完全习惯语法,如果我的问题听起来很愚蠢,我很抱歉。
我在 Word 2010 中使用 RequisitePro40 和 VBA 7.0。在我的模块之一中,我有以下循环和 If 条件:
Dim rqRequirements As ReqPro40.Requirements
Dim rqRequirement As ReqPro40.Requirement
Const eAttrValueLookup_Label = 4
Dim a As Integer
...
For Each vReqKey In rqRequirements
Set rqRequirement = rqRequirements(vReqKey)
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text <> Null Then
a = 1
End If
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text = Null Then
a = 2
End If
Next
在循环的每次迭代中,a = 1和a = 2都被执行!!
基于This,等号和不等号运算符是“=”和“<>”。因此,我希望 a = 1 或 a = 2 对字符串执行。
我的语法有问题吗?还是与 ReqPro 相关的问题?
我也尝试使用 "Is" 和 "IsNot" 运算符,但它们会导致编译器错误:类型不匹配
有人可以帮我解决这个问题吗?
更新:实际目的是看看
rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text
是否为 Null。我添加了第二个 if 以显示语句以某种方式无法按我期望的方式工作的问题。
将 "Null" 替换为 "vbNullString" 没有做任何更改。
我也尝试了@Slai建议的IsNull函数。结果几乎相同:
If IsNull(rqRequirement.AttrValue(att, eAttrValueLookup_Label).text) Then
a = 3
End If
If Not IsNull(rqRequirement.AttrValue(att, eAttrValueLookup_Label).text) Then
a = 4
End If
语句a = 3和a = 4都为真并执行。
1) 我认为您可以使用 vbNullString 来测试空字符串。否则使用 "Null" 如果实际字符串值。
2) 确保 a 声明为 long
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text <> vbNullString Then
a = 1
End If
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text = vbNullString Then
a = 2
Else
a = 3
End If
VBA 不支持检测字符串是否为 "Null"。 VBA 不像 .NET 语言或 JavaScript(例如)。基本变量类型都有一个默认值,从变量声明的那一刻起,字符串的长度为零(""
)——它没有未实例化的状态。您还可以测试 vbNullString。
如果你测试
Dim s as String
Debug.Print s = Null, s <> Null, s = "", s = "a", IsNull(s), s = vbNullString
return是
Null Null True False False True
因此,如果您要测试是否已将任何内容分配给字符串变量,您唯一可以做的是:
Debug.Print Len(s), s = "", Len(s) = 0, s = vbNullString
哪个returns
0 True True True
请注意,这些可能性中最慢的是 s = ""
,尽管它似乎最容易记住。
正如其他人所指出的,您想针对字符串的空版本 vbNullString 进行测试,而不是专门针对 Null
进行测试。除此之外,您还需要确保您的对象本身不为空。例如:
Dim rqRequirements As ReqPro40.Requirements
Dim rqRequirement As ReqPro40.Requirement
Const eAttrValueLookup_Label = 4
Dim a As Long ' Avoid Integer since it has a strong habit of causing overflow errors.
...
For Each vReqKey In rqRequirements
Set rqRequirement = rqRequirements(vReqKey)
If Not rqRequirement Is Nothing Then
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text <> vbNullString Then
a = 1
End If
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text = vbNullString Then
a = 2
End If
End If
Next
现在,我以前没有使用过这种特定的对象类型,但我相当确定 AttrValue("MyAttreName", eAttrValueLookup_Label)
正在返回某种对象。如果是这种情况,则首选以下模式:
Dim rqRequirements As ReqPro40.Requirements
Dim rqRequirement As ReqPro40.Requirement
Const eAttrValueLookup_Label = 4
Dim a As Long ' Avoid Integer since it has a strong habit of causing overflow errors.
...
For Each vReqKey In rqRequirements
Set rqRequirement = rqRequirements(vReqKey)
If Not rqRequirement Is Nothing Then
Dim Attribute as Object ' Or whatever type it should be
Set Attribute = rq.Requirement.AttrValue("MyAttreName", eAttrValueLookup)
If Not Attribute is Nothing Then
If Attribute.text <> Null Then
a = 1
End If
If Attribute.text = Null Then
a = 2
End If
End If
End If
Next
这样,如果我们实际设置了 Attribute
,我们只会调用 Attribute
的 text
属性。这避免了 424 错误。
最后,如果您想弄清楚导致两个 if 都为 运行 的代码中发生了什么,请执行以下操作:
Debug.Print "Attribute Text: ", Attribute.Text
这将允许您查看您的代码所看到的内容。你也可以考虑使用断点。
为确保互斥性,请仅提问一次。
a = IIf(rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text = vbNullString , 2, 1)
您也可以使用 If-Then-Else
构造,特别是当您有其他要同时执行的操作时。
以上代码示例假定 ~.text
调用是正确的。
我来到这里寻找 "VBA: How to test if a string is Null"
的答案
虽然这个答案可能不适用于这个特定的用户情况,但它确实适用于主题问题。
Dim s As String, s2 As String
s = ""
s2 = vbNullString
Debug.Print StrPtr(s) = 0, StrPtr(s2) = 0
哪个returns
False True
因为 vbNullString
是一个用于处理 COM 对象的 C 风格 NULL 指针,所以它的内存地址在由未记录的 StrPtr
函数返回时将始终为 0
我是 VBA 的新手,我还没有完全习惯语法,如果我的问题听起来很愚蠢,我很抱歉。
我在 Word 2010 中使用 RequisitePro40 和 VBA 7.0。在我的模块之一中,我有以下循环和 If 条件:
Dim rqRequirements As ReqPro40.Requirements
Dim rqRequirement As ReqPro40.Requirement
Const eAttrValueLookup_Label = 4
Dim a As Integer
...
For Each vReqKey In rqRequirements
Set rqRequirement = rqRequirements(vReqKey)
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text <> Null Then
a = 1
End If
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text = Null Then
a = 2
End If
Next
在循环的每次迭代中,a = 1和a = 2都被执行!!
基于This,等号和不等号运算符是“=”和“<>”。因此,我希望 a = 1 或 a = 2 对字符串执行。 我的语法有问题吗?还是与 ReqPro 相关的问题?
我也尝试使用 "Is" 和 "IsNot" 运算符,但它们会导致编译器错误:类型不匹配
有人可以帮我解决这个问题吗?
更新:实际目的是看看
rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text
是否为 Null。我添加了第二个 if 以显示语句以某种方式无法按我期望的方式工作的问题。
将 "Null" 替换为 "vbNullString" 没有做任何更改。
我也尝试了@Slai建议的IsNull函数。结果几乎相同:
If IsNull(rqRequirement.AttrValue(att, eAttrValueLookup_Label).text) Then
a = 3
End If
If Not IsNull(rqRequirement.AttrValue(att, eAttrValueLookup_Label).text) Then
a = 4
End If
语句a = 3和a = 4都为真并执行。
1) 我认为您可以使用 vbNullString 来测试空字符串。否则使用 "Null" 如果实际字符串值。
2) 确保 a 声明为 long
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text <> vbNullString Then
a = 1
End If
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text = vbNullString Then
a = 2
Else
a = 3
End If
VBA 不支持检测字符串是否为 "Null"。 VBA 不像 .NET 语言或 JavaScript(例如)。基本变量类型都有一个默认值,从变量声明的那一刻起,字符串的长度为零(""
)——它没有未实例化的状态。您还可以测试 vbNullString。
如果你测试
Dim s as String
Debug.Print s = Null, s <> Null, s = "", s = "a", IsNull(s), s = vbNullString
return是
Null Null True False False True
因此,如果您要测试是否已将任何内容分配给字符串变量,您唯一可以做的是:
Debug.Print Len(s), s = "", Len(s) = 0, s = vbNullString
哪个returns
0 True True True
请注意,这些可能性中最慢的是 s = ""
,尽管它似乎最容易记住。
正如其他人所指出的,您想针对字符串的空版本 vbNullString 进行测试,而不是专门针对 Null
进行测试。除此之外,您还需要确保您的对象本身不为空。例如:
Dim rqRequirements As ReqPro40.Requirements
Dim rqRequirement As ReqPro40.Requirement
Const eAttrValueLookup_Label = 4
Dim a As Long ' Avoid Integer since it has a strong habit of causing overflow errors.
...
For Each vReqKey In rqRequirements
Set rqRequirement = rqRequirements(vReqKey)
If Not rqRequirement Is Nothing Then
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text <> vbNullString Then
a = 1
End If
If rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text = vbNullString Then
a = 2
End If
End If
Next
现在,我以前没有使用过这种特定的对象类型,但我相当确定 AttrValue("MyAttreName", eAttrValueLookup_Label)
正在返回某种对象。如果是这种情况,则首选以下模式:
Dim rqRequirements As ReqPro40.Requirements
Dim rqRequirement As ReqPro40.Requirement
Const eAttrValueLookup_Label = 4
Dim a As Long ' Avoid Integer since it has a strong habit of causing overflow errors.
...
For Each vReqKey In rqRequirements
Set rqRequirement = rqRequirements(vReqKey)
If Not rqRequirement Is Nothing Then
Dim Attribute as Object ' Or whatever type it should be
Set Attribute = rq.Requirement.AttrValue("MyAttreName", eAttrValueLookup)
If Not Attribute is Nothing Then
If Attribute.text <> Null Then
a = 1
End If
If Attribute.text = Null Then
a = 2
End If
End If
End If
Next
这样,如果我们实际设置了 Attribute
,我们只会调用 Attribute
的 text
属性。这避免了 424 错误。
最后,如果您想弄清楚导致两个 if 都为 运行 的代码中发生了什么,请执行以下操作:
Debug.Print "Attribute Text: ", Attribute.Text
这将允许您查看您的代码所看到的内容。你也可以考虑使用断点。
为确保互斥性,请仅提问一次。
a = IIf(rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text = vbNullString , 2, 1)
您也可以使用 If-Then-Else
构造,特别是当您有其他要同时执行的操作时。
以上代码示例假定 ~.text
调用是正确的。
我来到这里寻找 "VBA: How to test if a string is Null"
的答案虽然这个答案可能不适用于这个特定的用户情况,但它确实适用于主题问题。
Dim s As String, s2 As String
s = ""
s2 = vbNullString
Debug.Print StrPtr(s) = 0, StrPtr(s2) = 0
哪个returns
False True
因为 vbNullString
是一个用于处理 COM 对象的 C 风格 NULL 指针,所以它的内存地址在由未记录的 StrPtr
函数返回时将始终为 0