2014-01-31 3 views
2

Я очень новичок в Excel VBA, и я не могу понять, как заставить это работать. У меня есть столбец (столбец K), с заголовком в K1. Я получаю эту таблицу каждый день, и у нее разное количество строк. Столбец K имеет номера от 0 до 100. Мне нужно выделить определенные строки определенных цветов в зависимости от значения в столбце K. Это то, что у меня есть до сих пор, но оно просто полностью опускается и делает каждый красный шрифт столбца. Мне нужно, чтобы он переместил k2 в последнюю ячейку K со значением и изменил цвет шрифта для каждой строки.Excel VBA - Loop, необходимый для столбца

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 
+2

Две ссылки, чтобы вы начали. [FIRST] (http://stackoverflow.com/questions/11169445/error-finding-last-used-cell-in-vba) и [SECOND] (http://stackoverflow.com/questions/10714251/excel-macro -avoiding-using-select) –

+0

Кстати, вы также можете использовать Autofilter для окраски ячеек. Вам не нужно проходить через все 100 или около того ячеек –

+0

В этом случае с помощью «Case» легко написать код – HA560

ответ

3

В ваших если заявления вы только ссылки я, не значение, содержащееся в столбце K и Роу я что то, что вы, кажется, хотят.

Таким образом изменить, если заявление от:

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

к:

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

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

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

+ 1 Для выяснения, что является ошибкой в ​​коде :) Однако ... 'finalCell = ActiveSheet.UsedRange.Rows.Count' Nooooooo :) Пожалуйста, никогда не делайте этого :) См. Первую ссылку, которую я дал ниже вопроса. –

+0

Спасибо, я обновлю свой код. Это заявление всегда работало хорошо для меня, я определенно буду использовать это до конца моего времени! –

+2

Ничего себе, спасибо тонну. Я включил эту информацию и отлично работал. Спасибо вам обоим за ссылки, код и время. Я уже многому научился. – ZubaZ

1

Поскольку два ссылки, о которых я упоминал в комментарии, не касаются автоматического фильтра, см. Этот пример. Также, если номер 5? Ваш код не справляется с этим. Вы случайно имели в виду «> 4»? Если да, то измените «> 5» на «> 4» в приведенном ниже коде.

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 
+0

После того, как я запустил рабочий макрос, я впервые понял, что забыл, если он равен 5. Спасибо! Я также обновил это, и все строки отформатированы точно так, как я надеялся. Спасибо за помощь!! – ZubaZ

+2

Добро пожаловать. Еще один совет перед тем, как идти :) Всякий раз, когда вы объявляете переменные, которые будут удерживать строки, никогда не объявляйте их «Integer». Объявите его как «длинный», иначе вы можете получить ошибку «Overflow» в xl2007 +, если вы работаете с большим количеством строк ... –

Смежные вопросы