Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Упрощение сравнения 2 разных списков людей - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Упрощение сравнения 2 разных списков людей (Макросы/Sub)
Упрощение сравнения 2 разных списков людей
BTH Дата: Среда, 04.10.2017, 12:13 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: -1 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте. Подскажите, пожалуйста, как ещё можно сравнить 2 таблицы, и как упростить его сравнение?
Есть определенные наработки. У меня есть 2 таблицы. Их нужно сравнить и выявить уникальные.

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

Задача такая: нужно сравнить эти две таблицы.

Моя схема решения: 1. Достать данные из 1таблицы -> убрать лишнее(придать единый вид) -> объединить повторяющиеся -> переместить эти данные куда-то, где можно спокойно сравнить
2. Достать данные из 2таблицы сортировка по определенным столбцам -> объединить повторяющиеся -> придать единый вид -> переместить данные туда же, куда и итоговый результат по 1таблице.
3. Сравнить и выявить уникальные.

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

Надеюсь вы поняли о чём я : )) Хочу ваше экспертное мнение, как это всё можно упростить, чтобы не было так сложно. Я бы хотел просто вставлять данные на 1 листе по 1 и по 2 таблице, и в новом листе уже иметь готовую таблицу для сравнения. Можно ли так сделать, без этого танца с бубном?

Я перелопатил интернет, и постоянно приходится урывками находить такие вот методы. Моих знаний уже не достаточно.

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

Прошу помочь с данным вопросом. Буду вам очень благодарен!

PS Сюда прикрепил таблицы. В комментарии прикреплю данные со своими наработками.
К сообщению приложен файл: 0508563.xls (21.0 Kb) · 1390473.xls (32.0 Kb)


BlackTeaHappy

Сообщение отредактировал BTH - Среда, 04.10.2017, 14:22
 
Ответить
СообщениеЗдравствуйте. Подскажите, пожалуйста, как ещё можно сравнить 2 таблицы, и как упростить его сравнение?
Есть определенные наработки. У меня есть 2 таблицы. Их нужно сравнить и выявить уникальные.

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

Задача такая: нужно сравнить эти две таблицы.

Моя схема решения: 1. Достать данные из 1таблицы -> убрать лишнее(придать единый вид) -> объединить повторяющиеся -> переместить эти данные куда-то, где можно спокойно сравнить
2. Достать данные из 2таблицы сортировка по определенным столбцам -> объединить повторяющиеся -> придать единый вид -> переместить данные туда же, куда и итоговый результат по 1таблице.
3. Сравнить и выявить уникальные.

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

Надеюсь вы поняли о чём я : )) Хочу ваше экспертное мнение, как это всё можно упростить, чтобы не было так сложно. Я бы хотел просто вставлять данные на 1 листе по 1 и по 2 таблице, и в новом листе уже иметь готовую таблицу для сравнения. Можно ли так сделать, без этого танца с бубном?

Я перелопатил интернет, и постоянно приходится урывками находить такие вот методы. Моих знаний уже не достаточно.

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

Прошу помочь с данным вопросом. Буду вам очень благодарен!

PS Сюда прикрепил таблицы. В комментарии прикреплю данные со своими наработками.

Автор - BTH
Дата добавления - 04.10.2017 в 12:13
BTH Дата: Среда, 04.10.2017, 12:14 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: -1 ±
Замечаний: 0% ±

Excel 2007
Прикрепляю свои наработки.
К сообщению приложен файл: 1_.xls (32.0 Kb) · 2_.xls (81.0 Kb)


BlackTeaHappy
 
Ответить
СообщениеПрикрепляю свои наработки.

Автор - BTH
Дата добавления - 04.10.2017 в 12:14
sboy Дата: Среда, 04.10.2017, 12:45 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
Добрый день.
Покажите, что должно получится в итоге (в самом-самом, т.е. результат сравнения)


Яндекс: 410016850021169
 
Ответить
СообщениеДобрый день.
Покажите, что должно получится в итоге (в самом-самом, т.е. результат сравнения)

Автор - sboy
Дата добавления - 04.10.2017 в 12:45
BTH Дата: Среда, 04.10.2017, 13:58 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: -1 ±
Замечаний: 0% ±

Excel 2007
Да, вот примерно так должно быть в итоге. Лист "Итого"
На этом листе я применяю функцию "Условное форматирование"-"Правила выделения ячеек"-"Повторяющиеся значения". Я только такой путь нашел самый легкий нахождения разных показателей. + было неудобно сравнивать. Я добавил возможность объединения ФИО и кол-ва, чтобы ~Петрович2 и ~Петрович1 были разные показатели.
К сообщению приложен файл: 8840507.xls (25.0 Kb)


BlackTeaHappy

Сообщение отредактировал BTH - Среда, 04.10.2017, 14:08
 
Ответить
СообщениеДа, вот примерно так должно быть в итоге. Лист "Итого"
На этом листе я применяю функцию "Условное форматирование"-"Правила выделения ячеек"-"Повторяющиеся значения". Я только такой путь нашел самый легкий нахождения разных показателей. + было неудобно сравнивать. Я добавил возможность объединения ФИО и кол-ва, чтобы ~Петрович2 и ~Петрович1 были разные показатели.

Автор - BTH
Дата добавления - 04.10.2017 в 13:58
sboy Дата: Среда, 04.10.2017, 14:37 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
BTH,
Я только такой путь нашел

я же про пути не спрашивал) а что получить хотите)
убрать скобочки-посчитать повторы-добавить количество повторов к фио - покрасить без совпадений, я правильно понял задачу?
в первой табличке количество изначально дано, а во второй подсчет фио, правильно?


Яндекс: 410016850021169
 
Ответить
СообщениеBTH,
Я только такой путь нашел

я же про пути не спрашивал) а что получить хотите)
убрать скобочки-посчитать повторы-добавить количество повторов к фио - покрасить без совпадений, я правильно понял задачу?
в первой табличке количество изначально дано, а во второй подсчет фио, правильно?

Автор - sboy
Дата добавления - 04.10.2017 в 14:37
BTH Дата: Среда, 04.10.2017, 14:43 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: -1 ±
Замечаний: 0% ±

Excel 2007
Излишнее цитирование удалено администрацией - это нарушение п.5j Правил форума

Да, всё верно :)
Да, во второй таблице изначально нет столбика "кол-во". Необходимо как-то повторы тоже подсчитать и вывести количество. Только не весь столбик, а только определенный пул ФИО (т.к. я применяю там алфавитный фильтр нужного столбца + ФИО).


BlackTeaHappy

Сообщение отредактировал BTH - Среда, 04.10.2017, 14:50
 
Ответить
СообщениеИзлишнее цитирование удалено администрацией - это нарушение п.5j Правил форума

Да, всё верно :)
Да, во второй таблице изначально нет столбика "кол-во". Необходимо как-то повторы тоже подсчитать и вывести количество. Только не весь столбик, а только определенный пул ФИО (т.к. я применяю там алфавитный фильтр нужного столбца + ФИО).

Автор - BTH
Дата добавления - 04.10.2017 в 14:43
sboy Дата: Среда, 04.10.2017, 17:29 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
Добрый день.
Копируем данные в соответствующие столбцы, нажимаем кнопку
[vba]
Код
Sub tabl1()
Dim arr_()
c = 1
    For t = 1 To 2
    lr = Cells(Rows.Count, c).End(xlUp).Row
    Set oDict = CreateObject("Scripting.Dictionary")
        With oDict
            For r = 2 To lr
                q = InStr(1, Cells(r, c).Value, "(", vbTextCompare)
                    If q Then
                        fio = Left(Cells(r, c).Value, q - 2)
                        Else: fio = Cells(r, c).Value
                    End If
                    Select Case t
                    Case 1
                        If .exists(fio) Then
                            .Item(fio) = .Item(fio) + Cells(r, c + 1).Value
                        Else: .Add fio, Cells(r, c + 1).Value
                        End If
                    Case 2
                        If Not .exists(fio) Then
                            .Add fio, WorksheetFunction.CountIf(Range(Cells(2, c), Cells(lr, c)), fio)
                        End If
                    End Select
            Next r
        keysArr = .keys
        itemsArr = .items
        ReDim arr_(1 To .Count)
            For x = 0 To UBound(keysArr)
                arr_(x + 1) = keysArr(x) & itemsArr(x)
            Next x
        End With
    Sheets("Итого").Cells(2, t).Resize(UBound(arr_), 1) = Application.Transpose(arr_)
    c = 4
    Set oDict = Nothing
    ReDim arr_(0)
    Next t
Sheets("Итого").Activate
End Sub
[/vba]
[p.s.]Тренировал словарь, критика приветствуется
К сообщению приложен файл: 3739875.xls (48.0 Kb)


Яндекс: 410016850021169
 
Ответить
СообщениеДобрый день.
Копируем данные в соответствующие столбцы, нажимаем кнопку
[vba]
Код
Sub tabl1()
Dim arr_()
c = 1
    For t = 1 To 2
    lr = Cells(Rows.Count, c).End(xlUp).Row
    Set oDict = CreateObject("Scripting.Dictionary")
        With oDict
            For r = 2 To lr
                q = InStr(1, Cells(r, c).Value, "(", vbTextCompare)
                    If q Then
                        fio = Left(Cells(r, c).Value, q - 2)
                        Else: fio = Cells(r, c).Value
                    End If
                    Select Case t
                    Case 1
                        If .exists(fio) Then
                            .Item(fio) = .Item(fio) + Cells(r, c + 1).Value
                        Else: .Add fio, Cells(r, c + 1).Value
                        End If
                    Case 2
                        If Not .exists(fio) Then
                            .Add fio, WorksheetFunction.CountIf(Range(Cells(2, c), Cells(lr, c)), fio)
                        End If
                    End Select
            Next r
        keysArr = .keys
        itemsArr = .items
        ReDim arr_(1 To .Count)
            For x = 0 To UBound(keysArr)
                arr_(x + 1) = keysArr(x) & itemsArr(x)
            Next x
        End With
    Sheets("Итого").Cells(2, t).Resize(UBound(arr_), 1) = Application.Transpose(arr_)
    c = 4
    Set oDict = Nothing
    ReDim arr_(0)
    Next t
Sheets("Итого").Activate
End Sub
[/vba]
[p.s.]Тренировал словарь, критика приветствуется

Автор - sboy
Дата добавления - 04.10.2017 в 17:29
BTH Дата: Четверг, 05.10.2017, 07:25 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: -1 ±
Замечаний: 0% ±

Excel 2007
Копируем данные в соответствующие столбцы, нажимаем кнопку

Добрый день. Спасибо вам! Это чудо какое-то!!! Массивные списки выходят как надо!

А есть ли возможность на 2столбец запилить сортировку по алфавиту? Или это уже другой вопрос, не входит в эту тему?)


BlackTeaHappy

Сообщение отредактировал BTH - Четверг, 05.10.2017, 07:30
 
Ответить
Сообщение
Копируем данные в соответствующие столбцы, нажимаем кнопку

Добрый день. Спасибо вам! Это чудо какое-то!!! Массивные списки выходят как надо!

А есть ли возможность на 2столбец запилить сортировку по алфавиту? Или это уже другой вопрос, не входит в эту тему?)

Автор - BTH
Дата добавления - 05.10.2017 в 07:25
sboy Дата: Четверг, 05.10.2017, 10:56 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
Вопрос к модераторам, допиливать? или новая тема?


Яндекс: 410016850021169
 
Ответить
СообщениеВопрос к модераторам, допиливать? или новая тема?

Автор - sboy
Дата добавления - 05.10.2017 в 10:56
Pelena Дата: Четверг, 05.10.2017, 11:35 | Сообщение № 10
Группа: Админы
Ранг: Местный житель
Сообщений: 19177
Репутация: 4417 ±
Замечаний: ±

Excel 365 & Mac Excel
Думаю, что сортировка и сравнение немного разные вещи.
BTH, создайте новую тему


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеДумаю, что сортировка и сравнение немного разные вещи.
BTH, создайте новую тему

Автор - Pelena
Дата добавления - 05.10.2017 в 11:35
_Boroda_ Дата: Четверг, 05.10.2017, 11:57 | Сообщение № 11
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16674
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Пока писал текст, Лена уже послала. Впрочем, у меня примерно также написано было - "новую тему"

критика приветствуется

Пара вопросов
1. почто ячейки столбца А не из массива к словарь кладутся, а с листа каждый раз в цикле берутся вот здесь[vba]
Код
q = InStr(Cells(r, c).Value, "(")
[/vba] - кол-во обращений к листу по возможности нужно минимизировать, поэтому сначала все данные загоняем в массив, а потом из него в словарь

2. создаем массив keysArr (и itemsArr тоже) и приравниваем его массиву .keys? Получили 2 совершенно одинаковых массива. Зачем?
объединять ФИО и кол-во можно прямо сразу в Итеме (через разделитель, например "|") и потом Сплитом разделять, а можно после создания словаря переписать его с Итемом, равным Кейс & Итем, примерно вот так
[vba]
Код
Next r
'отсюда
For Each k_ In .Keys
      .Item(k_) = k_ & " - " & .Item(k_)
Next
Sheets("Итого").Cells(2, t).Resize(.Count) = Application.Transpose(.Items)
'досюда
c = 4
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПока писал текст, Лена уже послала. Впрочем, у меня примерно также написано было - "новую тему"

критика приветствуется

Пара вопросов
1. почто ячейки столбца А не из массива к словарь кладутся, а с листа каждый раз в цикле берутся вот здесь[vba]
Код
q = InStr(Cells(r, c).Value, "(")
[/vba] - кол-во обращений к листу по возможности нужно минимизировать, поэтому сначала все данные загоняем в массив, а потом из него в словарь

2. создаем массив keysArr (и itemsArr тоже) и приравниваем его массиву .keys? Получили 2 совершенно одинаковых массива. Зачем?
объединять ФИО и кол-во можно прямо сразу в Итеме (через разделитель, например "|") и потом Сплитом разделять, а можно после создания словаря переписать его с Итемом, равным Кейс & Итем, примерно вот так
[vba]
Код
Next r
'отсюда
For Each k_ In .Keys
      .Item(k_) = k_ & " - " & .Item(k_)
Next
Sheets("Итого").Cells(2, t).Resize(.Count) = Application.Transpose(.Items)
'досюда
c = 4
[/vba]

Автор - _Boroda_
Дата добавления - 05.10.2017 в 11:57
sboy Дата: Четверг, 05.10.2017, 12:14 | Сообщение № 12
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, Спасибо за помощь в обучении
по 1 - принято, в извилину добавлено)
по 2 - не додумал до For each... не знал как пройтись циклом по ключам, т.к. у них нет номера, поэтому перегнал в массив


Яндекс: 410016850021169
 
Ответить
Сообщение_Boroda_, Спасибо за помощь в обучении
по 1 - принято, в извилину добавлено)
по 2 - не додумал до For each... не знал как пройтись циклом по ключам, т.к. у них нет номера, поэтому перегнал в массив

Автор - sboy
Дата добавления - 05.10.2017 в 12:14
_Boroda_ Дата: Четверг, 05.10.2017, 12:17 | Сообщение № 13
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16674
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
как пройтись циклом по ключам, т.к. у них нет номера,

Ну как же? Есть
[vba]
Код
For i = 1 To .Count
      a =.Items()(i)
Next
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
как пройтись циклом по ключам, т.к. у них нет номера,

Ну как же? Есть
[vba]
Код
For i = 1 To .Count
      a =.Items()(i)
Next
[/vba]

Автор - _Boroda_
Дата добавления - 05.10.2017 в 12:17
sboy Дата: Четверг, 05.10.2017, 14:53 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
С учетом вышесказанного, вот так получилось
[vba]
Код
Sub tabl1()
c = 1
    For t = 1 To 2
    lr = Cells(Rows.Count, c).End(xlUp).Row
        fioArr = Range(Cells(2, c), Cells(lr, c + 1)).Value
        Set oDict = CreateObject("Scripting.Dictionary")
            With oDict
                For r = 1 To UBound(fioArr)
                    q = InStr(1, fioArr(r, 1), "(", vbTextCompare)
                        If q Then
                            fio = Left(fioArr(r, 1), q - 2)
                            Else: fio = fioArr(r, 1)
                        End If
                        Select Case t
                        Case 1
                            If .exists(fio) Then
                    .Item(fio) = .Item(fio) + fioArr(r, 2)
                            Else: .Add fio, fioArr(r, 2)
                            End If
                        Case 2
                            If Not .exists(fio) Then
                    countfio = 0
                    For x = 1 To UBound(fioArr)
                    If fioArr(x, 1) = fioArr(r, 1) Then countfio = countfio + 1
                    Next x
                    .Add fio, countfio
                            End If
                        End Select
                Next r
                    For Each k In .keys
                        .Item(k) = k & .Item(k)
                    Next k
                Sheets("Итого").Cells(2, t).Resize(.Count, 1) = Application.Transpose(.items)
            End With
        c = 4
        Set oDict = Nothing
        fioArr = Empty
    Next t
Sheets("Итого").Activate
End Sub
[/vba]


Яндекс: 410016850021169
 
Ответить
СообщениеС учетом вышесказанного, вот так получилось
[vba]
Код
Sub tabl1()
c = 1
    For t = 1 To 2
    lr = Cells(Rows.Count, c).End(xlUp).Row
        fioArr = Range(Cells(2, c), Cells(lr, c + 1)).Value
        Set oDict = CreateObject("Scripting.Dictionary")
            With oDict
                For r = 1 To UBound(fioArr)
                    q = InStr(1, fioArr(r, 1), "(", vbTextCompare)
                        If q Then
                            fio = Left(fioArr(r, 1), q - 2)
                            Else: fio = fioArr(r, 1)
                        End If
                        Select Case t
                        Case 1
                            If .exists(fio) Then
                    .Item(fio) = .Item(fio) + fioArr(r, 2)
                            Else: .Add fio, fioArr(r, 2)
                            End If
                        Case 2
                            If Not .exists(fio) Then
                    countfio = 0
                    For x = 1 To UBound(fioArr)
                    If fioArr(x, 1) = fioArr(r, 1) Then countfio = countfio + 1
                    Next x
                    .Add fio, countfio
                            End If
                        End Select
                Next r
                    For Each k In .keys
                        .Item(k) = k & .Item(k)
                    Next k
                Sheets("Итого").Cells(2, t).Resize(.Count, 1) = Application.Transpose(.items)
            End With
        c = 4
        Set oDict = Nothing
        fioArr = Empty
    Next t
Sheets("Итого").Activate
End Sub
[/vba]

Автор - sboy
Дата добавления - 05.10.2017 в 14:53
BTH Дата: Пятница, 06.10.2017, 07:31 | Сообщение № 15
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: -1 ±
Замечаний: 0% ±

Excel 2007
вот так получилось

Ага, спасибо, попробую сейчас этой формулой.

создайте новую тему

Хорошо, спасибо вам!


BlackTeaHappy
 
Ответить
Сообщение
вот так получилось

Ага, спасибо, попробую сейчас этой формулой.

создайте новую тему

Хорошо, спасибо вам!

Автор - BTH
Дата добавления - 06.10.2017 в 07:31
BTH Дата: Пятница, 06.10.2017, 07:38 | Сообщение № 16
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: -1 ±
Замечаний: 0% ±

Excel 2007
Попробовал. У меня как-то медленнее работает вторая версия кода(за 6 секунд). Это нормально?) Первая версия за 2,40 секунд.
Но выдаёт всё так же отличный результат! Спасибо!


BlackTeaHappy

Сообщение отредактировал BTH - Пятница, 06.10.2017, 07:49
 
Ответить
СообщениеПопробовал. У меня как-то медленнее работает вторая версия кода(за 6 секунд). Это нормально?) Первая версия за 2,40 секунд.
Но выдаёт всё так же отличный результат! Спасибо!

Автор - BTH
Дата добавления - 06.10.2017 в 07:38
sboy Дата: Пятница, 06.10.2017, 13:21 | Сообщение № 17
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
медленнее работает вторая версия кода

я так думаю, что функция листа в первом коде
[vba]
Код
If Not .exists(fio) Then
.Add fio, WorksheetFunction.CountIf(Range(Cells(2, c), Cells(lr, c)), fio)
End If
[/vba]
отрабатывает быстрее, чем перебор в цикле все элементов массива во втором коде
[vba]
Код
If Not .exists(fio) Then
countfio = 0
For x = 1 To UBound(fioArr)
If fioArr(x, 1) = fioArr(r, 1) Then countfio = countfio + 1
Next x
.Add fio, countfio
[/vba]


Яндекс: 410016850021169
 
Ответить
Сообщение
медленнее работает вторая версия кода

я так думаю, что функция листа в первом коде
[vba]
Код
If Not .exists(fio) Then
.Add fio, WorksheetFunction.CountIf(Range(Cells(2, c), Cells(lr, c)), fio)
End If
[/vba]
отрабатывает быстрее, чем перебор в цикле все элементов массива во втором коде
[vba]
Код
If Not .exists(fio) Then
countfio = 0
For x = 1 To UBound(fioArr)
If fioArr(x, 1) = fioArr(r, 1) Then countfio = countfio + 1
Next x
.Add fio, countfio
[/vba]

Автор - sboy
Дата добавления - 06.10.2017 в 13:21
BTH Дата: Пятница, 06.10.2017, 13:32 | Сообщение № 18
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: -1 ±
Замечаний: 0% ±

Excel 2007
отрабатывает быстрее

Да, заменил стал быстрее! Спасибо!)

Всё, теперь я доволен! Спасибо вам большое! Всем по +! hands

closed


BlackTeaHappy
 
Ответить
Сообщение
отрабатывает быстрее

Да, заменил стал быстрее! Спасибо!)

Всё, теперь я доволен! Спасибо вам большое! Всем по +! hands

closed

Автор - BTH
Дата добавления - 06.10.2017 в 13:32
_Boroda_ Дата: Пятница, 06.10.2017, 14:53 | Сообщение № 19
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16674
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
А вот еще вариант протестируйте. Интересно
Прошлый макрос не совсем верный был. Перевложил
[vba]
Код
Sub tt()
    Application.ScreenUpdating = 0
    Application.Calculation = xlCalculationManual
    'если данные нельзя портить, то раскомментируйте строки ***
    r11_ = Range("A" & Rows.Count).End(3).Row - 1 'последняя строка
    r12_ = Range("D" & Rows.Count).End(3).Row - 1
'    ar10 = Range("A2").Resize(r11_, 2) '***значения в массив
'    ar20 = Range("D2").Resize(r12_) '***
    Range("A2").Resize(r11_ + 1).Replace What:=" (*", Replacement:="" 'меняем пробел-скобка и все, что после них на ничего
    Range("D2").Resize(r12_ + 1).Replace What:=" (*", Replacement:=""
    ar11 = Range("A2").Resize(r11_, 2) 'значения в массив
    ar21 = Range("D2").Resize(r12_)
'    Range("A2").Resize(r11_, 2) = ar10 '***восстанавливаем как было
'    Range("D2").Resize(r12_) = ar20 '***
    Set slov = CreateObject("Scripting.Dictionary")
    With slov
        For i = 1 To r11_
            .Item(ar11(i, 1)) = ar11(i, 2) + .Item(ar11(i, 1))
        Next i
        For Each k_ In .Keys
            .Item(k_) = k_ & " - " & .Item(k_)
        Next
        Sheets("Итого").Cells(2, 1).Resize(.Count) = Application.Transpose(.Items)
        .RemoveAll
        For i = 1 To r12_
            .Item(ar21(i, 1)) = 1 + .Item(ar21(i, 1))
        Next i
        For Each k_ In .Keys
            .Item(k_) = k_ & " - " & .Item(k_)
        Next
        Sheets("Итого").Cells(2, 2).Resize(.Count) = Application.Transpose(.Items)
    End With
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = 1
    Sheets("Итого").Activate
End Sub
[/vba]
К сообщению приложен файл: 3739875_57.xlsb (32.2 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеА вот еще вариант протестируйте. Интересно
Прошлый макрос не совсем верный был. Перевложил
[vba]
Код
Sub tt()
    Application.ScreenUpdating = 0
    Application.Calculation = xlCalculationManual
    'если данные нельзя портить, то раскомментируйте строки ***
    r11_ = Range("A" & Rows.Count).End(3).Row - 1 'последняя строка
    r12_ = Range("D" & Rows.Count).End(3).Row - 1
'    ar10 = Range("A2").Resize(r11_, 2) '***значения в массив
'    ar20 = Range("D2").Resize(r12_) '***
    Range("A2").Resize(r11_ + 1).Replace What:=" (*", Replacement:="" 'меняем пробел-скобка и все, что после них на ничего
    Range("D2").Resize(r12_ + 1).Replace What:=" (*", Replacement:=""
    ar11 = Range("A2").Resize(r11_, 2) 'значения в массив
    ar21 = Range("D2").Resize(r12_)
'    Range("A2").Resize(r11_, 2) = ar10 '***восстанавливаем как было
'    Range("D2").Resize(r12_) = ar20 '***
    Set slov = CreateObject("Scripting.Dictionary")
    With slov
        For i = 1 To r11_
            .Item(ar11(i, 1)) = ar11(i, 2) + .Item(ar11(i, 1))
        Next i
        For Each k_ In .Keys
            .Item(k_) = k_ & " - " & .Item(k_)
        Next
        Sheets("Итого").Cells(2, 1).Resize(.Count) = Application.Transpose(.Items)
        .RemoveAll
        For i = 1 To r12_
            .Item(ar21(i, 1)) = 1 + .Item(ar21(i, 1))
        Next i
        For Each k_ In .Keys
            .Item(k_) = k_ & " - " & .Item(k_)
        Next
        Sheets("Итого").Cells(2, 2).Resize(.Count) = Application.Transpose(.Items)
    End With
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = 1
    Sheets("Итого").Activate
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 06.10.2017 в 14:53
sboy Дата: Пятница, 06.10.2017, 15:10 | Сообщение № 20
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, а теперь по-подробней)
Где метод Add? откуда ключи берутся? для меня пока такая запись похожа на шаманство :D
[vba]
Код
For i = 1 To r11_
            .Item(ar11(i, 1)) = ar11(i, 2) + .Item(ar11(i, 1))
        Next i
        For Each k_ In .Keys
            .Item(k_) = k_ & " - " & .Item(k_)
        Next
[/vba]


Яндекс: 410016850021169
 
Ответить
Сообщение_Boroda_, а теперь по-подробней)
Где метод Add? откуда ключи берутся? для меня пока такая запись похожа на шаманство :D
[vba]
Код
For i = 1 To r11_
            .Item(ar11(i, 1)) = ar11(i, 2) + .Item(ar11(i, 1))
        Next i
        For Each k_ In .Keys
            .Item(k_) = k_ & " - " & .Item(k_)
        Next
[/vba]

Автор - sboy
Дата добавления - 06.10.2017 в 15:10
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Упрощение сравнения 2 разных списков людей (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!