繁体   English   中英

如何循环两列并将结果放入一列?

[英]How to loop two columns and put result into one column?

试图循环两列并将结果放入一列。

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

您的参考资料不正确,这就是您没有获得任何点击的原因。 您想检查两个单独的列以获取特定值,而只是在一个单元格中查找两种情况:

For Each cell In loopRange将遍历您定义的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

在您的If语句中,您正在检查单个单元格的内容,而您的If语句永远不会为真。 使用您的Union语句,您将获得一个包含 Col H所有单元格和 Col K所有单元格的Range ,并且在循环中您正在检查HK所有单元格。

因此,您的If命中,例如 Cell H2 ,您正在检查内容是否 > 207100 并且在同一时刻 < 12729。

如果列H ,您可能想要循环遍历所有单元格,检查它的值以及同一行K列中单元格的值。

我假设您的单元格包含一个以数字开头的字符串,但也包含一些字符。 我建议您将值写入中间变量,这样调试起来会容易得多。 您正在使用left函数,它将为您提供前 6 个(分别为 5 个)字符。 结果仍然是一个字符串(即使它只包含数字),并且您将它与一个数字进行比较,这不是一个好主意,因为现在 VBA 必须进行一些隐式转换,这可能会导致意外结果。 您应该使用Val函数将字符串转换为数值。

正如评论中已经提到的,永远不要在所谓的Active Worksheet上隐式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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM