【问题标题】:VBA - Only run if statement when array is not empty still runs even when array is empty,VBA - 仅在数组不为空时运行 if 语句即使在数组为空时仍会运行,
【发布时间】:2016-08-02 16:46:11
【问题描述】:

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

接下来我要做的是仅打印出该数组中列出的供应商名称。因此,我必须创建一个 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

【问题讨论】:

  • 是字符串数组吗?来自this SO thread,你可以试试If Len(Join(yourArrayList)) &gt; 0 Then
  • 我相信没有内置功能。您将必须创建一个遍历数组的函数并检查 "null" 的存在
  • 如果要检查数组元素(不是数组)是否为空,则使用Not IsEmpty(supplierCategoryCS(r))。见IsEmpty
  • 如果你想测试整个数组是否为空,那为什么还要进入For循环呢?那么这个条件就错了。
  • @trincot,我很抱歉,我意识到调试时实际错误发生在哪里,并且能够更好地解释问题。请查看已编辑的问题。

标签: arrays excel vba


【解决方案1】:

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

?IsEmpty("")
False

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

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

或者,如果您认为空格或空格序列 " " 为空,则可以使用 Trim

Trim(supplierCategoryP(r)) = vbNullString

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

【讨论】:

  • 我会在 if 语句中放入 Trim(supplierCategoryP(r)) = vbNullString 吗?
  • 是的,你会喜欢:If supplierCategoryP(r) &lt;&gt; "null" And Trim(supplierCategoryP(r)) &lt;&gt; vbNullString
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多