2016-08-02 23 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

工作,非常感謝你! –

相關問題