2016-12-17 2 views
2

Я пытаюсь прочитать ячейки из каждой строки в excel и проверить, содержит ли моя ячейка значение из моего массива.Excell vba array loop внутри другого цикла

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

Существует «хороший трюк», чтобы найти, если String находится внутри массива, то с помощью функции Match.

Например, ваша ячейка String является «MS-BOARDS-3», а затем функция Match вернет числовое значение.

Если ваша ячейка String является «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 
+0

hi Shai. Как найти индекс продукта в этом коде? – awariat

+0

@awariat вы спрашиваете, как получить индекс массива 'products'? используя функцию 'Match'? –

+0

Нет, как найти индекс продуктов в этом коде, который вы мне дали. Какая позиция была проверена, если? – awariat

0

1. Вы не можете использовать для каждого в массиве. Используйте;

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

Или сделать использование коллекций (Google является вашим другом)

2. В последней строке кода следует указать

Next x 

3. LastRow не всегда может получить вам правильное значение. Используйте;

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

Если вы знаете, что вы имеете concatinae строку или

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

Чтобы получить абсолютную последнюю строку в любом диапазоне заданного из этой ячейки. Обратите внимание, что в обоих случаях, если в этой ячейке нет значений, возвращается самая последняя строка рабочего листа (65k для xls 2003 и 1M для xlsx 2007+). Есть и другие варианты, чтобы получить последнюю строку в диапазоне, но эти две мои любимые.

4. Если другое заявление не требует двойной колонки (:) после того, как еще

+1

1. Итерация через каждый элемент массива Variant действительно работает. 2. 'x' в' Next x' ** необязательно ** (но полезно для отслеживания того, какой цикл заканчивается). 3. Код OP не показывает, как была установлена ​​переменная 'LastRow', поэтому они могли использовать код, который вы дали, или, вероятно, лучший код' Cells (Rows.Count, y) .End (xlUp) .Row' 4. Двоеточие (':') в строке 'Else', которая содержит код else, автоматически генерируется. (Синтаксически, 'Else' не должен иметь никакого кода, следующего за ним, поэтому среда IDE вставляет разделитель операторов двоеточия, чтобы разделить строку на два оператора.) – YowE3K

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 

Если я совершенно не понял ваш вопрос, пожалуйста, обновите вопрос, чтобы дать больше информации. (Может быть, добавить экран дампы, что производит текущий код и то, что вы ожидаете, что производить.)

0

Большое спасибо за ваши быстрые ответы. Я буду использовать Шай 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)) 

Как использовать такой массив в «матче», где продукты? С уважением

+0

Было бы лучше для будущих зрителей этого сообщения, если бы вы приняли ответ @ ShaiRado и удалили его. Если у вас есть второй вопрос, вы должны сделать новый пост. Этот пост посвящен использованию функции 'Match', тогда как ваш второй вопрос больше подходит к чему-то вроде' Collection' – Ambie

Смежные вопросы