测试字符串是否为空

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 = 1a = 2都被执行!!

基于This,等号和不等号运算符是“=”和“<>”。因此,我希望 a = 1a = 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 = 3a = 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,我们只会调用 Attributetext 属性。这避免了 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