我在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,等式和不等式运算符是&#34; =&#34;和&#34;&lt;&gt;&#34;。因此,我希望 a = 1 或 a = 2 执行字符串。 我的语法有问题吗?或者它是与ReqPro相关的问题吗?
我也尝试使用&#34; Is&#34;和#34; IsNot&#34;运算符,但它们导致编译器错误:类型不匹配
有人可以帮我这个吗?
更新:实际目标是查看是否
rqRequirement.AttrValue(&#34; MyAttreName&#34;,eAttrValueLookup_Label).text
是否为空。我添加了第二个if,以显示该语句在某种程度上不按照我期望的方式工作的问题。
更换&#34; Null&#34; to&#34; vbNullString&#34;没有做任何改变。
我也尝试过@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 都是真实并执行。
答案 0 :(得分:3)
VBA不支持测试字符串是否为&#34; Null&#34;。 VBA不像.NET语言或JavaScript(例如)。基本变量类型都有一个默认值,从声明变量的那一刻起,String的长度为零(""
) - 它没有未实例化的状态。您还可以测试vbNullString。
如果你测试
Dim s as String
Debug.Print s = Null, s <> Null, s = "", s = "a", IsNull(s), s = vbNullString
返回
Null Null True False False True
因此,如果您正在尝试测试是否已将任何内容分配给String变量,那么您可以做的唯一事情就是:
Debug.Print Len(s), s = "", Len(s) = 0, s = vbNullString
返回
0 True True True
请注意,这些可能性中最慢的是s = ""
,即使它似乎最容易记住。
答案 1 :(得分:2)
正如其他人所说,您希望针对字符串的null版本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
通过这种方式,如果我们实际设置text
,我们只会调用Attribute
的{{1}}属性。这样可以避免424次错误。
最后,如果你想弄清楚代码中发生的事情是什么导致运行,请执行以下操作:
Attribute
这将允许您查看代码所看到的内容。您也可以考虑使用断点。
答案 2 :(得分:1)
1)我认为你可以使用vbNullString来测试空字符串。否则使用&#34; Null&#34;如果是实际的字符串值。
2)确保a声明为长
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
答案 3 :(得分:0)
为确保互相排斥,请仅提出一次问题。
http://localhost:56365/authorize
您还可以使用a = IIf(rqRequirement.AttrValue("MyAttreName", eAttrValueLookup_Label).text = vbNullString , 2, 1)
构造,特别是如果您想要同时执行其他操作。
上面的代码示例假定If-Then-Else
调用是正确的。
答案 4 :(得分:0)
我登陆这里以寻找“ VBA:如何测试字符串是否为空”的答案
虽然此答案可能不适用于此特定用户情况,但确实适用于主题问题。
Dim s As String, s2 As String
s = ""
s2 = vbNullString
Debug.Print StrPtr(s) = 0, StrPtr(s2) = 0
返回
False True
因为vbNullString
是用于处理COM对象的C样式NULL指针,所以当未公开的StrPtr
函数返回时,其内存地址将始终为0