VBA:如何测试字符串是否为空

时间:2018-03-02 10:25:04

标签: vba word-vba requirements

我在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 都是真实并执行。

5 个答案:

答案 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