检测行中的所有数组元素是否为空

时间:2016-06-19 12:35:38

标签: excel vba excel-vba

所以我试着为我的excel spreedsheet写一些VBA。

我有一个有四个颜色的表,我读了每一行,如果coloumn 1 2或3为空,我希望它跳过该行,而是退出并且不会移动到下一行。

  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***"

4 个答案:

答案 0 :(得分:4)

为什么不使用OR来简化 尝试将{2-4}条件替换为IFAND

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

答案 1 :(得分:1)

运行不断增加的IF测试以检查每个元素会变得混乱。

另一种选择是

  • 使用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

答案 2 :(得分:0)

附加到每个条件的

Exit For明确终止For循环,而不是继续循环的下一个循环。 Excel VBA没有Continue -type选项可以跳到循环的下一次迭代,因此您需要自己处理。

为了便于阅读,我经常编写故障条件,然后在Else子句下的可接受条件下运行代码:

&#13;
&#13;
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***"
&#13;
&#13;
&#13;

因为它不具有描述性并且可能与单元格属性混淆,所以我也不会有一个名为Value的变量。

答案 3 :(得分:0)

以下是您可能会使用的想法: 我正在做的是添加一个如果仅在三条线都不为空的情况下执行的话。如果其中任何一个为空,则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***"