Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 18.07.2015
Сообщений: 18

Сравнения двух книг и запись уникальных на новую

07.05.2016, 19:01. Показов 1700. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Не пинайте если вопрос таков был я очень долго искал почти месяц не нашел.

есть две книги книга1.xlsx и книга2.xlsx в которых сдержаться данные в этих книгах нужно сравнит данные и вывести уникальные.

В книгах такие данные. первая ячейка A1 содержит номер телефона, в ячейке B1 еще один номер, в ячейке С1 секунды. В книге2 такие же данные, но секунды могут быт на 1 больше или меньше. Нужно провести поиск и тоест сверит данные с книги 1 и если в книге два есть ети данные пропустит, а если нет сделать поиск заного но уже со второй строки тоест из a2 b2 c2.

Мои действия:

В новой книге сделал сцепку данных с книги A1 B1 C1 а рядом данные с книги 2 также. и написал поиско3(A1;b1:b300000;0) все работает но так как данныз 3000000 то данные расчитываются почти по 6 часов это очень медленно к меня комп I7 8 ядер. 6 г оперативка.


Прилагая книгу в которой все готово формулу не растягиваю до конца в прилагаемом файле иначи у вас будет открыват долго если не зависит.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2016, 19:01
Ответы с готовыми решениями:

Определить методы для сравнения двух книг по указанному параметру
Определить методы для сравнения двух книг по указанному параметру. Реализовать поиск книги по коду. Обязательно реализовать проверку...

Сложное условие сравнения уникальных и неуникальных значений
Сложное условие сравнения уникальных и неуникальных значений 2-х таблиц Граждане друзья! Очень прошу помощи. Начальник дал важное и...

запись уникальных строк в ListBox
задача, нужно динамически перезаписывать ЛистБокс значениями из поля бд отсекая все повторения(уникальность записей) ... position...

30
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
07.05.2016, 23:39
Студворк — интернет-сервис помощи студентам
На больших реальных файлах посмотрите чтоб в массиве не оказалось лишних столбцов, а то может памяти не хватить. Но можно переписать, впрочем я уже говорил...

Добавлено через 36 секунд
Цитата Сообщение от Horun1992 Посмотреть сообщение
тоест не важно в каком row находится данные они по всех проходит во время сверки?
Да, не важно.
0
0 / 0 / 0
Регистрация: 18.07.2015
Сообщений: 18
07.05.2016, 23:52  [ТС]
Ну в реальных файлах a num b num и sec находятся по столбцам K L M а до них и после них несколько столбцов. Ну это не критично я могу удалит все столбцы оставив только три если другие столбцы будут мешать) а они будут мешать значит?)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
07.05.2016, 23:54
Будут мешать - потому что я писал код для именно таких примеров, как Вы дали!
Можете не удалять столбцы - но тогда корректируйте код.
0
0 / 0 / 0
Регистрация: 18.07.2015
Сообщений: 18
07.05.2016, 23:59  [ТС]
Спасибо большое Вы мастер)))

в коде вроде только начала имени строк надо менят вот:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sub tt()
    Dim a, b, i&, t$, tt$, k
    With CreateObject("scripting.dictionary"): .comparemode = 1
        a = Workbooks("Книга1").Sheets(1).[K1].CurrentRegion.Value
        For i = 2 To UBound(a)
            .Item(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3)) = i
        Next
        b = Workbooks("Книга2").Sheets(1).[K1].CurrentRegion.Value
        For i = 2 To UBound(b)
            Do
                tt = b(i, 1) & "|" & b(i, 2) & "|"
                t = tt & b(i, 3)
                If .exists(t) Then .Remove (t): Exit Do
                t = tt & (b(i, 3) - 1)
                If .exists(t) Then .Remove (t): Exit Do
                t = tt & (b(i, 3) + 1)
                If .exists(t) Then .Remove (t)
                Exit Do
            Loop
        Next
 
        ReDim b(1 To .Count + 1, 1 To 3): i = 1
        b(1, 1) = "A num": b(1, 2) = "B num": b(1, 3) = "sec"
        For Each k In .items
            i = i + 1
            b(i, 1) = a(k, 1): b(i, 2) = a(k, 2): b(i, 3) = a(k, 3)
        Next
    End With
 
    With Workbooks.Add(1).Sheets(1).[a1].Resize(i, 3)
        .Columns(1).Resize(, 2).NumberFormat = "0"
        .Value = b
        .Columns.AutoFit
    End With
End Sub
Спасибо еще раз)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
08.05.2016, 00:05
Нет. Если перед столбцом K ещё будут данные - то они тоже попадут в currentregion, и значит в первом столбце массива будет совсем не то, что в столбце K!
Если данные будут правее - не помешает, но зря съест память. На больших файлах её кстати может не хватить.
Тогда нужно переписать код - например использовать как в коде при выгрузке .Columns(x).Resize(, y)
0
0 / 0 / 0
Регистрация: 18.07.2015
Сообщений: 18
08.05.2016, 00:09  [ТС]
ой, ну эти совсем не для моего мозга)) Я тогда этот код переписать не смогу вообще) мне легче будет удалит остальные данные оставив все на стольбце A B C
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
08.05.2016, 00:10
Цитата Сообщение от Horun1992 Посмотреть сообщение
все на стольбце A B C
- только в одном файле! В общем делайте точно как сделали примеры - сами такие сделали...
0
0 / 0 / 0
Регистрация: 18.07.2015
Сообщений: 18
08.05.2016, 00:16  [ТС]
Хорошо в любом случае спасибо)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
08.05.2016, 00:30
Лучший ответ Сообщение было отмечено Horun1992 как решение

Решение

Такой вариант может будет чуть быстрее, а может и нет.
Но тут можно легко подогнать массив под нужное место CurrentRegion'а
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Option Explicit
 
Sub tt()
    Dim a, b, i&, t$, tt$, k
    With CreateObject("scripting.dictionary"): .comparemode = 1
 
        a = Workbooks("Книга1").Sheets(1).[a1].CurrentRegion.Columns(1).Resize(, 3).Value    'тут можно скорректировать с какого столбца начинать массив
        For i = 2 To UBound(a)    'собираем словарь
            .Item(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3)) = i
        Next
 
        b = Workbooks("Книга2").Sheets(1).[E1].CurrentRegion.Columns(1).Resize(, 3).Value    'тут можно скорректировать с какого столбца начинать массив
        For i = 2 To UBound(b)    'выкидываем из словаря повторы точные или с коррекцией +/-1
            tt = b(i, 1) & "|" & b(i, 2) & "|"
            Select Case True
                Case .exists(tt & b(i, 3)): .Remove (tt & b(i, 3))
                Case .exists(tt & (b(i, 3) - 1)): .Remove (tt & b(i, 3) - 1)
                Case .exists(tt & (b(i, 3) + 1)): .Remove (tt & b(i, 3) + 1)
            End Select
        Next
 
        ReDim b(1 To .Count + 1, 1 To 3): i = 1
        b(1, 1) = "A num": b(1, 2) = "B num": b(1, 3) = "sec"
        For Each k In .items    'перебор оставшихся в словаре номеров строк
            i = i + 1
            b(i, 1) = a(k, 1): b(i, 2) = a(k, 2): b(i, 3) = a(k, 3)
        Next
    End With
 
    With Workbooks.Add(1).Sheets(1).[a1].Resize(i, 3)
        .Columns(1).Resize(, 2).NumberFormat = "0"
        .Value = b
        .Columns.AutoFit
    End With
End Sub
1
0 / 0 / 0
Регистрация: 18.07.2015
Сообщений: 18
08.05.2016, 00:44  [ТС]
.Resize(, 3) как я понял это для того чтобы от выбраного столбца только до 3 в массив брал?) Вы золотой человек спасибо большое)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
08.05.2016, 00:55
.Resize(, 3) - это от всего столбца "переразметиться" на три правее, т.е. указанный и ещё два.
Но это относительно не столбца листа, а столбца уже полученного диапазона CurrentRegion.
Я часто использую такое - на паузе смотрю что выделится при например [E1].CurrentRegion.Select - сразу можно определить что лишнее, с какого столбца начинаются нужные данные.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2016, 00:55
Помогаю со студенческими работами здесь

Создание двух уникальных колонок
У меня есть таблица в ней хранятся координаты X и Y мне нужно запретить добавление если X и Y совпадают с уже существующей записью, есть ли...

Поиск уникальных значений в двух массивах
Доброе время суток. Задача. Есть 2 массива 1,2,3,4,5 4,5,6,7,8 Нужно сравнить 1 массив с 2 и вывести уникальные. Скажу...

Вывод уникальных данных с двух таблиц
Всем добрый день. Есть две таблицы с одинаковыми полями - Date (datetime), LagerID (int) и FilID(int) Необходимо вывести с этих таблиц...

Отбор уникальных данных из двух диапазонов
Доброе времени суток, Господа! Помогите мне автоматизировать свод базы данных, для месячной инвентаризации.Приложил маленький пример. В...

Поиск уникальных элементов в массиве и запись в другой массив
есть код но он не работает, полностью копирует массив А в массив В что я не так сделал? #include <stdio.h> #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru