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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2013, 17:47   #41
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

В основном коде при совпадении в 5-ю ячейку сравниваемой строки прописывается комментарий "не обработан, совпадение с Базой" (База - это типа Лист2 в примере). А надо "... совпадение со строкой .... Базы", чтобы визуально потом быстро найти строку, с которой совпало, поправить чего надо и вручную обработать. Бывает выскакивают двойники или еще какая-то фигня с новыми данными. Вообще-то в идеале прописать прямо гиперссылку на строку, с которой совпало, где-то там, за пределами таблицы на Листе1, чтоб не искать, а можно было кликнуть и перейти прямо на эту строку. В оригинале это вообще две разных книги.
strannick вне форума Ответить с цитированием
Старый 08.02.2013, 18:20   #42
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Код:
Sub Stroka()
    Dim sh As Worksheet, sh1 As Worksheet
    Dim iLastRow As Long, iLastRow1 As Long, i As Long, j As Long, k As Long
    Dim a(), oDict1 As Object

    Set sh = Sheets("Лист1")
    Set sh1 = Sheets("Лист2")

    iLastRow1 = sh1.Cells(Rows.Count, 16).End(xlUp).Row

    a = sh1.Range("L2:Q" & iLastRow1).Value    'массив в словарь
    Set oDict1 = CreateObject("scripting.dictionary")
    For i = 1 To UBound(a)    'наполняем словарь
        oDict1.Item(a(i, 1)) = i
    Next

    For k = 12 To 17    'цикл по сравниваемым ячейкам
        j = 4    'сравниваем конкретную строку Листа1
        u = sh.Cells(j, k).Value    'значение ячейки которую сравниваем
        If u <> "" Then    'чтоб не выдавало совпадений по пустым
            If oDict1.exists(u) Then
                i = oDict1.Item(u)
                sh.Cells(j, 5).Hyperlinks.Add sh.Cells(j, 5), _
                                              "", "'" & Sheets("Лист2").Name & "'" & "!L" & i + 1, , "не обработан, совпадение со строкой " & i + 1 & " Базы"

            End If
        End If
    Next

End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 09.02.2013, 04:17   #43
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Класс!!!! Я когда в прошлом варианте пытался вставлять гиперссылку не на строку, а на совпавшую ячейку, столкнулся с ситуацией, которая и сейчас в принципе возможна:
Цитата:
Но если таких значений будет несколько одинаковых, то это нужно учесть - тогда в Item можно собирать массив/коллекцию этих номеров, или оставлять первый или последний номер, смотря по задаче.
Сравнение по сути идет одномерного массива 1х6 с двумерным iх6 поячеечно. Ячейки сравниваемого массива могут совпасть с Базой в разных строках\столбцах. Сегодня Вася сделал заказ от ООО ККК, через неделю от того же ООО ККК заказ сделал Сергей Александрович. Или наоборот - совпало Имя Вася, но вообще без Названия фирмы, но с тем же e-mail. Собрать в массив\коллекцию номеров строк по совпадениям, я так понимаю, не проблема, а вот выводить по каждой из них гиперссылку - тут вряд ли получится. Может, собрав номера совпавших строк, писать в ячейку комментарий "....совпадение с Базой, строки №№ 2, 5, 7", а гиперссылку выводить в другую ячейку на последнее найденное совпадение?

И, кстати, про "кошек". Они тут сидят и уверяют меня, что
Код:
For i = 1 To UBound(a)    'наполняем словарь
       oDict1.Item(a(i, 1)) = i
    Next
добавляют в словарь только ячейки по первому столбцу массива a (столбец L в примере), а остальные (с M по Q) остаются за бортом словаря?

Последний раз редактировалось strannick; 09.02.2013 в 04:38.
strannick вне форума Ответить с цитированием
Старый 09.02.2013, 13:18   #44
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

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

По "кошкам" - как напишем, так и будет. Если проверяем одну ячейку строки - запоминаем одну. Добавим цикл по строке - будем добавлять что добавим
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 09.02.2013, 13:43   #45
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
По "кошкам" - как напишем, так и будет. Если проверяем одну ячейку строки - запоминаем одну. Добавим цикл по строке - будем добавлять что добавим
Конечно, надо все ячейки строки. Тут я в словарях и путаюсь. Если пишем:
Код:
a = sh1.Range("L2:Q" & iLastRow1).Value
For Each y In a
       If Len(y) Then oDict1.Item(y) = 0& 
   Next
то в словарь заносятся все ячейки массива а, но без признака строки. Как скрестить одно с другим? Не делать же прогоны отдельно по каждому столбцу. Или надо организовывать такой цикл?

Цитата:
Как вариант - сделать выплывающий листбокс с этими адресами
Та это уже слишком. Остановлюсь на варианте вставки гиперссылки на последнее найденное совпадение.
А вот по поводу
Цитата:
кладём в итем новую коллекцию и добавляем в неё номера строк
- это если цикл по столбцам делать (вопрос выше)?
strannick вне форума Ответить с цитированием
Старый 09.02.2013, 14:01   #46
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Делать цикл по столбцам и вложенный по строке.
По времени думаю это не будет отличаться от for each y.
Словарь с коллекцией был тут: http://www.programmersforum.ru/showthread.php?t=210517
Смотреть http://www.programmersforum.ru/showp...0&postcount=20
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 09.02.2013 в 14:19.
Hugo121 вне форума Ответить с цитированием
Старый 10.02.2013, 02:22   #47
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Все, сделал. Получилось вот так:
Код:
b = sh5.Range("L2:Q" & iLastRow1).Value    'массив, с ячейками которого сравниваются
    Set oDict2 = CreateObject("scripting.dictionary")
    For z = 1 To UBound(b)    'наполняем словарь
    For zz = 1 To 6
        oDict2.Item(b(z, zz)) = z
    Next
    Next
Встроил в основной код, все работает. Всем еще раз спасибо. Основной вопрос решен. Но появилась проблема со вставкой гиперссылки на совпавшую строку. Тут продолжать не буду, вынесу в отдельную тему.
strannick вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение двух диапазонов на предмет изменений strannick Microsoft Office Excel 2 29.11.2012 00:42
Сравнение двух диапазонов ячеек и выбор из них pavpin Microsoft Office Excel 2 05.09.2012 21:02
Сравнение 3-х диапазонов Severny Microsoft Office Excel 0 13.01.2012 12:23
Сравнение двух диапазонов и удаление совпадений Aniqa Microsoft Office Excel 5 20.07.2011 15:31
Сравнение двух диапазонов и удаление совпадений ПОСТРОЧНО (доработка) pringls Microsoft Office Excel 2 26.01.2011 16:54