В вашем If
заявлении вы проверяете содержимое одной ячейки, и ваше If
заявление никогда не может быть истинным. С вашим Union
утверждением вы получите Range
со всеми ячейками Col H
и со всеми ячейками Col K
, а в l oop вы проверяете все ячейки, которые либо в H
или в K
.
Таким образом, ваш If
, например, нажимает на ячейку H2
, и вы проверяете, является ли содержимое> 207100 и в тот же момент <12729. </p>
Что вы, вероятно, хотите, чтобы l oop по всем ячейкам, если столбец H
, проверьте его значение вместе со значением ячейки в столбце K
той же строки.
Я предполагаю, что ваши ячейки содержат строку, начинающуюся с числа но содержит также некоторые символы. Я бы посоветовал вам записать значения в промежуточные переменные, что значительно облегчает отладку. Вы используете функцию left
, которая даст вам первые 6 (или соответственно 5) символов. Результатом по-прежнему является строка (даже если она содержит только цифры), и вы сравниваете ее с числом, и это не очень хорошая идея, поскольку теперь VBA должна выполнять некоторые неявные преобразования, что может привести к неожиданным результатам. Вы должны использовать Val
-функцию для преобразования строки в числовое значение c.
Как уже упоминалось в комментариях, никогда не работайте неявно с так называемым Active Worksheet
. Укажите явно таблицу, с которой вы хотите работать.
Один вопрос: почему вы используете странный синтаксис для Else
заявления. :
означает, что вы помещаете второе утверждение в строку. Гораздо удобнее читать :
и помещать следующий оператор (ы) в отдельные строки.
Dim loopRange As Range, cell As Range, lastrow As Long
With ThisWorkbook.Sheets(1)
lastrow = .Cells(Rows.Count, "H").End(xlUp).row
Set loopRange = .Range("H2:H" & lastrow)
End With
For Each cell In loopRange
Dim valH As Long, valK As Long
valH = Val(Left(cell.Value, 6))
valK = Val(Left(cell.Offset(0, 3).Value, 6))
If valH >= 207100 And valH <= 208100 And valK >= 12700 And valK <= 12729 Then
cell.Offset(0, 7).Value = "T2J"
Else
cell.Offset(0, 7).Value = "T2N"
End If
Next cell