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

Вход

Регистрация

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

 

= Мир MS Excel/Сравнение данных в таблицах с ячейками разного значения - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Сравнение данных в таблицах с ячейками разного значения
VadimVV Дата: Среда, 06.05.2015, 16:03 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Добрый день.

Есть такая задачка:
При сравнении кодов из таблицы 1 с кодами из таблицы 2, если первая итерация не обнаруживает кода из таблицы 1 в таблице 2, то из кода таблицы 1 удаляется правый символ и проверка происходит ещё раз. Правые символы отбрасываются до тех пор, пока код из таблицы 1 не будет соответствовать точному коду из таблицы 2. В этом случае, к таблице 1 подставляется цена.

Возможно, реализовать можно только макросом.
К сообщению приложен файл: 9939883.xlsx (10.7 Kb)
 
Ответить
СообщениеДобрый день.

Есть такая задачка:
При сравнении кодов из таблицы 1 с кодами из таблицы 2, если первая итерация не обнаруживает кода из таблицы 1 в таблице 2, то из кода таблицы 1 удаляется правый символ и проверка происходит ещё раз. Правые символы отбрасываются до тех пор, пока код из таблицы 1 не будет соответствовать точному коду из таблицы 2. В этом случае, к таблице 1 подставляется цена.

Возможно, реализовать можно только макросом.

Автор - VadimVV
Дата добавления - 06.05.2015 в 16:03
ShAM Дата: Четверг, 07.05.2015, 06:42 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1347
Репутация: 249 ±
Замечаний: 0% ±

Excel 2010
Не знаю, что-то наворотил типа УДФ:
[vba]
Код
Function vpr(cll As Range, rng As Range, col As Integer)
a = cll
For i = Len(cll) - 1 To 1 Step -1
On Error Resume Next
vpr = WorksheetFunction.VLookup(a, rng, col, 0)
If vpr <> 0 Then Exit Function
a = --Left(a, i)
Next
End Function
[/vba]
К сообщению приложен файл: VadimVV.xlsm (17.5 Kb)
 
Ответить
СообщениеНе знаю, что-то наворотил типа УДФ:
[vba]
Код
Function vpr(cll As Range, rng As Range, col As Integer)
a = cll
For i = Len(cll) - 1 To 1 Step -1
On Error Resume Next
vpr = WorksheetFunction.VLookup(a, rng, col, 0)
If vpr <> 0 Then Exit Function
a = --Left(a, i)
Next
End Function
[/vba]

Автор - ShAM
Дата добавления - 07.05.2015 в 06:42
AndreTM Дата: Четверг, 07.05.2015, 07:13 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Ну, можно и формулами попробовать:

P.S. К сожалению, с формулой я поспешил, не работает она нормально....
Переделал формулу, вроде должна работать...
К сообщению приложен файл: 2-17322-1.xlsx (11.7 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Четверг, 07.05.2015, 20:47
 
Ответить
СообщениеНу, можно и формулами попробовать:

P.S. К сожалению, с формулой я поспешил, не работает она нормально....
Переделал формулу, вроде должна работать...

Автор - AndreTM
Дата добавления - 07.05.2015 в 07:13
VadimVV Дата: Четверг, 07.05.2015, 12:38 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Спасибо. УДФ работает.
Формула тоже работает, но пытаюсь понять её логику.
 
Ответить
СообщениеСпасибо. УДФ работает.
Формула тоже работает, но пытаюсь понять её логику.

Автор - VadimVV
Дата добавления - 07.05.2015 в 12:38
AndreTM Дата: Четверг, 07.05.2015, 21:31 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Логика формулы там жестокая :)

Код
=ИНДЕКС($E$3:$E$6;СУММПРОИЗВ(СТРОКА($D$3:$D$6)*(МУМНОЖ(1/$D$3:$D$6;ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))=1))-СТРОКА($D$3:$D$6)+1)
или
Код
{=ИНДЕКС($E$3:$E$6;МАКС(СТРОКА($D$3:$D$6)*(МУМНОЖ(1/$D$3:$D$6;ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))=1))-СТРОКА($D$3:$D$6)+1)}

Примерно так:
Код
ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1
формируем горизонтальный список индексов для разбора кода. Например, если код состоит из 5 цифр - то получаем массив {5;4;3;2;1}
Код
ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))
получаем из исходного числа - горизонтальный список возможных чисел-кодов для сравнения, отрезая по одному символу с конца (на самом деле, просто берем 5, 4, 3,.. символа от начала, и преобразуем результат в числа). Например, если исследуем число 89117 - то получим массив {89117;8911;891;89;1}
Код
МУМНОЖ(1/$D$3:$D$6;ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))
теперь берем два вектора - вертикальный $D$3:$D$6, содержащий коды для сравнения, и горизонтальный (вычисленный выше), содержащий коды для поиска. Математика говорит нам, что если мы попарно поделим все числа друг на друга, то при совпадающих числах получим 1. Для умножения мы воспользуемся формулой a/b == (1/b)*(a), а для попарного перемножения - векторным/матричным произведением (встроенной функцией МУМНОЖ). Не вдаваясь в подробности - мы должны получить матрицу чисел (строк в ней столько, сколько в диапазоне $D$3:$D$6 = 4, столбцов в ней столько, сколько в векторе для сравнения = 5), причем значение=1 в ячейках этой матрицы как раз означает, что сравниваемые коды совпали
Код
СУММПРОИЗВ(СТРОКА($D$3:$D$6)*(МУМНОЖ(1/$D$3:$D$6;ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))=1))
теперь сравниваем каждый из элементов матрицы с единицей - и получаем такую же матрицу-массив, содержащую значение ИСТИНА (=1) в тех ячейках, где коды совпали. Если мы теперь скалярно домножим эту матрицу на вектор с номерами строк СТРОКА($D$3:$D$6) - то получим матрицу-массив, содержащий нули и, в каких-то ячейках, - номера строк листа, где происходят совпадения.
Тут есть небольшая тонкость - если совпадение одно - то первая формула (с СУММПРОИЗВ) будет работать корректно, и при этом останется немассивной. Если же совпадений несколько - первая формула выдаст неверный результат (вернее, её можно модифицировать до большей "монструозности", и она всё же выдаст верный результат). В то же время, второй вариант формулы - выдаст верный результат. НО! - вторая формула - массивная.
Ну и далее всё просто - нам остается только преобразовать полученный номер строки на листе в номер строки в диапазоне поиска (СтрокаНаЛисте-СТРОКА($D$3:$D$6)+1) как раз дает номер найденной строки в диапазоне, а затем - просто выбрать нужное результирующее значение из таблицы поиска, используя ИНДЕКС()

Формулы, выданные участниками данной темы, если они подходят и для работы со строками (или переделанные под это), можно поместить в "Эффективные решения" типа как "Нахождение первого совпадения между двумя наборами/диапазонами" :)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Пятница, 08.05.2015, 13:49
 
Ответить
СообщениеЛогика формулы там жестокая :)

Код
=ИНДЕКС($E$3:$E$6;СУММПРОИЗВ(СТРОКА($D$3:$D$6)*(МУМНОЖ(1/$D$3:$D$6;ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))=1))-СТРОКА($D$3:$D$6)+1)
или
Код
{=ИНДЕКС($E$3:$E$6;МАКС(СТРОКА($D$3:$D$6)*(МУМНОЖ(1/$D$3:$D$6;ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))=1))-СТРОКА($D$3:$D$6)+1)}

Примерно так:
Код
ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1
формируем горизонтальный список индексов для разбора кода. Например, если код состоит из 5 цифр - то получаем массив {5;4;3;2;1}
Код
ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))
получаем из исходного числа - горизонтальный список возможных чисел-кодов для сравнения, отрезая по одному символу с конца (на самом деле, просто берем 5, 4, 3,.. символа от начала, и преобразуем результат в числа). Например, если исследуем число 89117 - то получим массив {89117;8911;891;89;1}
Код
МУМНОЖ(1/$D$3:$D$6;ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))
теперь берем два вектора - вертикальный $D$3:$D$6, содержащий коды для сравнения, и горизонтальный (вычисленный выше), содержащий коды для поиска. Математика говорит нам, что если мы попарно поделим все числа друг на друга, то при совпадающих числах получим 1. Для умножения мы воспользуемся формулой a/b == (1/b)*(a), а для попарного перемножения - векторным/матричным произведением (встроенной функцией МУМНОЖ). Не вдаваясь в подробности - мы должны получить матрицу чисел (строк в ней столько, сколько в диапазоне $D$3:$D$6 = 4, столбцов в ней столько, сколько в векторе для сравнения = 5), причем значение=1 в ячейках этой матрицы как раз означает, что сравниваемые коды совпали
Код
СУММПРОИЗВ(СТРОКА($D$3:$D$6)*(МУМНОЖ(1/$D$3:$D$6;ЗНАЧЕН(ЛЕВБ(B5;ДЛСТР(B5)-СТОЛБЕЦ(СМЕЩ($A$1;;;;ДЛСТР(B5)))+1)))=1))
теперь сравниваем каждый из элементов матрицы с единицей - и получаем такую же матрицу-массив, содержащую значение ИСТИНА (=1) в тех ячейках, где коды совпали. Если мы теперь скалярно домножим эту матрицу на вектор с номерами строк СТРОКА($D$3:$D$6) - то получим матрицу-массив, содержащий нули и, в каких-то ячейках, - номера строк листа, где происходят совпадения.
Тут есть небольшая тонкость - если совпадение одно - то первая формула (с СУММПРОИЗВ) будет работать корректно, и при этом останется немассивной. Если же совпадений несколько - первая формула выдаст неверный результат (вернее, её можно модифицировать до большей "монструозности", и она всё же выдаст верный результат). В то же время, второй вариант формулы - выдаст верный результат. НО! - вторая формула - массивная.
Ну и далее всё просто - нам остается только преобразовать полученный номер строки на листе в номер строки в диапазоне поиска (СтрокаНаЛисте-СТРОКА($D$3:$D$6)+1) как раз дает номер найденной строки в диапазоне, а затем - просто выбрать нужное результирующее значение из таблицы поиска, используя ИНДЕКС()

Формулы, выданные участниками данной темы, если они подходят и для работы со строками (или переделанные под это), можно поместить в "Эффективные решения" типа как "Нахождение первого совпадения между двумя наборами/диапазонами" :)

Автор - AndreTM
Дата добавления - 07.05.2015 в 21:31
ShAM Дата: Четверг, 07.05.2015, 21:53 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1347
Репутация: 249 ±
Замечаний: 0% ±

Excel 2010
[offtop]
Логика формулы там жестокая
Действительно жесть yes
[/offtop]
 
Ответить
Сообщение[offtop]
Логика формулы там жестокая
Действительно жесть yes
[/offtop]

Автор - ShAM
Дата добавления - 07.05.2015 в 21:53
_Boroda_ Дата: Четверг, 07.05.2015, 22:13 | Сообщение № 7
Группа: Админы
Ранг: Местный житель
Сообщений: 16885
Репутация: 6599 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
вроде должна работать...

А если в D4 будет написано, например, 8911
Предлагаю так:
Код
=ВПР(--ЛЕВБ(B3;МАКС(ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ(--ЛЕВБ(B3;СТРОКА($1:$9));D$3:D$6;));СТРОКА($1:$9))));D$3:E$6;2;)

Формула массива
К сообщению приложен файл: 9939883_1.xlsx (11.7 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
вроде должна работать...

А если в D4 будет написано, например, 8911
Предлагаю так:
Код
=ВПР(--ЛЕВБ(B3;МАКС(ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ(--ЛЕВБ(B3;СТРОКА($1:$9));D$3:D$6;));СТРОКА($1:$9))));D$3:E$6;2;)

Формула массива

Автор - _Boroda_
Дата добавления - 07.05.2015 в 22:13
AndreTM Дата: Четверг, 07.05.2015, 23:33 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
А, ну да... это как раз несколько возможных совпадений.
Тогда там надо вычислять не просто строку совпадения, а строку с наиболее длинным совпадающим кодом (скажем, добавив к числам ещё номер столбца матрицы, умноженный на 10e7).
Но сам принцип тоже имеет право на существование :)


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеА, ну да... это как раз несколько возможных совпадений.
Тогда там надо вычислять не просто строку совпадения, а строку с наиболее длинным совпадающим кодом (скажем, добавив к числам ещё номер столбца матрицы, умноженный на 10e7).
Но сам принцип тоже имеет право на существование :)

Автор - AndreTM
Дата добавления - 07.05.2015 в 23:33
_Boroda_ Дата: Четверг, 07.05.2015, 23:58 | Сообщение № 9
Группа: Админы
Ранг: Местный житель
Сообщений: 16885
Репутация: 6599 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
вычислять не просто строку совпадения, а строку с наиболее длинным совпадающим кодом

ну да, МАКС(ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ(--ЛЕВБ(B3;СТРОКА($1:$9));D$3:D$6;));СТРОКА($1:$9)))
сам принцип тоже имеет право на существование

Конечно. Принцип хорош. А уж объяснялка вообще блеск! Читал с наслаждением. Только тебе нужен не МАКС, а МИН - минимальное количество "отрезанных" символов. Примерно вот так
Код
=ИНДЕКС(E$3:E$6;МИН(ЕСЛИ(МУМНОЖ(1/D$3:D$6;ЗНАЧЕН(ЛЕВБ(B3;ДЛСТР(B3)-СТОЛБЕЦ(СМЕЩ(A$1;;;;ДЛСТР(B3)))+1)))=1;СТРОКА($3:$6)))-СТРОКА(D$3)+1)

Зелененьким в файле пометил
К сообщению приложен файл: 9939883_2.xlsx (12.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
вычислять не просто строку совпадения, а строку с наиболее длинным совпадающим кодом

ну да, МАКС(ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ(--ЛЕВБ(B3;СТРОКА($1:$9));D$3:D$6;));СТРОКА($1:$9)))
сам принцип тоже имеет право на существование

Конечно. Принцип хорош. А уж объяснялка вообще блеск! Читал с наслаждением. Только тебе нужен не МАКС, а МИН - минимальное количество "отрезанных" символов. Примерно вот так
Код
=ИНДЕКС(E$3:E$6;МИН(ЕСЛИ(МУМНОЖ(1/D$3:D$6;ЗНАЧЕН(ЛЕВБ(B3;ДЛСТР(B3)-СТОЛБЕЦ(СМЕЩ(A$1;;;;ДЛСТР(B3)))+1)))=1;СТРОКА($3:$6)))-СТРОКА(D$3)+1)

Зелененьким в файле пометил

Автор - _Boroda_
Дата добавления - 07.05.2015 в 23:58
VadimVV Дата: Пятница, 08.05.2015, 12:47 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Гениальные формулы. Спасибо! Буду разбираться и ковырять. Раньше думал, что знаю эксель на каком-то более-менее приемлемом уровне. Сейчас понимаю, что мои познания эксель ограничивались уровнем "Hello, World".
 
Ответить
СообщениеГениальные формулы. Спасибо! Буду разбираться и ковырять. Раньше думал, что знаю эксель на каком-то более-менее приемлемом уровне. Сейчас понимаю, что мои познания эксель ограничивались уровнем "Hello, World".

Автор - VadimVV
Дата добавления - 08.05.2015 в 12:47
  • Страница 1 из 1
  • 1
Поиск:

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