我尝试从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”。
答案 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;中使用此类数组产品在哪里? 此致