VBA - 仅当数组不为空时运行if语句,即使数组为空,仍然运行

时间:2016-08-02 16:46:11

标签: arrays excel vba

我有代码创建一个数组,并在满足某些条件时将“供应商名称”或“空”(实际字符串为空)输入数组。如果不满足某些条件,阵列将不会填充任何数据,因此是空的(或者我相信)。

我要做的下一件事是只打印出该数组中列出的供应商名称。因此,我必须创建一个If语句,只有当数组中的项没有值为“null”且数组不为空时才会输入该语句。

我在下面的代码中遇到以下问题。字符串数组supplierCategoryP(r)不符合条件,因此从未填充任何信息。所以我假设这是一个空数组。然而,当我调试时,代码显示仍然输入了第一个If

If supplierCategoryP(r) <> "null" And Not IsEmpty(supplierCategoryP(r)) Then

......虽然它不应该,因为数组是空的。

k = 1
If countNoNull > 0 Then
    moveDownBy = countNoNull
    For r = 1 To nP
        If supplierCategoryP(r) <> "null" And Not IsEmpty(supplierCategoryP(r)) Then
            Cells(9 + k + moveDownBy, 5) = supplierCategoryP(r)
            k = k + 1
            countNoNull = countNoNull + 1
        End If
     Next r
 Else
     For r = 1 To nP
        If supplierCategoryP(r) <> "null" And Not IsEmpty(supplierCategoryP(r)) Then
            Cells(9 + k, 5) = supplierCategoryP(r)
            k = k + 1
            countNoNull = countNoNull + 1
        End If
    Next r
End If

创建数组的代码:

Worksheets("PEMCO").Activate
comNO = CLng(Range("commoditiesAmount").Text)
nP = CLng(Range("supplierAmount").Text)
ReDim supplierCategoryP(1 To nP) As String

For c = 1 To comNO
    commodityLoop = Cells(3, 1 + c)
    If commodity = commodityLoop Then
        For r = 1 To nP
            cellX = Cells(3 + r, 1 + c)
            If cellX = "x" Then
                supplierCategoryP(r) = Cells(3 + r, 1)
            Else
                supplierCategoryP(r) = "null"
            End If
        Next r
    End If
Next c

1 个答案:

答案 0 :(得分:2)

请注意,IsEmpty函数对空字符串不起作用,它会测试空数值。您可以在“立即”窗格中验证这一点:

?IsEmpty("")
False

由于您的数组ReDim为特定数量的项目,因此ReDim语句将所有这些项初始化为空字符串。稍后,您使用单元格中的值或"null"值分配(覆盖)某些项目。其他情况仍将保留vbNullString初始化。

要检查空字符串,您需要测试supplierCategoryP(r) = vbNullString(这是表达""的内置常量)。

或者,如果您将空格或空格序列" "视为空,则使用Trim

Trim(supplierCategoryP(r)) = vbNullString

另请注意,这可能看起来很迂腐,但重要的是:空数组与已初始化的包含“空”值的数组不同。您的数组永远不会为空,即使它只包含“空”(vbNullString)值。