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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2012, 19:54   #1
paaa
Новичок
Джуниор
 
Регистрация: 05.06.2012
Сообщений: 2
По умолчанию Изменение первой таблицы на основе данных второй

Доброго дня!
Внезапно объявилась некоторая проблема, которую своими силами на данный момент решить не получается.
Есть некоторая таблица-носитель, 15-20 столбцов, большое количество строк. Первый столбец - ключ, по своей сути идентификатор/артикул, возможность повторов в строках исключена, все остальные могут быть и пустыми, и повторяться.
С этой таблицей взаимодействуют несколько людей, основные три группы:
1. Из одного человека, таблицу-носитель редактирует только он (на основе деятельности других групп + свои изменения);
2. Больше, чем один. Единовременно работают с копиями таблицы-носителя, добавляя в неё (в разные её части) новые строки. Каждый работает в своём диапазоне идентификаторов (первый столбец), пересечения между ними исключены;
3. Много больше, чем один. Единовременно работают с копиями таблицы-носителя, изменяя существующие данные (под редакцию могут попасть все строки кроме шапки, все столбцы кроме первого (идентификатора).

В конце определенного периода результат работы второй и третьей групп передается в первую, задача первой - найти и добавить все новые строки от второй группы, также найти и добавить/изменить данные в строках от третьей группы; то есть по сути собрать все данные воедино, исключив повторы.
Пока таблица была небольшой - справлялись кустарными методами: выделениями, формулами, отчетами, сносками. Сейчас она разрослась очень сильно и кустарные методы не то, что отнимают много времени, а просто не справляются с количеством данных.

То есть для решения этих задач нужно 2 макроса:
1. Сравнивающий таблицу-носитель и её копию, сопоставляющий их строки по первому столбцу (ключу) и добавляющий только новые строки из второй таблицы в первую.
Этот макрос я нашел, пошуршав форум, огромное спасибо создателю:
PHP код:
Sub Добавление()
    
    
Dim x As New CollectionAs Long

    Application
.ScreenUpdating FalseOn Error Resume Next
    Sheets
(1).SelectWith Sheets(2)
    For 
1 To Cells(Rows.Count"A").End(xlUp).Row
        x
.Add Cells(i"A"), CStr(Cells(i"A"))
    
Next
    
For 1 To .Cells(Rows.Count"A").End(xlUp).Row
        On Error Resume Next
        x
.Add .Cells(i"A"), CStr(.Cells(i"A"))
        If 
Err 0 Then .Rows(i).Copy Rows(Cells(Rows.Count"A").End(xlUp).Row 1)
    
Next
    End With
    
End Sub 
На первый взгляд отлично работает и справляется с задачей.

2. Сравнивающий таблицу-носитель и её копию, сопоставляющий данные во всех ячейках двух таблиц по первому столбцу (ключу) и добавляющий/изменяющий данные из ячеек второй таблицы в ячейки первой (носителя).

С этим возникли проблемы, своей головы не хватает, поиск пока что тоже не помог.
Буду благодарен любым советам, может быть потом кому тоже пригодится.
paaa вне форума Ответить с цитированием
Старый 06.06.2012, 10:52   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Идеи есть,проверить нет возможности в связи с наличием отсутствия файла.
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 06.06.2012, 21:16   #3
paaa
Новичок
Джуниор
 
Регистрация: 05.06.2012
Сообщений: 2
По умолчанию

Виноват, мой косяк.
Во вложении книга на 3 листа, 1 - носитель, 2 - пример работы второй группы, 3 - пример работы третьей группы.
Второй лист по сути и не нужен, вопрос решен уже, но в описании присутствует, пусть будет и в книге вместе с работающим макросом.
Изменения между 1 и 2 листами - во второй появились новые записи.
Изменения между 1 и 3 листами - в третьем некоторые ячейки некоторых строк изменились, эти изменения и нужно перенести в 1 таблицу. Учитывая что количество таких изменений от каждого человека исчисляется сотнями, то ручная (или полуавтоматическая) обработка несколько утомляет.

Нашел немного корявый вариант - добавлять весь 3 лист в 1 лист, а затем удалять повторы по ключу. Как временное решение вариант, но в любом случае буду дальше ковырять.
PHP код:
Sub Удаляем()
Dim Строкаi1
Строка 
Range("A65536").End(xlUp).Row
"A1:T" Строка
Range
(R).Select
    Selection
.Sort Key1:=Range("A2")
For 
i1 1 To Строка
    
If Cells(i11) <> Cells(i1 11Then GoTo дальше
    Cells
(i11) = ""
дальше:
Next i1
Range
(R).Select
    Selection
.Sort Key1:=Range("A2")
Строка Range("A65536").End(xlUp).Row ":" i1
Rows
(Строка).Select
Selection
.Delete Shift:=xlUp
End Sub 
Как уже сказал - A столбец не может измениться ни в каком варианте, B-E - как исключение, F-T - постоянно. Временное решение реализует полную перезапись строчки по ключу при изменении одной ячейки, что на самом деле тоже подходит, но самым шиком будет перезапись не всей строки полностью, а только тех ячеек в ней, что изменились.

upd: хотя скрипт в этом посте немного косячный, он либо сносит шапку (если в первом столбце первой строки не цифры), либо отжирает одну из нужных строчек (если в первом столбце первой строки стоит числовое значение).

upd2: совершенно случайно в 2010 офисе наткнулся на функцию удаления дубликатов, забавно И ведь работает!
Вложения
Тип файла: rar тест1.rar (17.9 Кб, 7 просмотров)

Последний раз редактировалось paaa; 06.06.2012 в 22:37.
paaa вне форума Ответить с цитированием
Старый 07.06.2012, 02:21   #4
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Например так
Шик отменяется.
Вложения
Тип файла: rar тест.rar (39.9 Кб, 43 просмотров)
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 07.06.2012 в 12:13.
doober вне форума Ответить с цитированием
Старый 21.09.2012, 11:10   #5
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Например так
Шик отменяется.
doober, подскажите пожалуйста как вы сделали такую панель инструментов?
Как добавить подпункты в панель макросом я знаю, как сделать такую панель да еще и открывается без макросов... Как???
Вложения
Тип файла: rar тест.rar (39.9 Кб, 9 просмотров)
Единственный способ стать умнее, играть с более умным противником...

Последний раз редактировалось staniiislav; 21.09.2012 в 11:18.
staniiislav вне форума Ответить с цитированием
Старый 21.09.2012, 11:25   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Аналогичная задача, код без файла (т.е. для любых экселей ):
http://forum.ixbt.com/topic.cgi?id=23:32362-47#1347
Да и думаю попроще - там алгоритм прозрачный, анализ изменений только чуть накручен - но тут похоже изменения анализировать не нужно, т.е. эту часть можно убрать.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 21.09.2012 в 11:28.
Hugo121 вне форума Ответить с цитированием
Старый 21.09.2012, 11:31   #7
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Аналогичная задача, код без файла (т.е. для любых экселей ):
http://forum.ixbt.com/topic.cgi?id=23:32362-47#1347
Да и думаю попроще - там алгоритм прозрачный, анализ изменений только чуть накручен - но тут похоже изменения анализировать не нужно, т.е. эту часть можно убрать.
Hugo121, Спасибо большое... буду разбираться.
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 21.09.2012, 11:36   #8
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Аналогичная задача, код без файла (т.е. для любых экселей ):
http://forum.ixbt.com/topic.cgi?id=23:32362-47#1347
Да и думаю попроще - там алгоритм прозрачный, анализ изменений только чуть накручен - но тут похоже изменения анализировать не нужно, т.е. эту часть можно убрать.
Hugo121, наверное я не правильно выразился. Меня интересует не сама тема и реализация решения данной темы.
Интересует панель инструментов в примере doober (пример называется тест.xlms)
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 21.09.2012, 11:36   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

У меня на работе нет 2007, так что не могу оценить всю прелесть решения
Но хотел спросить с практической стороны - Сергей, эти кнопки/код на панель рисуете индивидуально, или используете уже заранее заготовленный шаблон?
Мне кажется - делать индивидуально хлопотно, я пока даже не брался... да мне самому никуда и не нужно.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 21.09.2012, 13:37   #10
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Первоисточник для меня ЗДЕСЬ
Плюс нухна программа RibbonXMLEditor
Поверте,это не постое дело
Пример одной надстройки,она создавалась в течении 2 месяцев,по мере поступления
добавлений в техзадание
staniiislav,если у вас есть скайп,свяжитесь,мне легче показать весь процесс,чем описать

http://film1.pochta.ru/1060.jpg



Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вытащить данные с второй таблицы если в первой таблице в колонке X значение равно пустой строке Vistar SQL, базы данных 3 14.10.2011 00:48
Запуск второй формы с деактивацией первой Byurrer Общие вопросы C/C++ 2 18.04.2011 20:40
Выполнить метод первой формы во второй maryan.vetrov C# (си шарп) 13 18.02.2011 02:37
Формирование таблицы на основе данных с другого листа Машуля Microsoft Office Excel 15 10.03.2010 20:38
Создание новой таблицы на основе данных koda Microsoft Office Excel 2 06.08.2008 18:53