2016-08-02 25 views
1

我有创建数组并在给定条件下输入“供应商名称”或“空值”(实际字符串null)的代码得到满足。如果某些条件不符合,数组将不会被填充任何数据,因此是空的(或者我相信)。VBA - 只有在数组非空的情况下运行if语句,即使数组为空时仍然运行,

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

它是一个字符串数组吗?从[这个SO线程](http://stackoverflow.com/a/206526/4650297),你可以尝试'如果Len(Join(yourArrayList))> 0然后' – BruceWayne

+0

我相信没有内置函数。你将不得不创建一个遍历数组的函数,并检查'​​null'的precense' – litelite

+1

如果你想检查Array *元素*(不是数组)是否为空,那么使用'Not IsEmpty(supplierCategoryCS (R))'。请参阅[IsEmpty](https://msdn.microsoft.com/en-us/library/office/gg264227.aspx)。 – trincot

回答

2

注意,IsEmpty功能不上一个空字符串的工作,它测试空数值。您可以在即时窗格中验证这一点:

?IsEmpty("") 
False 

因为你已经ReDim您的数组项的具体数量,所有这些项目都是由ReDim声明一个空字符串初始化。稍后,您可以使用单元格中的值或值"null"来分配(覆盖)一些项目。其他情况下仍会保留vbNullString初始化。

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

或者,如果你考虑空间或空间" "序列是空的,你会使用Trim

Trim(supplierCategoryP(r)) = vbNullString 

还要注意,这可能会显得迂腐,但重要的是:一个空数组与包含“空”值的已初始化的数组不同。您的数组永远不会是空的,即使它只包含“空”(vbNullString)值。

+0

我会在if语句中添加Trim(supplierCategoryP(r))= vbNullString吗? –

+0

是的,你会这样做:'如果supplierCategoryP(r)<>“null”和Trim(supplierCategoryP(r))<> vbNullString' –

+1

工作,非常感谢你! –

相关问题