Как l oop два столбца и положить результат в один столбец? - PullRequest
0 голосов
/ 05 февраля 2020

Попытка l oop двух столбцов и поместить результат в один столбец.

1) зацикливание некорректно (нет совпадений = неправильно)
2) печать помещает результат в два разных столбца ("O "+7 от H и" R "+7 от K).

Private Sub FindValueKH_JN()

'New column O (no 15)
'Find if value starting in column H (no8) is between 207100-208100
'AND if value starting in column K (no11) is between 12700-12729, 
' then T2J in column O, else T2N in O

Range("O1").Select
Selection.EntireColumn.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
ActiveCell.FormulaR1C1 = "T2 er Ja eller Nei"

Dim loopRange As Range

'From H to new column O is +7 columns
lastrow1 = ActiveSheet.Cells(Rows.Count, "H").End(xlUp).Row

'From K to new column O is +4 columns
lastrow2 = ActiveSheet.Cells(Rows.Count, "K").End(xlUp).Row

'loop columns H and K
Set loopRange = Union(Range("H2:H" & lastrow1), Range("K2:K" & lastrow2))

For Each cell In loopRange
    If Left(cell.Value, 6) >= 207100 And Left(cell.Value, 6) <= 208100 And _
      Left(cell.Value, 5) >= 12700 And Left(cell.Value, 5) <= 12729 Then

        cell.Offset(0, 7).Value = "T2J"

    Else: cell.Offset(0, 7).Value = "T2N"
    End If
Next cell

End Sub

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Ваши ссылки неверны, и поэтому вы не получаете никаких хитов. Вы хотите проверить два отдельных столбца для указанных значений c, но вместо этого просто смотрите в одной отдельной ячейке для обоих условий:

For Each cell In loopRange будет l oop через каждую ячейку в вашем определенном loopRange диапазон, который содержит оба столбца.

Вам придется изменить свой код, чтобы он вместо этого проходил по одному столбцу, как показано ниже:

Dim loopRange As Range
lastrow = ActiveSheet.Cells(Rows.Count, "H").End(xlUp).Row    'From H to new column O is +7 columns
Set loopRange = Range("H2:H" & lastrow1)                      'loop columns H

For Each cell In loopRange
    If Left(cell.Value, 6) >= 207100 And Left(cell.Value, 6) <= 208100 And Left(cell.Offset(, 3).Value, 5) >= 12700 And Left(cell.Offset(, 3).Value, 5) <= 12729 Then
        cell.Offset(0, 7).Value = "T2J"
    Else: cell.Offset(0, 7).Value = "T2N"
    End If
Next cell
0 голосов
/ 05 февраля 2020

В вашем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...