Копирование значений из предыдущей итерации цикла For в VBA

#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 затем вы можете попробовать пошаговую отладку и проверить, какие значения отображаются… это единственный способ.