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