Цикл для каждой ячейки в диапазоне не возвращает никаких желаемых значений, и я не получаю ошибок в своем коде

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь заставить этот простой цикл работать, я не получаю ошибок при нажатии Run sub, но в столбце W не отображаются значения. Я пытаюсь вернуть значение в столбце R, когда соответствующее значение в столбце N равно «продать». В чем моя вопиющая ошибка здесь?

 For Each cell In Range("n62:n166")

     If cell.Value = "sell" Then
     Range("r" amp; cell.Row) = Range("w" amp; cell.Row)

     End If
Exit For
Next
  

Большое спасибо, ребята. Я новичок в VBA, поэтому я все еще очень плох в этом. Спасибо.

Комментарии:

1. если вы выполняете цикл по одному столбцу, это будет проще в использовании For lRow = 62 to 166 , затем просто сравните If Cells(lRow,"N").Value = "Sell" Then , и в конце используйте Cells(lRow, "W").Value = Cells(lRow, "R").Value , и все готово, и почему у вас есть Exit For в вашем цикле???

2. прочитайте мой комментарий выше, почему у вас есть Exit For For цикл? Какое имя рабочего листа вы хотите использовать для запуска этого кода?

3. Привет @shairado, я пробовал этот метод до публикации этого, и я просто попробовал его снова, он не работает. :/

4. Вы хотите выйти из цикла после того, как найдено первое значение «продать»? Или вы хотите сделать это для всех значений «продать»?

5. @jadeliew123 как называется ваш рабочий лист?

Ответ №1:

Я бы посоветовал вам указать таблицу для всех вызовов диапазона и сделать сравнение нечувствительным к регистру

 With Sheets("Sheet2")
For Each cell In .Range("n62:n166")

     If Trim$(Lcase$(cell.Value2)) = "sell" Then
     .Range("r" amp; cell.Row).Value2 = .Range("w" amp; cell.Row).Value2

     End If
Next
End With
  

Ответ №2:

Если вы хотите скопировать значения из столбца R в столбец W (что я понял из вашего вопроса), тогда вы должны написать это : Range("W" amp; cell.Row) = Range("R" amp; cell.Row) . Более того, не должно быть Exit For и использовать Next cell вместо just Next .

 For Each cell In Range("n62:n166")
    If cell.Value = "sell" Then
        Range("W" amp; cell.Row).Value = Range("R" amp; cell.Row).Value
    End If
Next cell
  

Комментарии:

1. привет, VK, спасибо за ваш комментарий. Я пробовал оба эти изменения перед публикацией этого, и они не сработали! :<

2. К сожалению, это все еще не работает .. пробовал эти изменения :/

3. Возможно, вы работаете не на том листе… Чтобы проверить это, поместите MsgBox ActiveSheet.Name перед своим кодом, чтобы убедиться, что у вас правильный активный лист… И если это не работает, что он делает? Ничего? Или какая-то ошибка?

4. Я добавил листы («лист2»).активировать, но он все равно не работает!

5. поэтому попробуйте отследить это с помощью debugger. если вы изучаете VBA, вам все равно придется работать с debugger … или, если вы не хотите debugger , попробуйте поставить msgbox cell.value перед строкой with if . Это позволит вам проверить, что вы работаете с правильными ячейками с ожидаемыми значениями. Или, в качестве альтернативы, вы можете записать Debug.Print cell.Value , а затем просмотреть результаты в немедленном режиме widnow (вам нужно включить его где-нибудь в меню Просмотра).

Ответ №3:

Вы пытаетесь изменить значение ячейки в столбце R на значение в столбце W для строк, которые соответствуют требованиям ( value = "Sell" ) ? если это так, вы упускаете .Value часть — Здесь:

 For Each cell In Range("N62:N166")
     If Trim(WorksheetFunction.Proper(Cell.Value)) = "Sell" Then Range("R" amp; Cell.Row).Value = Range("W" amp; Cell.Row).Value
Next
  

Комментарии:

1. Использование Value — хорошая практика, но здесь это не обязательно. Я считаю Value , что это свойство объекта cell по умолчанию.

2. @V.K. Вы правы — я только сейчас увидел проблему (я исправил ее в своем коде, не осознавая этого) — после одной итерации вас вышвырнут из цикла из-за Exit for

3. @jadeliew123 Если мой первый код не сработал, это значит, что у вас неправильное качество данных («продать», «Продать» и «Продать» — это отдельные значения) — я изменил код, чтобы учесть это, и теперь он должен работать

4. @jadeliew123 Кроме того, вы хотите, чтобы он продолжал цикл до строки 166 или останавливался, как только вы нажмете на первую ячейку с Sell в ней? — Судя по вашему исходному коду, вы пытались остановиться после одного (так что это то, что у меня есть)

5. @Jeremy привет, Джереми, я хотел продолжить цикл до строки 166, потому что это лишь небольшая часть моего более сложного кода. каким был бы код, если бы я хотел продолжать цикл до строки 166 вместо того, чтобы просто находить первую ячейку?