Страницы: 1
RSS
Сравнить строки по значениям в столбцах и выделить одинаковые
 
Друзья, уже всю голову сломал.
Существует ли какой-то быстрый метод сравнить строки в таблице?

Суть задачи такова.
Есть столбец "А" со списком составов неких веществ.
В столбцах "B:K" указаны некие химические компоненты.
На пересечении строки и столбца указано цифрами, сколько конкретно берется компонента для этого вещества.
Другими словами это таблица рецептур.

Необходимо в таблице выделить каким-либо образом (цветом или еще как-то):
1. Вещества (строки) в которых используются одни и те же компоненты. В данном примере выделены зеленым. Компоненты одинаковые, но пропорции разные.
2. Вещества (строки) с совершенно одинаковыми рецептами. В данном примере выделены желтым. И компоненты и пропорции одинаковые.

В полной таблице у меня 400+ строк (веществ) и 200+ столбцов (компонентов).

Забыл добавить, что всю таблицу можно транспонировать, если это потребуется.
Изменено: Андрей Прокофьев - 01.04.2020 22:03:29 (забыл =)))
 
так?
и ЧТО ЭТО ВАМ ДАСТ???
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Эм. У вас все строки желтым просто выделены. Либо я опять не понял, либо вы решили пошутить.
Неужели я и правда непонятно описал, что хочу получить в итоге?

Или вы хотели сказать, что у меня в результате все сроки могут оказаться желтыми?
нет, такого точно не будет. Максимум 50-70 строк будут одинаковыми или даже идентичными.
Изменено: Андрей Прокофьев - 01.04.2020 22:27:24
 
я добавил к вашим составам 3 новых, у которых такие же рецкептура, что и у одного из имеющихся
ВСЕ РЕЦЕПТЫ повторяются ВСЕ зарисовано желтым  согласно ваших пожеланий
это КРЕПКО ПОМОГЛО??
вам именно это нужно?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Андрей Прокофьев,а почему 3 и 5 состав не покрашены? Там же тоже используются одни и те же элементы?
Наша суть отражается в наших повторяющихся действиях. Отсюда следует, что совершенство есть не действие, а привычка. Аристотель.
 
Цитата
Ігор Гончаренко написал:
это КРЕПКО ПОМОГЛО??вам именно это нужно?
Да, если учесть, что строк более 400, а одинаковых из них будет процентов 10-15, не больше
И вы не заметили, что зеленым будут выделяться совершенно одинаковые строки (с идентичными числовыми значениями в столбцах). И эти зеленые составят половину от этих 10-15 процентов.
Итого желтых останется только 20-30 строк из 400+.
 
Цитата
Valo написал:
а почему 3 и 5 состав не покрашены
Потому что в 3 строке используются компоненты 6 и 10, которых нет в других составах.
А в 5 строке - компоненты 3 и 5, которые тоже не используются в других составах.
Т.е. если два состава имеют даже 9 одинаковых компонентов, а 10го в одном из них нет, это уже разные рецептуры.

Поясню на простом примере.
Блины обычные и блины с начинкой. Блины обычные рецепт - вода 100 гр, мука 100 гр, яйца 2 шт, сахар 20 гр. Блины с начинкой - вода 100 гр, мука 100 гр, яйца 2 шт, сахар 20 гр, начинка 50 гр.
Это два разных рецепта из-за наличия начинки в одном из них.

Но! Если я делаю Блины обычные рецепт - вода 100 гр, мука 100 гр, яйца 2 шт, сахар 20 гр. и Блины обычные рецепт - вода 100 гр, мука 100 гр, яйца 2 шт, сахар 60 гр., то это уже одинаковые рецепты по составу, но разные по пропорциям.
Изменено: Андрей Прокофьев - 01.04.2020 22:59:46
 
ну и будет строка покрашена зеленым, а соотв. ей через 300 строк
а рядом другая пара покрашена и не потому что они одинаковые, а потому, что где-то неизвестно где есть их пары
допустим 10% из 400 строк
40 зеленых строк, по какому признаку вы найдете пару любой из этих зеленых строк
так же как т пары желтых желтые строки есть а кто из них пара???
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
по какому признаку вы найдете пару любой из этих зеленых строк
Вручную. Это в разы проще, чем перебирать вручную 400 строк.
Если можно как-то попарно выделять, то это идеально. Причем надо еще и различие "одинаковый - идентичный" оставить.
 
Андрей Прокофьев, дополнительный столбец допускается? :)  
Наша суть отражается в наших повторяющихся действиях. Отсюда следует, что совершенство есть не действие, а привычка. Аристотель.
 
Конечно. Если он будет самым последним, вообще идеально =)
Таблица с рецептами у меня статичная, ее просто надо привести в порядок и забыть на еще один год. Потом по новой проверять...
 
Проверьте тогда этот вариант.
Наша суть отражается в наших повторяющихся действиях. Отсюда следует, что совершенство есть не действие, а привычка. Аристотель.
 
не работает =((
Добавил еще несколько строк, но ваша формула массива их тоже выделяет, хотя рецептуры другие. Вы же формулу просто протягивали по строкам, верно?
Причем я не понял, почему некоторые желтым выделяет, а некоторые зеленым, хотя они все разные.

Я понял! =)) вы суммируете номера столбцов и если сумма одинакова, окрашиваете в какой-либо цвет. Но ведь может быть так, столбцы 2+4+5+9 = 20 и столбцы 8+12 тоже 20.
Изменено: Андрей Прокофьев - 02.04.2020 00:29:30
 
И мой вариант посмотрите
Код
Sub Komponent()
Dim i As Long
Dim iLastRow As Long
Dim iLastCol As Integer
Dim j As Integer
Dim FoundKod As Range
Dim FirstRow As Long
Dim SecondRow As Long
Dim FAdr As String
Application.ScreenUpdating = False
 iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
 iLastCol = Cells(2, Columns.Count).End(xlToLeft).Column
 Range("L2:M" & iLastRow).ClearContents
 Range("L2:L" & iLastRow).NumberFormat = "@"
  For i = 3 To iLastRow             'формируем код
    For j = 2 To iLastCol
      If Not IsEmpty(Cells(i, j)) Then
        Cells(i, "L") = Cells(i, "L") & "1"
      Else
        Cells(i, "L") = Cells(i, "L") & "0"
      End If
    Next
  Next
  For i = 3 To iLastRow
        Set FoundKod = Range("L" & i - 1 & ":L" & iLastRow).Find(Cells(i, "L"), , xlValues, xlWhole)
       FAdr = FoundKod.Address
       FirstRow = FoundKod.Row
      Do
        Set FoundKod = Range("L" & i - 1 & ":L" & iLastRow).FindNext(FoundKod)
        If FoundKod.Address <> FAdr And Not IsEmpty(Cells(FoundKod.Row, "L")) Then
           SecondRow = FoundKod.Row
           Cells(FirstRow, "M") = "Есть совпадение: " & Cells(FirstRow, "A") & " - " & Cells(SecondRow, "A")
           Cells(SecondRow, "M") = "Есть совпадение: " & Cells(SecondRow, "A") & " - " & Cells(FirstRow, "A")
        End If
      Loop While FoundKod.Address <> FAdr
  Next
Application.ScreenUpdating = True
End Sub
 
великолепно! Ваш макрос определяет совпадение по составу, но не определяет совпадение по пропорциям входящих в состав компонентов.
Но это можно доработать просто еще одним столбцом с суммой по условию =))
Спасибо!
 
Цитата
но не определяет совпадение по пропорциям входящих в состав компонентов.
Добавил эту функцию в макрос. Посмотрите и потестируйте. Удачи!
 
Это очень круто. Правда есть ошибка. Пока не понял где именно в коде, но он неверно определяет "уникальный kod" и kod1, начиная с 6 строки.
 
Цитата
Правда есть ошибка
Подробнее опишите, в чем она выражается?
"уникальный kod" определяется как уникальные значения из столбца L
"уникальный kod1" определяется как уникальные значения из столбца O
Удачи!
Страницы: 1
Наверх