Excell vba数组循环在另一个循环中

时间:2016-12-17 00:53:30

标签: excel-vba vba excel

我尝试从excel中的每一行读取单元格,并检查我的单元格是否包含来自我的数组的值。

Dim products As Variant
products = Array("MS-CHOPMAT-6", "MS-BOARDS-3", "MS-CHOP-LR")
Dim element As Variant

For x = 2 To LastRow

    order_quantity = Range("$E$" & x).Value
    item_price = Range("$F$" & x).Value

    For Each element In products

    If InStr(Range("$D$" & x), element) > 0 Then
             Range("$H$" & x) = order_quantity * 3

        Else: Range("$H$" & x) = "ERROR - " & order_quantity & element

        End If
    Next element     
Next

不幸的是,循环中的“元素”始终是最后一个数组(产品)元素。在这种情况下,“MS-CHOP-LR”。

4 个答案:

答案 0 :(得分:0)

1。 您不能在数组中使用每个。使用;

For i = LBound(products) to UBound(products)
... products(i) ...
Next i

或者使用收藏品(谷歌是你的朋友)

2。 代码的最后一行应该说明

Next x

3。 LastRow可能并不总能为您提供正确的价值。使用;

Cells(x,y).end(xlDown).row

如果你确定你有一个concatinae行,或

Cells(x,y).SpecialCells(xlLastCell).roW

获取该单元格给定的任何范围内的绝对最后一行。请注意,在这两种情况下,如果该单元格下面没有任何值,则返回工作表的最后一行(xls 2003为65k,xlsx为2007+为1M)。还有其他选项可以获得范围中的最后一行,但这两个是我最喜欢的。

4。 如果else语句不需要双列(:),否则

答案 1 :(得分:0)

花了我几个小时,但我想我终于解决了你说的问题是......在你的代码运行之后,H列中的每个单元都有order_quantity * 3的值或者它值为ERROR - xxxMS-CHOP-LR"

这是因为您在products中经历每个元素,即使您在第一个或第二个元素上找到匹配项,因此"错误"只要最终元素不等于该行中的产品,就会显示该消息。

我建议您按如下方式更改代码:

Dim products As Variant
products = Array("MS-CHOPMAT-6", "MS-BOARDS-3", "MS-CHOP-LR")
Dim element As Variant
Dim matched As Boolean

For x = 2 To LastRow
    order_quantity = Range("$E$" & x).Value
    item_price = Range("$F$" & x).Value

    matched = False
    For Each element In products
        If InStr(Range("$D$" & x).Value, element) > 0 Then
            Range("$H$" & x).Value = order_quantity * 3
            matched = True
            Exit For
        End If
    Next element
    If Not matched Then
        Range("$H$" & x) = "ERROR - " & Range("$D$" & x).Value & " - unknown product"
    End If
Next

如果我完全误解了您的问题,请更新问题以提供更多信息。 (也许添加当前代码产生的屏幕转储以及您希望它产生的内容。)

答案 2 :(得分:0)

有一个很好的技巧"要查找String是否在数组中,请使用Match函数。

例如,让我们说你的单元格字符串是" MS-BOARDS-3"然后使用Match函数将返回一个数值。

如果您的单元格字符串是" MS-ELSE",那么使用Match函数将返回错误,因为它在您的数组中找不到。因此,如果您添加If IsError(Application.Match(Range("$D$" & x).Value, products, 0)) Then,则可以捕获此方案,并直接弹出您想要的MsgBox

<强>代码

Dim products As Variant
Dim element As Variant

' add an integer variable for the "Match" function
Dim ArrElementID As Integer

products = Array("MS-CHOPMAT-6", "MS-BOARDS-3", "MS-CHOP-LR")

For x = 2 To LastRow

    order_quantity = Range("$E$" & x).Value
    item_price = Range("$F$" & x).Value

    ' if value not found inside the array using the "MATCH" function
    If IsError(Application.Match(Range("$D$" & x).Value, products, 0)) Then
        Range("$H$" & x).Value = "ERROR - " & order_quantity & element
    Else ' successful "MATCH" inside the array
        Range("$H$" & x).Value = order_quantity * 3
    End If

Next

答案 3 :(得分:0)

非常感谢您的快速解答。 我将使用Shai Redo解决方案:

Dim products As Variant
LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
products = Array("MS-CHOPMAT-6", "MS-BOARDS-3", "MS-CHOP-LR")
'products = Array(Array("MS-CHOPMAT-6", 11), Array("MS-BOARDS-3", 12),   Array("MS-CHOP-LR", 13))
For x = LastRow To 1 Step -1

order_quantity = Range("$E$" & x).Value
item_price = Range("$F$" & x).Value

' if value not found inside the array using the "MATCH" function
If IsError(Application.Match(Range("$D$" & x).Value, products, 0)) Then
    Range("$H$" & x).Value = "ERROR - " & order_quantity
Else ' successful "MATCH" inside the array
    Range("$H$" & x).Value = order_quantity * 3 & LastRow
End If

Next

我的一个报告没问题,但在另一个报告中我需要数组这样的数组

products = Array(Array("MS-CHOPMAT-6", 11), Array("MS-BOARDS-3", 12),   Array("MS-CHOP-LR", 13))

如何在&#34;匹配&#34;中使用此类数组产品在哪里? 此致