【问题标题】:Looping through rows and apply different conditional formatting for each row循环遍历行并为每一行应用不同的条件格式
【发布时间】:2018-01-18 12:32:45
【问题描述】:

此脚本在一行的第一列中查找值,在第二张表中查找相应的值,并从第二张表中同一行的其他列中获取值。然后,它根据从第二张表中检索到的值对第一张表中的值应用条件格式。

但是,我一次只能让它在一行上工作,而且我不希望为第一张表中的所有行重复代码。如何循环遍历第一张表中的所有行并对剩余的行执行相同的操作?

Sub Vlookup4()

Dim FndStr As String
Dim FndVal As Range
Dim FndRng As Range
Dim Ul1 As Double, Ul2 As Double, Ul3 As Double, Ul4 As Double, Ul5 As Double

    FndStr = Range("A10").Value

    Set FndVal = Worksheets("Grenseverdier_jord").Columns("A:A").Find(What:=FndStr, LookAt:=xlWhole)
        Ul1 = FndVal.Offset(0, 1).Value
        Ul2 = FndVal.Offset(0, 2).Value
        Ul3 = FndVal.Offset(0, 3).Value
        Ul4 = FndVal.Offset(0, 4).Value
        Ul5 = FndVal.Offset(0, 5).Value

    Set FndRng = Range(Cells(10, 3), Cells(10, Cells(10, Columns.Count).End(xlToLeft).Column))

    Debug.Print FndRng.Address

    With ActiveSheet

        With FndRng
            .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C10);C10<" & Ul1 & ")"
            .FormatConditions(1).Interior.ColorIndex = 33
            .FormatConditions(1).Borders.LineStyle = xlContinuous
            .FormatConditions(1).Borders.Weight = xlThin

            .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C10);C10>=" & Ul1 & ";C10<" & Ul2 & ")"
            .FormatConditions(2).Interior.ColorIndex = 4
            .FormatConditions(2).Borders.LineStyle = xlContinuous
            .FormatConditions(2).Borders.Weight = xlThin

            .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C10);C10>=" & Ul2 & ";C10<" & Ul3 & ")"
            .FormatConditions(3).Interior.ColorIndex = 6
            .FormatConditions(3).Borders.LineStyle = xlContinuous
            .FormatConditions(3).Borders.Weight = xlThin

            .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C10);C10>=" & Ul3 & ";C10<" & Ul4 & ")"
            .FormatConditions(4).Interior.ColorIndex = 45
            .FormatConditions(4).Borders.LineStyle = xlContinuous
            .FormatConditions(4).Borders.Weight = xlThin

            .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C10);C10>=" & Ul4 & ";C10<" & Ul5 & ")"
            .FormatConditions(5).Borders.LineStyle = xlContinuous
            .FormatConditions(5).Borders.Weight = xlThin
            .FormatConditions(5).Interior.ColorIndex = 3

            .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C10);C10>=" & Ul5 & ")"
            .FormatConditions(6).Interior.ColorIndex = 7
            .FormatConditions(6).Borders.LineStyle = xlContinuous
            .FormatConditions(6).Borders.Weight = xlThin

            .FormatConditions.Add xlExpression, Formula1:="=LEFT(C10;1)=""<"""
            .FormatConditions(7).Interior.ColorIndex = 33
            .FormatConditions(7).Borders.LineStyle = xlContinuous
            .FormatConditions(7).Borders.Weight = xlThin

            .FormatConditions.Add xlExpression, Formula1:="=(C10) = ""n.d."""
            .FormatConditions(8).Interior.ColorIndex = 33
            .FormatConditions(8).Borders.LineStyle = xlContinuous
            .FormatConditions(8).Borders.Weight = xlThin

        End With
        End With
End Sub

我正在附上一个示例文件进行测试。

Sample file

【问题讨论】:

  • 循环播放
  • 你能指出我正确的方向吗?如何把它放在一个循环中?试了试也解不开它的逻辑。

标签: vba excel loops


【解决方案1】:

这应该为你做:

Sub Vlookup4()

Dim FndStr As String
'Dim FndVal As Range
Dim FndRng As Range
Dim Ul1 As Double, Ul2 As Double, Ul3 As Double, Ul4 As Double, Ul5 As Double
Dim ws As Worksheet: Set ws = Sheets("Sheet1")
'declare and set your worksheet, amend as required
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'get the last row with data on Column A

For i = 10 To LastRow
    FndStr = ws.Range("A" & i).Value

    Set FndVal = Worksheets("Grenseverdier_jord").Columns("A:A").Find(What:=FndStr, LookAt:=xlWhole)
        If Not FndVal Is Nothing Then
                Ul1 = FndVal.Offset(0, 1).Value
                Ul2 = FndVal.Offset(0, 2).Value
                Ul3 = FndVal.Offset(0, 3).Value
                Ul4 = FndVal.Offset(0, 4).Value
                Ul5 = FndVal.Offset(0, 5).Value

            Set FndRng = ws.Range("C" & i & ":I" & i)

            With ActiveSheet

                With FndRng

                    .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C " & i & ");C " & i & "<" & Ul1 & ")"
                    .FormatConditions(1).Interior.ColorIndex = 33
                    .FormatConditions(1).Borders.LineStyle = xlContinuous
                    .FormatConditions(1).Borders.Weight = xlThin

                    .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C " & i & ");C " & i & ">=" & Ul1 & ";C " & i & "<" & Ul2 & ")"
                    .FormatConditions(2).Interior.ColorIndex = 4
                    .FormatConditions(2).Borders.LineStyle = xlContinuous
                    .FormatConditions(2).Borders.Weight = xlThin

                    .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C " & i & ");C " & i & ">=" & Ul2 & ";C " & i & "<" & Ul3 & ")"
                    .FormatConditions(3).Interior.ColorIndex = 6
                    .FormatConditions(3).Borders.LineStyle = xlContinuous
                    .FormatConditions(3).Borders.Weight = xlThin

                    .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C " & i & ");C " & i & ">=" & Ul3 & ";C " & i & "<" & Ul4 & ")"
                    .FormatConditions(4).Interior.ColorIndex = 45
                    .FormatConditions(4).Borders.LineStyle = xlContinuous
                    .FormatConditions(4).Borders.Weight = xlThin

                    .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C " & i & ");C " & i & ">=" & Ul4 & ";C " & i & "<" & Ul5 & ")"
                    .FormatConditions(5).Borders.LineStyle = xlContinuous
                    .FormatConditions(5).Borders.Weight = xlThin
                    .FormatConditions(5).Interior.ColorIndex = 3

                    .FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(C " & i & ");C " & i & ">=" & Ul5 & ")"
                    .FormatConditions(6).Interior.ColorIndex = 7
                    .FormatConditions(6).Borders.LineStyle = xlContinuous
                    .FormatConditions(6).Borders.Weight = xlThin

                    .FormatConditions.Add xlExpression, Formula1:="=LEFT(C " & i & ";1)=""<"""
                    .FormatConditions(7).Interior.ColorIndex = 33
                    .FormatConditions(7).Borders.LineStyle = xlContinuous
                    .FormatConditions(7).Borders.Weight = xlThin

                    .FormatConditions.Add xlExpression, Formula1:="=(C " & i & ") = ""n.d."""
                    .FormatConditions(8).Interior.ColorIndex = 33
                    .FormatConditions(8).Borders.LineStyle = xlContinuous
                    .FormatConditions(8).Borders.Weight = xlThin
                End With
            End With
        End If
Next i
End Sub

我添加了一行来查找 LastRow,然后使用 For 循环遍历每一行,我还添加了 If Not FndVal Is Nothing Then 以确保如果在另一张纸上找不到任何内容,它不会导致一个错误。

【讨论】:

  • 谢谢!它几乎是开箱即用的,我只需要将条件格式部分中的 C10 引用改为 C" &amp; i &amp; "。然后它完美地工作了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2015-06-16
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
相关资源
最近更新 更多