Здравствуйте. Имеется 2 Листа ("Исходные данные" и "Даты"). На листе "Исходные данные" в Таблице 1 желтым цветом залиты те ячейки, которые удовлетворяют следующим условиям: Если столбец "Компоненты" содержит фразу с тире*, то необходимо осуществить поиск слова, идущего до тире и слова, идущего после тире в каждой строке столбца "Перечень" Таблицы 2. Если и слово до тире и слово после тире одновременно встречаются в одной строке столбца "Перечень", то выделяется желтым цветом соответствующая строка в столбце №п/п. Причем необязательно, чтобы слова до и после тире встречались в строке в той последовательности, в которой они указаны в столбце "Компоненты", главное, чтобы оба слова имелись в одной строке столбца "Перечень". В Таблице 1 зеленым цветом залиты те ячейки, которые удовлетворяют следующим условиям: Если столбец "Компоненты" не содержит фразу с тире, то выделяется строка в столбце №пп зеленым цветом в случае, если найдется одновременное соответствие столбца "Схема" столбцу "Дополнительная информация" и столбца "Компоненты" столбцу "Орган". Эта часть уже решена благодаря экспертам этого Сайта и экспертам другого сайта.
Подскажите пожалуйста, как описать при помощи кода макроса следующее: На листе "Даты" необходимо в соответствии с датами в столбцах "Начало" и "Конец" (лист "Исходные данные" Таблица 1) сгруппировать в отношении столбца "Перечень" (Таблица 2) те №пп, которые закрашены желтым (зеленым) цветом и рядом с которыми стоит "+". Знак "+" проставляется в ручную после анализа.
* Под тире подразумевается знак препинания, отделённый от слов пробелами. Если пробелы между словами (или словом и цифрой) отсутствуют, то такой знак препинания при реализации задачи не учитывается.
написал: А зачем проставлять знак вручную, если эти строки уже покрашены по условию? Они и будут участвовать в дальнейшей обработке
Потому что после покраски в желтый и зеленый цвет ячейки подвергаются дополнительному анализу человеком (этот анализ тяжело провести при помощи Excel), после которого либо проставляется "+" рядом с окрашенный в зеленый или желтый цвет либо нет. Код макроса, с которым прошу помочь, направлен лишь на окрашенные ячейки рядом с которыми стоит "+".
Александр Тоннов, В таблице 1 в строке 14 + 12 ДК 100 тК Край Н-100 тК Воз 09:00 01.04.24 20:00 05.04.24 но в таблице 2 в столбце J нет ДК 100 тК Край тогда откуда на листе Даты появилась строка с номером 14 и заполненными датами
Код макроса, с которым прошу помочь, направлен лишь на окрашенные ячейки рядом с которыми стоит "+".
Проверяйте, если я правильно все понял
Код
Option Explicit
'активный лист Исходные данные
''Столбец С листа Даты использовал для признака объединенной ячейки
Sub iDate()
Dim i As Long
Dim iLastRow As Long
Dim iLR As Long
Dim iLastCol As Long
Dim BeginDate As Date
Dim EndDate As Date
Dim Dates As Worksheet
Dim iResult As String
Dim FoundCell As Range
Dim FoundPerechen As Range
Dim FAdr As String
Dim iNomer As Integer
Dim FoundBeginDate As Range
Dim k As Integer
iLastRow = Cells(Rows.Count, "B").End(xlUp).Row
Set Dates = ThisWorkbook.Worksheets("Даты")
With Dates
iLR = .Cells(.Rows.Count, "B").End(xlUp).Row 'последняя строка листа Даты
iLastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 'последний столбец листа Даты
.Range("C2" & ":C" & iLR) = 0 'Столбец С для признака объединенной ячейки
.Range(.Cells(2, 4), .Cells(iLR, iLastCol)).ClearContents
End With
For i = 3 To iLastRow
If Cells(i, "A") = "+" And Cells(i, "B").Interior.ColorIndex <> 2 Then
BeginDate = Split(Cells(i, "E"), " ")(1) 'Начало
EndDate = Split(Cells(i, "F"), " ")(1) 'Конец
With CreateObject("VBScript.RegExp")
.Global = True
.ignorecase = True
.Pattern = "([А-ЯЁ]+-?\d?)\s–\s([А-ЯЁ]+-?\d?)"
If .test(Cells(i, "D")) Then 'есть фраза с тире в столбце D
iResult = .Execute(Cells(i, "D"))(0).submatches(0) 'нашли первое слово до тире
Set FoundCell = Columns("I").Find(iResult, , xlValues, xlPart)
If Not FoundCell Is Nothing Then
FAdr = FoundCell.Address 'адрес первого вхождения первого слова
Do
'есть ли в строке столбца I с найденным первым словом второе слово
If InStr(1, Cells(FoundCell.Row, "I"), .Execute(Cells(i, "D"))(0).submatches(1)) > 0 Then
iNomer = Cells(i, "B")
'Cells(i, 1).Interior.ColorIndex = 6 'желтый
Set FoundPerechen = Dates.Columns("B").Find(FoundCell, , xlValues, xlWhole)
If Not FoundPerechen Is Nothing Then 'нашли Перечень из Исходные данные на листе Даты
Set FoundBeginDate = Dates.Rows(1).Find(BeginDate, , xlFormulas, xlWhole)
'ячейка с FoundPerechen может быть объединенной
k = 0
If FoundPerechen.MergeCells Then
Do
Dates.Cells(FoundPerechen.Row + Dates.Cells(FoundPerechen.Row, "C"), FoundBeginDate.Column + k) = iNomer
k = k + 1
Loop While Dates.Cells(1, FoundBeginDate.Column + k) < EndDate + 1
Dates.Cells(FoundPerechen.Row, "C") = Dates.Cells(FoundPerechen.Row, "C") + 1
Else
Do
Dates.Cells(FoundPerechen.Row, FoundBeginDate.Column + k) = iNomer
k = k + 1
Loop While Dates.Cells(1, FoundBeginDate.Column + k) < EndDate + 1
End If
End If
End If
If InStr(1, Cells(FoundCell.Row, "I"), .Execute(Cells(i, "D"))(0).submatches(1)) > 0 Then Exit Do 'нашли и первое и второе слово
Set FoundCell = Columns("I").Find(iResult, FoundCell, xlValues, xlPart)
Loop While FoundCell.Address <> FAdr
End If
Else 'в столбце D ячейка не содержит фразу с тире
iResult = Cells(i, "C")
Set FoundCell = Columns("J").Find(iResult, , xlValues, xlWhole)
If Not FoundCell Is Nothing Then
If FoundCell.Offset(, 1) = Cells(i, 4) Then
iNomer = Cells(i, "B")
Set FoundPerechen = Dates.Columns("B").Find(FoundCell.Offset(, -1), , xlValues, xlWhole)
If Not FoundPerechen Is Nothing Then 'нашли Перечень из Исходные данные на листе Даты
Set FoundBeginDate = Dates.Rows(1).Find(BeginDate, , xlFormulas, xlWhole)
'ячейка с FoundPerechen может быть объединенной
k = 0
If FoundPerechen.MergeCells Then
Do
Dates.Cells(FoundPerechen.Row + Dates.Cells(FoundPerechen.Row, "C"), FoundBeginDate.Column + k) = iNomer
k = k + 1
Loop While Dates.Cells(1, FoundBeginDate.Column + k) < EndDate + 1
Dates.Cells(FoundPerechen.Row, "C") = Dates.Cells(FoundPerechen.Row, "C") + 1
Else
Do
Dates.Cells(FoundPerechen.Row, FoundBeginDate.Column + k) = iNomer
k = k + 1
Loop While Dates.Cells(1, FoundBeginDate.Column + k) < EndDate + 1
End If
End If
'Cells(i, 1).Interior.ColorIndex = 4 'зеленый
End If
End If
End If
End With
End If
Next
End Sub
Kuzmich, спасибо Вам огромное!!! С этим примером все работает.
Единственное, если добавляю в "Таблицу 2" в столбец "Перечень", строку название, которой ранее уже встречалось в этом столбце (в примере номер 15 Путь 100 тК Зима – Сено – Алый цвет – Сила), а в Таблицу 1 в столбцы "Схема" и "Компоненты" вношу новую строку (в примере Nпп 19) столбцы "Схема" и "Компоненты" которой полностью соответствуют столбцам "Дополнительная информация" и "Орган", то на листе "Даты" Nпп 19 почему то съезжает. Тоже самое с Nпп 18.
Александр Тоннов, На листе Даты ячейка с Путь 100 тК Зима – Сено – Алый цвет – Сила на мой взгляд должна объединять 4 ячейки (для номеров 10, 13, 18 и 19) На листе Исходные данные содержимое ячейки D21 (Н-100 тК Алый цвет) не равно К17 И макрос лучше поместить в стандартный модуль