Друзья, уже всю голову сломал. Существует ли какой-то быстрый метод сравнить строки в таблице?
Суть задачи такова. Есть столбец "А" со списком составов неких веществ. В столбцах "B:K" указаны некие химические компоненты. На пересечении строки и столбца указано цифрами, сколько конкретно берется компонента для этого вещества. Другими словами это таблица рецептур.
Необходимо в таблице выделить каким-либо образом (цветом или еще как-то): 1. Вещества (строки) в которых используются одни и те же компоненты. В данном примере выделены зеленым. Компоненты одинаковые, но пропорции разные. 2. Вещества (строки) с совершенно одинаковыми рецептами. В данном примере выделены желтым. И компоненты и пропорции одинаковые.
В полной таблице у меня 400+ строк (веществ) и 200+ столбцов (компонентов).
Забыл добавить, что всю таблицу можно транспонировать, если это потребуется.
Эм. У вас все строки желтым просто выделены. Либо я опять не понял, либо вы решили пошутить. Неужели я и правда непонятно описал, что хочу получить в итоге?
Или вы хотели сказать, что у меня в результате все сроки могут оказаться желтыми? нет, такого точно не будет. Максимум 50-70 строк будут одинаковыми или даже идентичными.
я добавил к вашим составам 3 новых, у которых такие же рецкептура, что и у одного из имеющихся ВСЕ РЕЦЕПТЫ повторяются ВСЕ зарисовано желтым согласно ваших пожеланий это КРЕПКО ПОМОГЛО?? вам именно это нужно?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко написал: это КРЕПКО ПОМОГЛО??вам именно это нужно?
Да, если учесть, что строк более 400, а одинаковых из них будет процентов 10-15, не больше И вы не заметили, что зеленым будут выделяться совершенно одинаковые строки (с идентичными числовыми значениями в столбцах). И эти зеленые составят половину от этих 10-15 процентов. Итого желтых останется только 20-30 строк из 400+.
Потому что в 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 гр., то это уже одинаковые рецепты по составу, но разные по пропорциям.
ну и будет строка покрашена зеленым, а соотв. ей через 300 строк а рядом другая пара покрашена и не потому что они одинаковые, а потому, что где-то неизвестно где есть их пары допустим 10% из 400 строк 40 зеленых строк, по какому признаку вы найдете пару любой из этих зеленых строк так же как т пары желтых желтые строки есть а кто из них пара???
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко написал: по какому признаку вы найдете пару любой из этих зеленых строк
Вручную. Это в разы проще, чем перебирать вручную 400 строк. Если можно как-то попарно выделять, то это идеально. Причем надо еще и различие "одинаковый - идентичный" оставить.
Конечно. Если он будет самым последним, вообще идеально =) Таблица с рецептами у меня статичная, ее просто надо привести в порядок и забыть на еще один год. Потом по новой проверять...
не работает =(( Добавил еще несколько строк, но ваша формула массива их тоже выделяет, хотя рецептуры другие. Вы же формулу просто протягивали по строкам, верно? Причем я не понял, почему некоторые желтым выделяет, а некоторые зеленым, хотя они все разные.
Я понял! =)) вы суммируете номера столбцов и если сумма одинакова, окрашиваете в какой-либо цвет. Но ведь может быть так, столбцы 2+4+5+9 = 20 и столбцы 8+12 тоже 20.
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" определяется как уникальные значения из столбца L "уникальный kod1" определяется как уникальные значения из столбца O Удачи!