Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2012, 11:06   #1
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию Алгоритм для общего списка - сводная по повторяющимся записям.

Доброго дня!

Что-то как-то затишье...
Может быть на досуге поможете и мне решить задачу?
Может какая свежая мысль будет...

Задача такая (думаю пример в файле не важен (а я его сейчас и выложить не могу), т.к. мне нужен в общем алгоритм, словами):

1. есть файл xls* с несколькими листами (сейчас 3, но не важно, пусть будет хоть 27)
2. на каждом листе список из трёх столбцов (допустим одна строка шапка):

номер|фамилия___|сумма
00525|Иванов И.И.|12500,00
02389|Петров П.П.|10300,00

и т.д.

3. Номера внутри списка конкретного листа повторяться вроде как не должны (по задаче на практике, хотя кто знает...), но могут быть повторы между листами.
Например, 02389 может быть на первом и третьем листе, а может ещё и на втором (или на всех...)

4. нужно сделать общий список в новой книге (сводный) по всем записям, с суммированием сумм по повторяющимся, с указанием у каждой записи листа-источника (порядкового номера).
НО - если есть повторы (может быть не по одному номеру, а например по трём-четырём), то сперва нужно как-то известить об этом оператора (желательно подробно - кто/где(лист)/сколько), и он должен сделать выбор, к какому листу писать общую сумму.
Думаю, на этом этапе нужно дать возможность эту информацию распечатать и код прервать, т.к. возможно для принятия решения нужно время (позвонить, обсудить и т.д.).

Можно написать два отдельных кода, но думаю лучше всё делать одним.
Есть пара мыслей - один вариант вроде проще для оператора, но сложнее реализовать (пока не нашёл подход). Второй наоборот (но тоже ещё не написан, но кажется, реализовать будет проще, хотя кода чувствую будет больше).

Есть у меня шанс на третий вариант?
Свои специально не озвучиваю, чтоб был свежий взгляд
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 19.04.2012, 12:26   #2
mc-black
Пользователь
 
Аватар для mc-black
 
Регистрация: 03.06.2009
Сообщений: 26
По умолчанию

Все данные слить на один лист, дополнив их колонкой с именем (или описанием) листа, откуда их взяли. Полный список отсортировать по полю "номер", затем пройтись по списку и вывести немодальную UserForm с совпадениями. Уже на этом этапе оператор может печатать таблицу, или её части, если требуется. UserForm содержит два листбокса: первый с номером, фамилией и общей суммой по повторившемуся сотруднику, второй листбокс привязан к выделению в первом - показывает по раздельности строки по общему полю номер. Плюс форме нужна пара-тройка кнопок для принятия решений по переносу сумм с листа на лист. Задача оператора - разрешить все дублированные совпадения, допустим выделив во втором листбоксе данные из пятого листа и нажав кнопку "отнести все на лист". При этом модифицируется сводная таблица и данные по номеру очищаются в листбоксах.

Есть вариант проще, но требующий подготовки оператора.
Единственная команда выводит сводную таблицу + вторую "таблицу несоответствий". после выполнения команды пользователь на второй таблице отметками указывает как поступать при обработке с каждым конкретным дублем - "ставит галочку" и вновь запускает макрос - сводная строится уже с учетом непустой "таблицы несоответствий" с указаниями, после чего эта таблица обновляется - так можно поступать до тех пор, пока таблица несоответствий не станет пустой.
mc-black вне форума Ответить с цитированием
Старый 19.04.2012, 12:28   #3
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Я бы использовал номера, как ссылки для строк, а в конце отсортировал бы. Но тут возникает вопрос, как быть если на одном номере две разные фамилии. Там либо дописывать в строку через разделитель (Split - Redim - Join) либо предоставить пользователю самому принимать решение.

накрайняк, можно потом всё это разделить в новые строки после сортировки.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 19.04.2012, 13:05   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Спасибо.
Про разные фамилии на одном номере - в дальнейшем всё сведётся только к номеру, фамилии не важны.
Хотя если заказчик попросит - можно добавить такую первичную проверку и вывод предупреждения.

У меня варианты шли в таком порядке -
1. если есть повторы - выводить список повторов на новый лист (его можно печатать) и выходить из кода.
Оператор в исходных таблицах ставит нужным/ненужным отметки и снова выполняет код.
Задумался на этапе отслеживания пометок - если не всем где надо поставил, если поставил всем где не надо...

2. Тоже выводить список повторов в форму с листбоксом, где можно ставить галки. При нажатии ОК отслеживать, чтоб из всех повторов (по группам) был помечен один нужный (или наоборот). Тут пока туманно, как это проще реализовать...
Можно распечатать и выйти из кода - подумать, отметить на бумажке действия.
Снова выполнить код, пометить в листбоксе нужные, ОК.

Итого уже есть 4 варианта (или 3,5...) - но все какие-то сложные...
Я как-то пока больше склоняюсь к варианту с формой и листбоксом. Может, когда начну писать - ещё передумаю...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 19.04.2012, 13:40   #5
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от mc-black Посмотреть сообщение
Все данные слить на один лист, дополнив их колонкой с именем (или описанием) листа, откуда их взяли.
на против повторов проставить гиперссылки, сделать их общий счетчик
Цитата:
Сообщение от mc-black Посмотреть сообщение
Полный список отсортировать по полю "номер"
Пусть оператор посмотрит на все это дело. Если счетчик повторов = 0, он будет спокоен, если > 0, путь тычет гиперссылки и правит

Сделай ему еще для полного счастья кнопку на этом листе "показать только повторы". Жмякнет на нее и на листе останутся видимы только строки с повторами. Захочет распечатать? Пожалуйста.
Тишина – самый громкий звук

Последний раз редактировалось nerv; 19.04.2012 в 13:44.
nerv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Напишите простенькие программы на С++ для общего развития. andygarcia86 Помощь студентам 4 28.10.2011 00:41
Заполнение талонов из общего списка konistra Microsoft Office Excel 2 21.07.2010 12:26
Выборка из общего списка 0mega Microsoft Office Excel 5 25.01.2010 20:50
нахождение наибольшего общего делителя и наименьшего общего кратного made in russia Помощь студентам 2 21.12.2008 23:36
задачки для общего развития pelsh Помощь студентам 13 27.02.2008 09:35