Как Автоматически рассортировать и вставить данные из одного файла xls в другой?

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Fedozzz
Сообщения: 34
Зарегистрирован: 12 окт 2007, 15:30

Господа, помогите пожалуйста решить задачу:
Есть основной файл экселя, в который надо импортировать данные из других файлов, ежемесячно присылаемых.

Основной файл выглядит примерно следующим образом:

Изображение

Ежемесячно присылаемый, так:

Изображение


Необходимо, чтобы информация из ежемесячно присылаемого файла корректно добавлялась в основной файл, т.е. в нем появляется новый столбик "Июнь", в него добавляется новая сумма, а столбец "общий балл" из файла с информацией заменяет столбец "суммарный балл за год"

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

б) Наименований в списке куча... Штук 170...

Подскажите пожалуйста, как можно реализовать такой алгоритм импорта ...


Заранее огромнейшее спасибо. Я уж голову себе сломал думая.
Fedozzz
Сообщения: 34
Зарегистрирован: 12 окт 2007, 15:30

Я думаю, задачу надо решать в два этапа:

1) Сравнение списков из присылаемого файла и основного файла, и добавление новых фамилий.
2) Добавление новых значений в соответсвующие ячейки основного файла.

Может существует алгоритм, легко выполняющий первый этап? Подскажите пожалуйста.
В голову приходит только тупой перебор :(
packer
Сообщения: 17
Зарегистрирован: 16 ноя 2007, 13:00
Откуда: Ekaterinburg
Контактная информация:

Fedozzz писал(а):Я думаю, задачу надо решать в два этапа:

1) Сравнение списков из присылаемого файла и основного файла, и добавление новых фамилий.
2) Добавление новых значений в соответсвующие ячейки основного файла.

Может существует алгоритм, легко выполняющий первый этап? Подскажите пожалуйста.
В голову приходит только тупой перебор :(
А чем плох "тупой перебор" на 170 эл-тах списка? Отсортируйте сначала списки по фамилии в обоих файлах и далее можно юзать поиск методом полного перебора в упорядоченных списках. Несколько секунд в пределе программа проработает - а в натуре в разы меньше, раз у Вас повторяются в обоих списках фамилии. Может, концептуально это и неправильно, но эффективно.
По поводу "Добавление новых значений в соответсвующие ячейки основного файла." - просто строку добавляйте в основной файл вниз. Все просто вроде бы, если я правильно задачу понял.
ЗЫ Я правильно понял, что 170 позиций - это число строк - число эл-тов в списке фамилий?
Fedozzz
Сообщения: 34
Зарегистрирован: 12 окт 2007, 15:30

Спасибо, а может есть в экселе какая-то специальная функция сравнения двух списков ячеек?

Вы предлагаете сравнивать двумя вложенными циклами?

Подскажите пожалуйста как вытащить следующие значения?
т.е. у меня родился примерно такой алгоритм макроса:

I) Сначала создаем копию файла с информацией

II) Удаляем из копии файла все фамилии, которые уже есть в основном файле
for i = 1 to "длина списка файла с информацией" do
for k= 1 to " длина списка основного файла" do
if "ячейка № i файла с информацией" = " ячейка № k основного файла" then "удаляем из копии списка файла с информацией эту ячейку"
next k
next i

III) Добавляем оставшиеся значения списка в основной файл
IV) Сортируем по алфавиту оба файла, теперь они идентичны
V) Добавляем соответствующие значения из файла с информацией в ячейки основного файла.

Подскажите пожалуйста как вызвать значения переменных "количество строк в файле" помогите если не сложно с синтаксисом. Заранее огромное спасибо!
packer
Сообщения: 17
Зарегистрирован: 16 ноя 2007, 13:00
Откуда: Ekaterinburg
Контактная информация:

Я не специалист по Экселю, кроме ВПР ничего из ф-й близкого не припомню. Мож подскажет еще кто.
По алгоритму замечания.
Сначала списки отсортировать, а потом уже все дела делать. Если остался код у меня - посмотрю - или сами здесь или на http://www.sql.ru поройтесь в поиске по фразе "найти повторяющиеся значения в списке" - что-то вроде того.
Я для опр-я числа строк на листе использую Worksheet(ListName).Range("A1").CurrentRegion.Rows.Count - потому что у меня строки в списке обычно подряд идут, без пропусков, с самого начала.
ЗЫ Недавно такую штуку писал и по новой писать неохота - там строк 20 наверно минимум (((
Fedozzz
Сообщения: 34
Зарегистрирован: 12 окт 2007, 15:30

Спасибо большое.
На форуме SQL не нашел ничего пока...
:(
packer
Сообщения: 17
Зарегистрирован: 16 ноя 2007, 13:00
Откуда: Ekaterinburg
Контактная информация:

Порядок действий таков.
1. Сортируете оба списка по возрастанию(по фамилии - это в Экселе сделать - секунда)
2. "Тупой перебор"
Ищете в списке 2 те записи (ФИО), кот-х нет в списке 1 (исходном). Как нашли такую запись - что-то с ней делаете.
Как нашли запись (ФИО) в списке 2, кот-я уже есть в списке 1 - делаете с ней что-то другое
Вот примерный код для реализации п.2 (свой код на старой работе оставил - писал щаз на скорую руку, переменные все надо объявить соотв-м образом - сами сделаете.

Код: Выделить всё

Sub GetNewItems()
Dim i, j, l1start, l2start, l1end, l2end, c1, с2,WS1,WS2
l1start = 6'сами определите - это начальная строка исходного списка
l1end =172 'сами определите - это конечная строка исходного списка
l2start = 4' начальная строка списка 2
l2end = 189 'конечная строка  списка 2
c1= 1'номер столбца ФИО для исх. списка
c2=1 'номер столбца ФИО для списка 2
Set WS1 = Worksheets("List1")
Set WS2 = Worksheets("List2")
'List 1, List2 - имена листов, на кот-х находятся списки 1 и 2 соотв-но
For i = l2start To l2end
    For j = l1start To l1end
        If WS1.Cells(j, c1) > WS2.Cells(i, c2) Then Exit For 'О-ла-ла, на исх. листе нет такой фамилии
        If WS2.Cells(i, c2) = WS1.Cells(j, c1) Then 'А такая фамилия из списка 2 есть на исх. листе
        'че-то делаете для этого случая 
        i = i + 1
        End If
    Next j
'Что-то делаете со строкой i списка 2 - напомню, данной записи (ФИО) в исходном листе нет 
Next i
End Sub
ЗЫ На форумах СКЛ.ру надо искать в разделе Майкрософт Оффис - там таких тем куча должна быть - как уникальные (или наобоот, повторные) записи в списках искать
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте Fedozzz, по этой ссылке: http://ifolder.ru/3765138 Вы найдете надстройку для Excel, которая создавалась для выполнения подобной задачи.
Код доступен для изучения. Приложив совсем немного усилий Вы сможете с ее помощью выполнять свою задачу. ;)
Евгений.
Ответить