[oodisc] задача: обновление полей сводного документа на основе имеющихся данных в Calc
Орлов Владислав
Орлов Владислав
Вт Окт 18 19:54:47 MSD 2005
В сообщении от Вторник, 18-Окт-2005 16:40 Круглов Андрей Константинович
написал(a):
> На листе 1 имется 1000 строк с фамилиями и напротив каждой фамилии есть
> некоторые данные.
> На листе 2 имеется 400 строк с фамилиями и напротив каждой фамилии есть
> другие данные.
> Требуется: определить строки (фамилии) второго листа, которых нет в
> первом списке.
Первый лист уже отсортирован по алфавиту? А второй? Это намного облегчило бы
работу Калку (и пользователю :-)) Поэтому для начала сортируем данные на
обоих листах по ключевому полю - в нашем случае по фамилии.
Фишка в том, что vlookup (ВПР в терминах MSO) с последним параметром "не
ноль" (ИСТИНА, в смысле) или находит значение в диапазоне или выдает "нет
данных" (Н/Д). А вот в случае "ЛОЖЬ" он нам найдет "ближайший похожий".
Используем эту особенность для поиска людей, отсутствующих в первом листе.
В последнем столбце (в первом свободном) второго листа в заголовке пишем
что-то вроде ТЕСТ (заголовок нашего вспомогательного столбца), а в первой же
клетке после заголовка таблицы пишем формулу
=IF(ISERROR(VLOOKUP('ФИО';$DANO.$A$2:$F$1000;1;1));"Новый";"Уже есть")
Эту формулу конструировал исходя из следующих соображений:
1. Столбец с фамилиями называется именно так - ФИО (кстати, использование
имени столбца в качестве параметра гарантированно сработает только если
столбец вплотную примыкает к массиву данных - если разграничены пустым
столбцом, то придется использовать прямую ссылку типа $A2.)
2. Первый лист называется DANO и данные в нем в столбцах A-F и в строках
2-1000. (В принципе, для решения первой задачи можно было бы ограничится
только одним столбцом - тем, в котором сидят фамилии. Но лучше указать
побольше данных - в случае если в формулу будут включаться дополнительные
данные - например, однофамильцы из разных отделов - не придется переписывать
адрес массива данных). Ссылку на массив даем абсолютную, с
"долларами" (Shift+F4) - когда будем формулу "размножать" она не превратится
в DANO.A3:F1001, DANO.A4:F1002, DANO.A4:F1003 и т.д.
3. Для дальнейшей обработки достаточно текстовых значений "Новый" или "Уже
есть" (это могли бы быть и числа или просто логические значения)
Что делает эта формула? Просто убеждается, что значение в колонке ФИО в
текущей строке есть на листе DANO.
Самое сложное теперь - растянуть эту формулу вниз до последней из заполненных
строк (400-ой в нашем примере). В MSO для этого используется двойной щелчок
по маркеру выделения (или как он там называется - квадратик в нижнем правом
углу клетки?)
Лично я после того как настроил горячую клавишу Ctrl+D для
Правка-Заполнить-Вниз заполняю столбец так: стрелка влево (на столбец с
данными), Ctrl+вниз (до последней заполненой строки - если промахнулся, то
один раз Ctrl+вверх), стрелка вправо (на столбец, где где-то в самом верху
стоит наша формула), Ctrl+Shift+вверх (выделяются все клетки столбца, начиная
с клетки с формулой) и Ctrl+D... Телемаркет! В выделенном столбце чередуются
"Новый" и "Уже есть".
Структура данных на обоих листах одинакова? Шикарно! Тогда дальше очень
просто: Данные - Фильтр - Стандартный фильтр
Условие1 ТЕСТ = Уже есть
Детали >>
Область содержит заголовки столбцов - флажок снимаем (зачем нам второй
заголовок?)
Копировать результат в - флажок ставим. После этого в поле адреса можем или от
руки вписать $DANO.$A$1001 или ткнуть мышью в первое свободное поле внизу
таблицы на листе DANO.
Готово. Данные о новых ребятах дописаны к старым. Но! Дописаны вместе с
формулами из столбца ТЕСТ. Ctrl+вправо, Ctrl+вниз, Ctrl+Shift+вверх, Delete.
Формул больше нет.
Данные неотсортированы. Влево (на клетку с данными), Ctrl+*. Данные выделены.
Из меню Данные - Сортировка... ФИО...
> Причем это сделать надо быстро, на автомате: щелк - выделились строки,
> которых нет в первом листе, второй щелк - добавили эти строки в первый
> лист. Еще раз щелк - выделяем оставшиеся строки (фамилия совпадает), щелк -
> третий, пятый и десятый столбец первого листа заменился на значения из
> второго листа, а остальные столбцы остались без изменений.
Упс... За один "щелк" вряд ли получится... Но! Нам ведь не нужно ВСЕХ
оставшихся обновлять - только ИЗМЕНИВШИХСЯ с прошлого раза... А-а-а! Если они
попали в эти 400 строк, значит изменились? Тоже не бином Ньютона...
Здесь, правда, одним дополнительным столбцом не обойтись - понадобится новый
лист. Но и это ведь не сложно!
Итак, опять пошагово:
Правый клик на ярлычке DANO - Переместить/копировать, флажок Копировать,
Переместить в конец... Получили лист DANO_2 над которым будем изга... изго...
извра... работать, в общем. Для начала вычищаем все кроме столбца фамилий.
B2, Ctrl+End, Delete. И возвращаемся в C2.
=VLOOKUP($A2;$NEW.$A$2:$F$400;3;1)
(В смысле, лист с обновлениями у нас называется NEW и для столбца C нам нужны
данные из третьего столбца массива. Почему третьего? По условию задачи).
Скорее всего сразу же получим Н/Д. Это не страшно, главное чтобы не ССЫЛ -
если ССЫЛ или какая-то другая ошибка, значит в формулу вкралась ошибка.
Копируем КЛЕТКУ вместе сформулой в пятый и десятый столбцы, подправляем в
формуле предпоследний параметр на 5 и 10 соответственно. Это хорошо, что в
первом параметре мы написали $A2, а не просто A2 - иначе пришлось бы
восстанавливать его в каждой из формул.
Размножаем эти три формулы: Ctrl+Home, Ctrl+вниз, вправо (один раз!),
Ctrl+Shit+End (последняя строка выделена), Ctrl+Shift+вверх (прыгнули с
выделением вверх или до второй строки или до заголовка - зависит от того была
ли формула в последнем столбце. Даже если перепрыгнули - не страшно:
Shift+вниз). А теперь - Ctrl+D. Третий, пятый и десятый заполнены данными или
Н/Д. Выделение все еще есть? Отлично! Ctrl+C (или Ctrl+Insert) - все что надо
в буфере обмена.
Правка-Вставить как (я на эту команду повесил Ctrl+Shift+Insert, чтобы в меню
не лазить). Здесь ВНИМАТЕЛЬНО! Не вставить ВСЕ, а только Строки, Числа,
Даты/время - главное НЕ вставить формулы: мы сейчас как раз от формул и
избавляемся. Теперь, когда Н/Д из результата вычислений превратился просто в
строку "#Н/Д", ее легко и непринужденно "множим на ноль" (Ctrl+F, Найти #Н/Д,
Заменить на отавляем пустым).
Что в результате? Только клетки с данными из листа NEW и эти данные стоят
именно в тех местах, где и должны - только не в листе DANO, а в DANO_2. Ну
это уж совсем просто: Ctrl+Home, вправо, вниз (стоим в B2), Ctrl+Shift+End
(данные и пустые клетки выделены), Ctrl+Ins (в буфер обмена), Ctrl+PgUp
нужное количество раз (чтобы открыть лист DANO), опять Ctrl+Home, вправо,
вниз (чтобы и здесь стать в B2), Ctrl+Shift+Insert (или "Правка-Вставить
как", если до сих пор клавиша не назначена) и - опять внимание! В секции
Параметры есть великолепный флажок - Пропуск пустых ячеек. То есть, если в
DANO_2 у нас где-то была пустая ячейка (а мы их сами сделали, когда заменяли
Н/Д на пустую строку), то данные в исходном массиве не изменятся! Оп-ля!
Удаляем лист DANO_2. Задача решена.
> Если у меня, очень продвинутого пользователя, эта задача на час работы,
> то у простого пользователя она занимает день минимум.
М-да... Без комментариев...
> Нужен способ (технология) для того, чтобы упростить эту работу.
Вот не помню, то ли у Кнута, то ли у Ван Тассела фраза есть: "Даже если до
сдачи проекта осталось всего полчаса, половину этого времени посвятите
обдумыванию задачи. Не исключено, что вы найдете гениальное в своей простоте
решение..." (переврал по памяти, но близко к тексту)
> Вы посмотрите - всё, что я описал в щелчках - делается на раз. Даже
> самый непродвинутый пользователь умеет делать эту работу. Основной
> напрасный расход человеческой энергии - когда человек ВРУЧНУЮ
> определяет, что столбы одинаковы.
И если мы дадим ему рыбу (читай, сделаем за него эту хрень) - он будет сыт
целый день, а если научим ловить рыбу - будет сыт всю жизнь...
> Эта операция составляет 90% времени от
> общего времени, потраченного на такого рода работу.
> Это должен делать компьютер:
Точно-точно! Девиз IBM - Think! (в смысле: Компьютер должен работать, а
человек - думать)
> Понимаете логику?
Не-а :-)
> Можете предложить способ для определения "одинаковости" строк? Может мой
> взгляд "замылен" MSO и я его просто не знаю??
Знаете, Андрей Константинович, все что я здесь понаписывал я отрабатывал
именно на MSO несколько лет назад. На ООо просто перенес навыки... Они -
офисы эти - абсолютно одинаковы! В том смысле, что и тот и другой не боле чем
инструмент. (Только ООо - лучше... Уже год как не устаю в этом убеждаться)
--
Всего доброго!
Владислав Орлов
Начальник отдела программного обеспечения
ЗАО СК "Профессиональная Защита" ("Про-За")
ICQ UIN 18873415
PS. Для большего удобства общения настоятельно рекомендую установить себе
OpenOffice.org - он того стоит (хотя и совершенно бесплатен!)
Подробная информация о списке рассылки Oo-discuss