Страницы: 1
RSS
Группировка данных по датам, в соответствии с ранее отобранными признаками
 
Здравствуйте. Имеется 2 Листа ("Исходные данные" и "Даты").
На листе "Исходные данные" в Таблице 1 желтым цветом залиты те ячейки, которые удовлетворяют следующим условиям: Если столбец "Компоненты" содержит фразу с тире*, то необходимо осуществить поиск слова, идущего до тире и слова, идущего после тире в каждой строке столбца "Перечень" Таблицы 2. Если и слово до тире и слово после тире одновременно встречаются в одной строке столбца "Перечень", то выделяется желтым цветом соответствующая строка в столбце №п/п. Причем необязательно, чтобы слова до и после тире встречались в строке в той последовательности, в которой они указаны в столбце "Компоненты", главное, чтобы оба слова имелись в одной строке столбца "Перечень". В Таблице 1 зеленым цветом залиты те ячейки, которые удовлетворяют следующим условиям: Если столбец "Компоненты" не содержит фразу с тире, то выделяется строка в столбце №пп зеленым цветом в случае, если найдется одновременное соответствие столбца "Схема" столбцу "Дополнительная информация" и столбца "Компоненты" столбцу "Орган". Эта часть уже решена благодаря экспертам этого Сайта и экспертам другого сайта.

Подскажите пожалуйста, как описать при помощи кода макроса следующее: На листе "Даты" необходимо в соответствии с датами в столбцах "Начало" и "Конец" (лист "Исходные данные" Таблица 1) сгруппировать в отношении столбца "Перечень" (Таблица 2) те №пп, которые закрашены желтым (зеленым) цветом и рядом с которыми стоит "+". Знак "+" проставляется в ручную после анализа.

*  Под тире подразумевается знак препинания, отделённый от слов пробелами.  Если пробелы между словами (или словом и цифрой) отсутствуют, то такой  знак препинания при реализации задачи не учитывается.
Изменено: Александр Тоннов - 09.05.2024 06:55:55
 
Цитата
Знак "+" проставляется в ручную после анализа.
А зачем проставлять знак вручную, если эти строки уже покрашены по условию? Они и будут участвовать в дальнейшей обработке
 
Цитата
написал:
А зачем проставлять знак вручную, если эти строки уже покрашены по условию? Они и будут участвовать в дальнейшей обработке
Потому что после покраски в желтый и зеленый цвет ячейки подвергаются дополнительному анализу человеком (этот анализ тяжело провести при помощи Excel), после которого либо проставляется "+" рядом с окрашенный в зеленый или желтый цвет либо нет. Код макроса, с которым прошу помочь, направлен лишь на окрашенные ячейки рядом с которыми стоит "+".
Изменено: Александр Тоннов - 11.05.2024 13:35:56
 
Александр Тоннов,
В таблице 1 в строке 14
+ 12 ДК 100 тК Край Н-100 тК Воз 09:00 01.04.24 20:00 05.04.24
но в таблице 2 в столбце J нет ДК 100 тК Край
тогда откуда на листе Даты появилась строка с номером 14 и заполненными датами
 
Виноват. Опечатка. Должно быть полное совпадение  
Изменено: Александр Тоннов - 11.05.2024 20:31:58
 
Цитата
Код макроса, с которым прошу помочь, направлен лишь на окрашенные ячейки рядом с которыми стоит "+".
Проверяйте, если я правильно все понял
Код
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 - 12.05.2024 19:38:47
 
Kuzmich, спасибо Вам огромное!!! С этим примером все работает.

Единственное, если добавляю в "Таблицу 2" в столбец "Перечень", строку название, которой ранее уже встречалось в этом столбце (в примере номер 15 Путь 100 тК Зима – Сено – Алый цвет – Сила), а в Таблицу 1 в столбцы "Схема" и "Компоненты" вношу новую строку (в примере Nпп 19) столбцы "Схема" и "Компоненты" которой полностью соответствуют столбцам "Дополнительная информация" и "Орган", то на листе "Даты" Nпп 19 почему то съезжает. Тоже самое с  Nпп 18.
 
Александр Тоннов,
На листе Даты ячейка с
Путь 100 тК Зима – Сено – Алый цвет – Сила
на мой взгляд должна объединять 4 ячейки (для номеров 10, 13, 18 и 19)
На листе Исходные данные содержимое ячейки D21 (Н-100 тК Алый цвет) не равно К17
И макрос лучше поместить в стандартный модуль
Изменено: Kuzmich - 12.05.2024 19:40:12
 
Цитата
написал:
На листе Исходные данные содержимое ячейки D21 (Н-100 тК Алый цвет) не равно К17
Почему не равно? Равно
 
В слове цвет разный регистр буквы ц
 
Да, увидел. Извиняюсь за невнимательность
Цитата
написал:
на мой взгляд должна объединять 4 ячейки (для номеров 10, 13, 18 и 19)
Согласен с Вами. Но почему то не объединились
 
Александр Тоннов,
Цитата
Но почему то не объединились
Вставьте макрос из сообщения #6 в стандартный модуль и запустите при активном листе Исходные данные
Страницы: 1
Наверх