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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2013, 22:31   #1
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию Сравнить два массива и вывести в отдельный столбец кол-во вхождений

Здравствуйте, уважаемые!
Нужна Ваша помощь.
Собственно задача описана в названии темы, перерыл весь форум, что только не пробовал, но увы.
Нашел код от Hugo, почти то, что нужно, но доделать его - не получилось.
Код:
'Макросом -
'1.два диапазона в два массива
'2.создание массива для результатов
'3.один перебор n значений массива в словарь
'4.m проверок массива на наличие в словаре и заполнение данными массива результата
'5.выгрузка результатов (тут нет предварительной очистки диапазона)

Sub compare()
    Dim a(), b(), c(), iLastrow As Long, i As Long, ii As Long

    '1.
    a = [d7:d8638].Value 'для теста
'    With Sheets(1)
'        iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
'        a = Range(.[b1], .Range("A" & iLastrow)).Value
'    End With
b = [ag7:ag6457].Value 'для теста
'    With Sheets(2)
'        iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
'        b = Range(.[b1], .Range("A" & iLastrow)).Value
'    End With
    '2.
    ReDim c(1 To UBound(a), 1 To 3)
    With CreateObject("Scripting.Dictionary")
        '3.
        For i = 1 To UBound(b)
            .Item(b(i, 1)) = i
        Next
        '4.
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then 'здесь нужно посчитать кол-во совпадений
            'значений массива b в массиве a
            'и вывести в соседний с массивом b столбец
                ii = ii + 1
                c(ii, 1) = c(ii, 1) + 1
            End If
        Next
    End With
    '5.
        [ah7].Resize(ii, 1) = c
End Sub
Подскажите, пожалуйста, что я делаю не так, чувствую, что где-то рядом, а все никак.
Мне нужно понять, потому как дальше еще нужно будет сделать почти такое же, но только нужно будет по совпадению просуммировать значения в диапазоне [c7:g8638] из столбца "G"
Спасибо.
ЗЫ
Где можно найти доступное описание работы с массивами и словарями/коллекциями?
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499

Последний раз редактировалось VictorM; 25.08.2013 в 22:36. Причина: дополнение
VictorM вне форума Ответить с цитированием
Старый 25.08.2013, 22:57   #2
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Код:
    '2. -
    With CreateObject("Scripting.Dictionary")
        '3.
        For i = 1 To UBound(b)
            .Item(b(i, 1)) = 0
        Next
        '4.
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then .Item(a(i, 1)) = .Item(a(i, 1)) + 1
        Next
    '5.
        [ah7]..Resize(.Count) = WorksheetFunction.Transpose(.Items)
    End With
Подключите хотя бы на время в References: Microsoft Scripting Runtime - будут доступны в подсказках методы
Код:
With New Dictionary
....
на неконкретные вопросы даю неконкретные ответы ...

Последний раз редактировалось Step_UA; 25.08.2013 в 23:17. Причина: Исправление ошибки в п.5
Step_UA вне форума Ответить с цитированием
Старый 25.08.2013, 23:07   #3
samsaa
 
Аватар для samsaa
 
Регистрация: 24.08.2013
Сообщений: 7
По умолчанию

У меня есть один макрос но он только для сравнения одного или двух диапазонов ячеек. Он может как пометить совпадающие значения указанным цветом, так и установить в соседних столбиках заданное число напротив совпадающих значений. Посмотри может он и подойдет тебе.
Вложения
Тип файла: rar Поиск совпадений.rar (17.5 Кб, 21 просмотров)
samsaa вне форума Ответить с цитированием
Старый 25.08.2013, 23:22   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Виктор, я бы подсказал, но не вполне понял задачу - с примером файла было бы проще.
Если нужно просто подсчитать количество вхождений (даже повторных), то массив с не нужен, достаточно
ii = ii + 1
и в конце показать это число.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 25.08.2013, 23:23   #5
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Step_UA, спасибо, за столь быстрый ответ.
Проверил, что-то не то, выдал все повторы =1, хотя я точно знаю, считал СЧЕТЕСЛИ(), что есть повторы. Буду еще смотреть и обязательно воспользуюсь Вашим советом.

samsaa, спасибо за файл. Но на циклах я уже и так сделал, много данных, медленно получается.
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 26.08.2013, 09:53   #6
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Цитата:
с примером файла было бы проще.
Да, конечно.
Вот пример файла. Сопадения посчитаны СЧЕТЕСЛИ() ) и макросом с изменениями, предложенными Step_UA.
Вроде все так, но видно, что макрос пропустил значения и счет сбился.
Вложения
Тип файла: zip совпадения.zip (9.2 Кб, 12 просмотров)
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 26.08.2013, 10:02   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

А если так:
Код:
        [f7].Resize(.Count) = WorksheetFunction.Transpose(.keys)
        [g7].Resize(.Count) = WorksheetFunction.Transpose(.Items)
И сразу всё понятно.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 26.08.2013, 10:07   #8
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Да, я все понял.
Неправильно сформулирована задача.
В массиве b также могут повторяться значения, но это уже ничего не значит.
Рядом должно быть также выведено кол-во совпадения, как в столбце с формулой.
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 26.08.2013, 10:31   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Ну, если Вам нравится функция "СЧЕТЕСЛИ", то используйте ее в макросе.
Пример во вложении. Код в модуле "Module2". Макрос "qq".
Вложения
Тип файла: rar совпадения_2.rar (9.3 Кб, 9 просмотров)
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 26.08.2013 в 10:34.
SAS888 вне форума Ответить с цитированием
Старый 26.08.2013, 10:47   #10
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

SAS888, спасибо.
Функция мне нравится, но на моих объемах (10 000 строк и 6 000 строк) немного тормозит.
Хотя, если ничего не получится со словарями, видимо остановлюсь на таком варианте.
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно сравнить два массива указателей типа char Никнейм94 C++ Builder 2 22.05.2013 10:53
Сравнить два ассоциативных массива и вывести одинаковые значения. livesport PHP 1 20.10.2012 15:10
нужен макрос на выделение значения из массива в отдельный столбец 30gb Microsoft Office Excel 3 14.01.2011 09:06