VBA – 只有在数组不为空的情况下才运行,即使在数组为空的情况下,

我有创build一个数组的代码,并input“供应商名称”或“null”(实际stringnull)到数组中,如果满足某些条件。 如果某些条件不符合,数组将不会被填充任何数据,因此是空的(或者我相信)。

接下来我要做的是仅打印出该数组中列出的供应商名称。 因此,我必须创build一个If语句,只有当数组中的项不具有值“null”和数组不为空时才会进入。

我在下面的代码中遇到以下问题。 string数组supplierCategoryP(r)不符合条件,因此从未填充任何信息。 所以我认为这是一个空的数组。 然而,当我debugging时,代码显示,这首先If仍然input:

 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 

创build数组的代码:

 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 

请注意, IsEmpty函数不适用于空string,它将testing空数值。 您可以在“即时”窗格中进行validation:

 ?IsEmpty("") False 

由于您已经将数组ReDim指定为特定数量的项目,因此ReDim语句将所有这些项目初始化为空string。 稍后,您可以使用单元格中的值或"null"值分配(覆盖)一些项目。 其他情况下仍然会保留从初始化vbNullString

要检查一个空string,你需要testing是否supplierCategoryP(r) = vbNullString (这是expression""的内置常量)。

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

 Trim(supplierCategoryP(r)) = vbNullString 

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