Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Главное меню

Окрашивание строк в 2 цвета

Автор yuldash, 11.11.2015, 13:19

« назад - далее »

yuldash

Добрый день.
Задача такая. в таблице Excel в 4м столбце только 2 типа значений. 1 и 2. Надо покрасить строки со значением 1 в зеленый, а строки со значением 2 в желтый. Надо прописать в макросе.
у меня примерно получается, но окрашивает один раз и останавливается.
вот пример 
Sub Макрос1()
Dim rFoundRng As Range

    Set rFoundRng = Columns(4).Find(1)
    If Not rFoundRng Is Nothing Then
   Range(Cells(rFoundRng.Row, 1), Cells(rFoundRng.Row, 14)).Interior.ColorIndex = 6
    End If
   
Set rFoundRng = Columns(4).Find(2)
    If Not rFoundRng Is Nothing Then
   Range(Cells(rFoundRng.Row, 1), Cells(rFoundRng.Row, 14)).Interior.ColorIndex = 4
    End If
End Sub

iron priest

и зачем это делать через макрос?

yuldash

#2
Слишком большая таблица

iron priest


yuldash

Цитата: iron priest от 11.11.2015, 13:43
мульён?
Да.
попытался цикл организовать - не получилось

cheshiki1

цикл, на мульёне не скажу как себя поведет, опыта мало.
Dim i%
For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row
    Range(Cells(i, 1), Cells(i, 14)).Interior.ColorIndex = Choose(Cells(i, 4), 4, 6)
Next

vikttur

С массивом быстрее.
Сначала формируем диапазоны для заливки, в конце одним махом заливаем все строки:
Sub RngColor()
Dim ArrData
Dim rRng1 As Range, rRng2 As Range
Dim lRws As Long
Dim i As Long
    With ActiveSheet
        lRws = .UsedRange.Rows.Count
        If lRws < 2 Then Exit Sub
        ArrData = Range("D1:D" & lRws).Value ' значения столбца 4 в массив
       
        For i = 1 To lRws
            Select Case ArrData(i, 1) ' по значениям
                Case 1
                    If rRng1 Is Nothing Then
                        Set rRng1 = .Range(.Cells(i, 1), .Cells(i, 14)) ' формируем диапазон
                    Else
                        Set rRng1 = Union(rRng1, .Range(.Cells(i, 1), .Cells(i, 14))) 'пополняем диапазон
                    End If
                Case 2
                    If rRng2 Is Nothing Then
                        Set rRng2 = .Range(.Cells(i, 1), .Cells(i, 14))
                    Else
                        Set rRng2 = Union(rRng2, .Range(.Cells(i, 1), .Cells(i, 14)))
                    End If
            End Select
        Next i
   
        Application.ScreenUpdating = False
        .UsedRange.Interior.Pattern = xlNone ' удаление предыдущей заливки
        If Not rRng1 Is Nothing Then rRng1.Interior.ColorIndex = 6 ' красим диапазоны
        If Not rRng2 Is Nothing Then rRng2.Interior.ColorIndex = 4
        Application.ScreenUpdating = True
    End With
End Sub

В таком варианте обращения к листу минимальны -  только для получения данных в массив и для массовой заливки двух диапазонов.

yuldash

Спасибо, Попробую.
А как сделать, чтобы он автоматически все сделал?
например, я вбил новую строку, а он автоматически запускается

cheshiki1

посмотрите про событие Worksheet_Change