2016-08-02 17 views
1

配列を作成し、配列に「サプライヤ名」または「null」(実際の文字列null)満たされている。特定の条件が満たされない場合、配列はデータでいっぱいにならず、したがって空です(または私は信じています)。VBA - 配列が空でないときにif文を実行するのは、配列が空の場合でも実行されます。

私がしたいのは、その配列に記載されているサプライヤーの名前だけを印刷することです。したがって、配列内の項目に値 "null"がなく、配列が空でない場合にのみ入力されるIfステートメントを作成する必要があります。

以下のコードでは、次の問題が発生しています。文字列配列supplierCategoryP(r)は条件を満たさなかったため、情報が一切入力されませんでした。だから私はこれが空の配列だと仮定します。

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

を...それはいけない一方で、配列が空であるため、私はデバッグするときしかし、コードはこの最初のIfがまだ入力されていることを示しています。配列を作成します

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 

コード:IsEmpty関数はnull文字列では動作しないこと

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)から、 'If Len(Join(yourArrayList))> 0 Then''を試すことができます。 – BruceWayne

+0

そのための組み込み関数はないと思います。配列を反復し、 '' null ''の意味を確認する関数を作成する必要があります – litelite

+1

Array *要素*(配列ではない)が空であるかどうかをチェックするには、' Not IsEmpty(supplierCategoryCS (r)) 'となる。 [IsEmpty](https://msdn.microsoft.com/en-us/library/office/gg264227.aspx)を参照してください。 – trincot

答えて

2

注意、それが空の数値をテストします。あなたは即時ペインにこれ​​を確認することができます:あなたはReDim項目の具体的な数にあなたの配列は、それらの項目の全てがReDim声明では空の文字列として初期化されてきましたので、

?IsEmpty("") 
False 

。後で、これらのアイテムの一部にセルの値または"null"の値を割り当てる(上書きする)。他のケースでは、まだ初期化からvbNullStringが保持されます。

空の文字列を確認するには、supplierCategoryP(r) = vbNullString(これは""を表す組み込み定数)かどうかをテストする必要があります。

それとも、あなたがスペースまたはスペース" "のシーケンスが空であることを考えるならば、あなたはTrim使用したい:また

Trim(supplierCategoryP(r)) = vbNullString 

注意、これは知識をひけらかすように見えるかもしれないが、それは重要です:空の配列空の値を含む初期化された配列と同じではありません。 「空」(vbNullString)値だけが含まれていても、配列は空のに決してなりません。

+0

Trim(supplierCategoryP(r))= vbNullStringをif文に入れますか? –

+0

はい、あなたは次のようにします: 'supplierCategoryP(r)<>" null "とトリム(supplierCategoryP(r))<> vbNullString' –

+1

それはうまくいきました。 –

関連する問題