#vba #for-loop
#vba #цикл For
Вопрос:
Надеюсь, этот вопрос не задавался раньше или слишком глуп.
Я пытаюсь сделать то, что, как я думал, было бы относительно простой задачей VBA, просматривая матрицу и заполняя столбец в зависимости от того, какие значения можно найти в других столбцах. Если определенные критерии не соблюдены, я хочу скопировать значение из предыдущей строки.
Это то, что, как я думал, сработает:
For i = 1 To n
If a(3, i) = 1 Then
a(5, i) = 1
ElseIf a(2, i) = 9 Then
a(5, i) = 0
Else
a(5, i) = a(5, i - 1)
End If
Next i
Однако значения 1 не переносятся, и ячейка после 1 становится 0, несмотря на то, что условие 0 не выполняется. Есть предложения?
Редактировать: Вот его часть, которая не выполняет то, что я хочу, в последних двух строках второе условие не выполнено, но пятый столбец по-прежнему равен 0. Я бы хотел, чтобы макрос копировал 1 из указанной выше ячейки до тех пор, пока не будет выполнено второе условие.
Комментарии:
1. Не могли бы вы, пожалуйста, привести пример ваших матричных данных (до) и желаемый результат ваших матричных данных (после)?
2. Вы указываете своему макросу проверить, если строка 3 и столбец
i
равны 1, то строка 5 и столбецi
равны 1. Если строка 2 и столбецi
равны 9, то строка 5 и столбецi
равны 0. Ещё.. строка 5 столбцаi
равна строке 5, столбецi - 1
. Для Excel и его массивовa(x, y)
означаетx = row
иy = column
.3. Я опубликовал фрагмент матрицы в исходном сообщении, надеюсь, вы понимаете, что я имею в виду, Wizhi. И спасибо, Дамиан, я не знал, но если я чего-то не упустил, это не должно повлиять на функцию опубликованного кода, если я чего-то не упустил.
4. @erikdansle19 вы перебираете все столбцы в своей матрице, снова и снова меняя одни и те же «ячейки», поэтому вам нужно изменить свой код, чтобы перебирать все ваши строки.
Ответ №1:
Попробуйте это:
For i = 1 To n
If a(i, 3) = 1 Then 'if row i column 3
a(i, 5) = 1
ElseIf a(i, 2) = 9 Then 'elseif row i column 2
a(i, 5) = 0
Else 'else which will only trigger if none of the ones before trigger
a(i, 5) = a(i - 1, 5)
End If
Next i
Комментарии:
1. Спасибо. Я изменил свой код, чтобы корректно вводить строки и столбцы, но, к сожалению, это не меняет результат, по какой-то причине он по-прежнему не копирует значения из строки выше.
2. @erikdansle19 значение из строки выше будет скопировано только в том случае, ЕСЛИ столбец 3 <> 1 и столбец <> 9. Если одно из этих значений истинно, оно никогда не скопирует значение из строки выше. В вашей матрице все строки имеют 1 в столбце 3. Таким образом, он никогда не перейдет к
Else
, остановится на первомIf
. Проверьте, какIf
работает.3. Не в последних двух строках, что меня сбивает с толку, там ни одно из условий не выполнено, но я все равно получаю 0: s в столбце 5.
4. @erikdansle19 затем вы можете попробовать пошаговую отладку и проверить, какие значения отображаются… это единственный способ.