2016-06-19 4 views
2

私のExcelスプライトシートにいくつかのVBAを書き込もうとしています。行のすべての配列要素が空であるかどうかを検出します。

私は4つのcoloumnsのテーブルを持っていますが、私は各行を読みました。coloumn 1 2または3が空であればその行をスキップしますが、代わりに終了して次の行に移動しません。それはOR を使用して、簡単なANDのそれぞれに添付

If myArray(y, 1) <> "" And myArray(y, 2) <> "" And myArray(y, 3) <> "" Then

+0

VBAが継続ステートメントを欠きます。その欠落を修正することは、GoToの比較的まれな正当な用途の1つです:http://stackoverflow.com/a/8680815/4996248 –

+0

または、これを使うことができます。if(myArray(y、1)&myArray(y、2) &myArray(y、3))<> ""次に何かをします。 – Jules

答えて

4

あなたの条件はmoではなくForループを明示的に終了していますループの次のサイクルに進む。 Excel VBAには、ループの次の繰り返しにスキップするための -typeオプションがないため、これを自分で処理する必要があります。それは説明的ではありませんので

For y = LBound(myArray) To UBound(myArray) 
 
    
 
    If myArray(y, 1) = "" Or myArray(y, 2) = "" Or myArray(y, 3) = "" Then 
 
     ' unsuitable for action 
 
    Else 
 
      
 
     Attribute = "Animal" 
 

 
     Value = myArray(y, 3) 
 
     Value = myArray(y, 2) & "¦" & FoodFunc(Value) & "¦" & myArray(y, 4) 
 
      Debug.Print Value 
 

 
     ' TODO: take useful action on the generated string 
 
    
 
    End If 
 

 
Next y 
 

 
    Debug.Print "***TEST FINISHED***"

と混同されることができます。私は、多くの場合、障害状態をコーディング、あなたが持っているように、その後、Else条項の下で許容できる条件でコードを実行し、読みやすさのために

セルのプロパティでは、 Valueという変数もありません。

0

Exit Forと組み合わせて1 IFによって2-4の条件をあなたのラインを交換してみてくださいしないのはなぜ

For y = LBound(myArray) To UBound(myArray) 
 
    
 
    If myArray(y, 1) = "" Then Exit For 
 
     If myArray(y, 2) = "" Then Exit For 
 
      If myArray(y, 3) = "" Then Exit For 
 
      
 
      
 
    Attribute = "Animal" 
 

 
    Value = myArray(y, 3) 
 
    Value = myArray(y, 2) & "¦" & FoodFunc(Value) & "¦" & myArray(y, 4) 
 
    
 
    
 
    Debug.Print Value 
 

 
    Next y 
 

 
Debug.Print "***TEST FINISHED***"

0

ここにあなたが使用する考えがあります: 私は、3行のどれも空でない場合にのみ実行するifを追加しています。いずれかが空の場合、for-loopは何もせず、次のyにスキップします。

For y = LBound(myArray) To UBound(myArray) 

If not(myArray(y, 1) = "" or myArray(y, 2) = "" or myArray(y, 3) = "") Then 
    Attribute = "Animal" 

    Value = myArray(y, 3) 
    Value = myArray(y, 2) & "¦" & FoodFunc(Value) & "¦" & myArray(y, 4) 


    Debug.Print Value 
End If 
Next y 
Debug.Print "***TEST FINISHED***" 
1

すべての要素をチェックするためにますます増加するIFテストを実行すると面倒です。

  • (Iループの外のでIndexスライスむしろ列よりも行アレイをTranspose以下の実施例において)

    別のオプションは、

    • Indexを使用して、アレイの各列スライスでありますTranposeは、行スライスを1D配列に変換するために使用されます。

    • Join行の文字列を作成します。
    • Len次いで、試験行が空の場合(文字列は長さがゼロの場合)

    コード

    `test array 
    myArray = [a1:d100] 
    myArr2 = Application.Transpose(myArray) 
    
    With Application 
    For y = LBound(myArray) To UBound(myArray) 
        If Len(Join(.Transpose(.Index(myArr2, , y)))) = 0 Then 
        `row is empty 
         Else 
        `plan b 
        End If 
    Next y 
    End With 
    
  • 関連する問題