Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Выделение ячеек по значению в активной - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Выделение ячеек по значению в активной
nonka Дата: Воскресенье, 16.07.2023, 09:41 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

07-13
Доброго времени суток.
Имеется файл с большим количеством строк. Необходимо залить цветом строки которые содержат значение как у активной ячейки, при выборе другой ячейки удалять предыдущее форматирование.
К сообщению приложен файл: primer.xlsm (471.0 Kb)
 
Ответить
СообщениеДоброго времени суток.
Имеется файл с большим количеством строк. Необходимо залить цветом строки которые содержат значение как у активной ячейки, при выборе другой ячейки удалять предыдущее форматирование.

Автор - nonka
Дата добавления - 16.07.2023 в 09:41
i691198 Дата: Воскресенье, 16.07.2023, 11:15 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 337
Репутация: 108 ±
Замечаний: 0% ±

Здравствуйте. Попробуйте такой макрос. Вставьте его в модуль листа.
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rw&, N&, Cl As Range
   Rw = Cells(Rows.Count, 8).End(xlUp).Row
   If Not Intersect(Target, Range("A14:H" & Rw)) Is Nothing Then
       N = Cells(Target.Row, 8)
       Range("A14:H" & Rw).Interior.Color = xlNone
       For Each Cl In Range("H14:H" & Rw)
           If Cl = N Then Cl.Offset(, -7).Resize(, 8).Interior.Color = vbRed
       Next
   End If
End Sub
[/vba]


Сообщение отредактировал i691198 - Воскресенье, 16.07.2023, 11:17
 
Ответить
СообщениеЗдравствуйте. Попробуйте такой макрос. Вставьте его в модуль листа.
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rw&, N&, Cl As Range
   Rw = Cells(Rows.Count, 8).End(xlUp).Row
   If Not Intersect(Target, Range("A14:H" & Rw)) Is Nothing Then
       N = Cells(Target.Row, 8)
       Range("A14:H" & Rw).Interior.Color = xlNone
       For Each Cl In Range("H14:H" & Rw)
           If Cl = N Then Cl.Offset(, -7).Resize(, 8).Interior.Color = vbRed
       Next
   End If
End Sub
[/vba]

Автор - i691198
Дата добавления - 16.07.2023 в 11:15
nonka Дата: Воскресенье, 16.07.2023, 18:40 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

07-13
i691198,
Спасибо, но выделяет по какому то станному алгоритму. а причем тут a14 и h14?
[vba]
Код
Private Sub worksheet_selectionchange(ByVal target As Range)
Columns(1).FormatConditions.Delete
Dim Z As Variant
Z = ActiveCell.Value
PoiskSlov = Z
Columns(1).FormatConditions.Add Type:=xlTextString, String:=PoiskSlov, TextOperator:=xlContains
Columns(1).FormatConditions(Columns(1).FormatConditions.Count).SetFirstPriority
With Columns(1).FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 65535 ' цвет
End With
Columns(1).FormatConditions(1).StopIfTrue = False
End Sub
[/vba]
вот сто я смог написать, но тоже не выделяет странно ( либо не выделяет либо выделит ячейку "молоко" хотя поис был по "мол") т.е. без точного совпадения


Сообщение отредактировал Serge_007 - Понедельник, 17.07.2023, 10:06
 
Ответить
Сообщениеi691198,
Спасибо, но выделяет по какому то станному алгоритму. а причем тут a14 и h14?
[vba]
Код
Private Sub worksheet_selectionchange(ByVal target As Range)
Columns(1).FormatConditions.Delete
Dim Z As Variant
Z = ActiveCell.Value
PoiskSlov = Z
Columns(1).FormatConditions.Add Type:=xlTextString, String:=PoiskSlov, TextOperator:=xlContains
Columns(1).FormatConditions(Columns(1).FormatConditions.Count).SetFirstPriority
With Columns(1).FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 65535 ' цвет
End With
Columns(1).FormatConditions(1).StopIfTrue = False
End Sub
[/vba]
вот сто я смог написать, но тоже не выделяет странно ( либо не выделяет либо выделит ячейку "молоко" хотя поис был по "мол") т.е. без точного совпадения

Автор - nonka
Дата добавления - 16.07.2023 в 18:40
jun Дата: Воскресенье, 16.07.2023, 18:43 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

Добрый день!
Еще вариант (запускать по Alt+F8 на активном листе (где требуется поиск)). Остальное в комментариях к коду.
Код:
[vba]
Код
Dim arr(), k As Long ' arr - это глобальный массив диапазонов, в которые сохраняются адреса ячеек после запуска макроса Поиск_и_форматирование
Sub Поиск_и_форматирование()
Dim rData As Range, rRow As Long, aRange As Range
With ActiveSheet ' активный лист
    Set rData = .UsedRange ' весь заполненный диапазон активного листа
    Set aRange = rData.Columns(8).Find(ActiveCell.Value, LookAt:=xlWhole) ' ищет совпадения только в 8 столбце по точному совпадению (параметр LookAt:=xlWhole)
    If Not aRange Is Nothing Then  ' если совпадение найдено (хотя бы одно) и ячейка не пустая
        If aRange.Value <> "" Then
            Call очистка_форматирования ' очищаем предыдущие форматы на основе массива arr
            rRow = aRange.Row ' запоминаем строку с первым найденным совпадением
            k = 1 ' переменная - счетчик для массива
            Do
                '===================================
                ' заполняем массив найденными ячейками
                ReDim Preserve arr(1 To k)
                arr(k) = aRange.Address(0, 0)
                k = k + 1
                '===================================
                aRange.Interior.Color = vbYellow ' красим в желтый цвет найденные ячейки
                Set aRange = rData.Columns(8).FindNext(aRange)
            Loop While Not aRange Is Nothing And rRow <> aRange.Row
        End If
    End If
End With
End Sub
Private Sub очистка_форматирования()
Dim i
On Error GoTo label ' если массив не заполнен или другая ошибка, то выходим из процедуры (после label)
    With ActiveSheet ' активный лист
        For Each i In arr
        .Range(i).ClearFormats ' очищаем форматирование
        Next i
    End With
Exit Sub
label:
End Sub
[/vba]
К сообщению приложен файл: zalit_cvetom_esli.xlsb (246.3 Kb)


Сообщение отредактировал jun - Воскресенье, 16.07.2023, 20:09
 
Ответить
СообщениеДобрый день!
Еще вариант (запускать по Alt+F8 на активном листе (где требуется поиск)). Остальное в комментариях к коду.
Код:
[vba]
Код
Dim arr(), k As Long ' arr - это глобальный массив диапазонов, в которые сохраняются адреса ячеек после запуска макроса Поиск_и_форматирование
Sub Поиск_и_форматирование()
Dim rData As Range, rRow As Long, aRange As Range
With ActiveSheet ' активный лист
    Set rData = .UsedRange ' весь заполненный диапазон активного листа
    Set aRange = rData.Columns(8).Find(ActiveCell.Value, LookAt:=xlWhole) ' ищет совпадения только в 8 столбце по точному совпадению (параметр LookAt:=xlWhole)
    If Not aRange Is Nothing Then  ' если совпадение найдено (хотя бы одно) и ячейка не пустая
        If aRange.Value <> "" Then
            Call очистка_форматирования ' очищаем предыдущие форматы на основе массива arr
            rRow = aRange.Row ' запоминаем строку с первым найденным совпадением
            k = 1 ' переменная - счетчик для массива
            Do
                '===================================
                ' заполняем массив найденными ячейками
                ReDim Preserve arr(1 To k)
                arr(k) = aRange.Address(0, 0)
                k = k + 1
                '===================================
                aRange.Interior.Color = vbYellow ' красим в желтый цвет найденные ячейки
                Set aRange = rData.Columns(8).FindNext(aRange)
            Loop While Not aRange Is Nothing And rRow <> aRange.Row
        End If
    End If
End With
End Sub
Private Sub очистка_форматирования()
Dim i
On Error GoTo label ' если массив не заполнен или другая ошибка, то выходим из процедуры (после label)
    With ActiveSheet ' активный лист
        For Each i In arr
        .Range(i).ClearFormats ' очищаем форматирование
        Next i
    End With
Exit Sub
label:
End Sub
[/vba]

Автор - jun
Дата добавления - 16.07.2023 в 18:43
jun Дата: Воскресенье, 16.07.2023, 20:06 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

Макрос ниже запрашивает у пользователя слово и ищет по частичному совпадению без учета регистра по всему листу
Код:
[vba]
Код
Dim arr(), k As Long ' arr - это глобальный массив диапазонов, в которые сохраняются адреса ячеек после запуска макроса Поиск_и_форматирование
Sub Поиск_и_форматирование()
Dim rData As Range, rRow As Long, aRange As Range, colToFind As Long, WhatX As String
With ActiveSheet ' активный лист
    Set rData = .UsedRange ' весь заполненный диапазон активного листа
    WhatX = Application.InputBox("Введите слово для поиска", Type:=2) ' запрашивает строку для поиска
    Set aRange = rData.Find(WhatX, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False) ' ищет только значения по частичному совпадению (параметр LookAt:=xlPart) _
                    и без учета регистра (параметр MatchCase:=False) в диапазоне rData
    If Not aRange Is Nothing Then ' если совпадение найдено (хотя бы одно) и ячейка не пустая
        Call очистка_форматирования ' очищаем предыдущие форматы на основе массива         rRow = aRange.Row ' запоминаем строку с первым найденным совпадением
        k = 1 ' переменная - счетчик для массива
        rRow = aRange.Row
        Do
            '===================================
            ' заполняем массив найденными ячейками
            ReDim Preserve arr(1 To k)
            arr(k) = aRange.MergeArea.Address(0, 0)
            Debug.Print arr(k)
            k = k + 1
            '===================================
            aRange.Interior.Color = vbYellow ' красим в желтый цвет найденные ячейки
            Set aRange = rData.FindNext(aRange)
        Loop While Not aRange Is Nothing And rRow <> aRange.Row
    End If
End With
End Sub
Private Sub очистка_форматирования()
Dim i
On Error GoTo label ' если массив не заполнен или другая ошибка, то выходим из процедуры (после label)
    With ActiveSheet ' активный лист
        For Each i In arr
            .Range(i).ClearFormats ' очищаем форматирование, если массив заполнен (Join(arr, ",") == сцепляем массив по разделителю ", ")
        Next i
    End With
Exit Sub
label:
End Sub
[/vba]
К сообщению приложен файл: 0806720.xlsb (248.7 Kb)
 
Ответить
СообщениеМакрос ниже запрашивает у пользователя слово и ищет по частичному совпадению без учета регистра по всему листу
Код:
[vba]
Код
Dim arr(), k As Long ' arr - это глобальный массив диапазонов, в которые сохраняются адреса ячеек после запуска макроса Поиск_и_форматирование
Sub Поиск_и_форматирование()
Dim rData As Range, rRow As Long, aRange As Range, colToFind As Long, WhatX As String
With ActiveSheet ' активный лист
    Set rData = .UsedRange ' весь заполненный диапазон активного листа
    WhatX = Application.InputBox("Введите слово для поиска", Type:=2) ' запрашивает строку для поиска
    Set aRange = rData.Find(WhatX, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False) ' ищет только значения по частичному совпадению (параметр LookAt:=xlPart) _
                    и без учета регистра (параметр MatchCase:=False) в диапазоне rData
    If Not aRange Is Nothing Then ' если совпадение найдено (хотя бы одно) и ячейка не пустая
        Call очистка_форматирования ' очищаем предыдущие форматы на основе массива         rRow = aRange.Row ' запоминаем строку с первым найденным совпадением
        k = 1 ' переменная - счетчик для массива
        rRow = aRange.Row
        Do
            '===================================
            ' заполняем массив найденными ячейками
            ReDim Preserve arr(1 To k)
            arr(k) = aRange.MergeArea.Address(0, 0)
            Debug.Print arr(k)
            k = k + 1
            '===================================
            aRange.Interior.Color = vbYellow ' красим в желтый цвет найденные ячейки
            Set aRange = rData.FindNext(aRange)
        Loop While Not aRange Is Nothing And rRow <> aRange.Row
    End If
End With
End Sub
Private Sub очистка_форматирования()
Dim i
On Error GoTo label ' если массив не заполнен или другая ошибка, то выходим из процедуры (после label)
    With ActiveSheet ' активный лист
        For Each i In arr
            .Range(i).ClearFormats ' очищаем форматирование, если массив заполнен (Join(arr, ",") == сцепляем массив по разделителю ", ")
        Next i
    End With
Exit Sub
label:
End Sub
[/vba]

Автор - jun
Дата добавления - 16.07.2023 в 20:06
i691198 Дата: Воскресенье, 16.07.2023, 20:17 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 337
Репутация: 108 ±
Замечаний: 0% ±

nonka, Каков вопрос, таков и ответ. Вы вывалили большую простыню с данными без всяких пояснений, что из всего этого нужно считать "значениями". Я предположил, что это числа в столбце H. Ну и соответственно предложил вам вариант кода. Если вы не поняли, что за "странный алгоритм", то поясню. При смене фокуса на листе в диапазоне столбцов от A до H и в диапазоне строк от 14 до последней заполненной строки, берем значение из столбца H в строке выделенной ячейки и закрашиваем строки этого же диапазона у которых в столбце H такие же значения.
 
Ответить
Сообщениеnonka, Каков вопрос, таков и ответ. Вы вывалили большую простыню с данными без всяких пояснений, что из всего этого нужно считать "значениями". Я предположил, что это числа в столбце H. Ну и соответственно предложил вам вариант кода. Если вы не поняли, что за "странный алгоритм", то поясню. При смене фокуса на листе в диапазоне столбцов от A до H и в диапазоне строк от 14 до последней заполненной строки, берем значение из столбца H в строке выделенной ячейки и закрашиваем строки этого же диапазона у которых в столбце H такие же значения.

Автор - i691198
Дата добавления - 16.07.2023 в 20:17
nonka Дата: Воскресенье, 16.07.2023, 20:46 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

07-13
i691198,
спасибо, а если нужно искать совпадения не в ячейке "h", а например в "С"
при этом выделить строку от а до h, как будет выглядеть код?
 
Ответить
Сообщениеi691198,
спасибо, а если нужно искать совпадения не в ячейке "h", а например в "С"
при этом выделить строку от а до h, как будет выглядеть код?

Автор - nonka
Дата добавления - 16.07.2023 в 20:46
i691198 Дата: Воскресенье, 16.07.2023, 21:07 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 337
Репутация: 108 ±
Замечаний: 0% ±

а если нужно искать совпадения не в ячейке "h", а например в "С"
Для этого ваш пример не подходит, в вашей таблице ячейки объединены и в столбце C нет никаких значений.
 
Ответить
Сообщение
а если нужно искать совпадения не в ячейке "h", а например в "С"
Для этого ваш пример не подходит, в вашей таблице ячейки объединены и в столбце C нет никаких значений.

Автор - i691198
Дата добавления - 16.07.2023 в 21:07
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!