Excel VBA - Loop needed for a column

大兔子大兔子 提交于 2020-01-02 15:16:16

问题


I'm very new to excel VBA and I can't figure out how to get this to work. I have a column (column K), with a header in K1. I get this spreadsheet every day and it has a different number of rows. Column K has numbers from 0-100. I need to highlight certain rows certain colors depending on the value in column K. This is what I have so far, but it just goes all the way down and makes every column red font. I need it to loop through k2 to the last K cell with a value and change the font color of each row.

Columns("K").Select
Dim firstCell As Integer
Dim finalCell As Integer
firstCell = Range("K2")
finalCell = Range("K65536").End(xlUp).Row
For i = firstCell To finalCell

If i > 5 Then
    Rows(i).Select
    With Selection.Font
        .Color = RGB(255, 0, 0)
    End With
ElseIf i = 4 Then
    Rows(i).Select
    With Selection.Font
        .Color = RGB(226, 107, 10)
    End With
ElseIf i = 3 Then
    Rows(i).Select
    With Selection.Font
        .Color = RGB(0, 176, 80)
    End With
ElseIf i = 2 Then
    Rows(i).Select
    With Selection.Font
        .Color = RGB(0, 112, 192)
    End With
ElseIf i = 1 Then
    Rows(i).Select
    With Selection.Font
        .Color = RGB(112, 48, 160)
    End With
End If
Next i

回答1:


In your if statements you're just referencing i, not the value contained in Column K and Row i which is what you seem to want.

So change the if statements from:

If i > 5 Then
'and
ElseIf i = 4 Then

to:

If Range("K" & i).Value > 5 Then
'and
ElseIf Range("K" & i).Value = 4 Then

For all your if statements. Also change your first and final cell statements. They might, work, but I know these will:

finalCell = ActiveSheet.Range("K" & ActiveSheet.Rows.Count).End(xlUp).Row
'and 
firstCell = 2



回答2:


Since the two links which I mentioned in the comment do not cover about auto filter, see this example. Also What if the number is 5? Your code doesn't handle that. Did you by any chance mean ">4"? If yes, then change ">5" to ">4" in the code below.

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long, i As Long
    Dim rng As Range

    '~~> Change this to the relevant sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        '~~> Remove any filters
        .AutoFilterMode = False

        lRow = .Range("K" & .Rows.Count).End(xlUp).Row

        With .Range("K1:K" & lRow)
            For i = 1 To 4
                .AutoFilter Field:=1, Criteria1:="=" & i

                Set rng = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow

                If Not rng Is Nothing Then
                    Select Case i
                        Case 1: rng.Font.Color = RGB(112, 48, 160)
                        Case 2: rng.Font.Color = RGB(0, 112, 192)
                        Case 3: rng.Font.Color = RGB(0, 176, 80)
                        Case 4: rng.Font.Color = RGB(226, 107, 10)
                    End Select

                    Set rng = Nothing
                End If

                ws.AutoFilter.ShowAllData
            Next i

            .AutoFilter Field:=1, Criteria1:=">5" '<~~ OR "<4" ???
            Set rng = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
            If Not rng Is Nothing Then rng.Font.Color = RGB(255, 0, 0)
        End With

        '~~> Remove any filters
        .AutoFilterMode = False
    End With
End Sub


来源:https://stackoverflow.com/questions/21490161/excel-vba-loop-needed-for-a-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!