Макрос для excel поиск совпадений

Поиск совпадений в двух списках

Тема сравнения двух списков поднималась уже неоднократно и с разных сторон, но остается одной из самых актуальных везде и всегда. Давайте рассмотрим один из ее аспектов — подсчет количества и вывод совпадающих значений в двух списках. Предположим, что у нас есть два диапазона данных, которые мы хотим сравнить:

Исходные списки для сравнения

Для удобства, можно дать им имена, чтобы потом использовать их в формулах и ссылках. Для этого нужно выделить ячейки с элементами списка и на вкладке Формулы нажать кнопку Менеджер Имен — Создать (Formulas — Name Manager — Create). Также можно превратить таблицы в «умные» с помощью сочетания клавиш Ctrl+T или кнопки Форматировать как таблицу на вкладке Главная (Home — Format as Table).

Подсчет количества совпадений

Для подсчета количества совпадений в двух списках можно использовать следующую элегантную формулу:

Количество совпадений формулой

В английской версии это будет =SUMPRODUCT(COUNTIF(Список1;Список2))

Давайте разберем ее поподробнее, ибо в ней скрыто пару неочевидных фишек.

Во-первых, функция СЧЁТЕСЛИ (COUNTIF). Обычно она подсчитывает количество искомых значений в диапазоне ячеек и используется в следующей конфигурации:

=СЧЁТЕСЛИ(Где_искать; Что_искать)

Обычно первый аргумент — это диапазон, а второй — ячейка, значение или условие (одно!), совпадения с которым мы ищем в диапазоне. В нашей же формуле второй аргумент — тоже диапазон. На практике это означает, что мы заставляем Excel перебирать по очереди все ячейки из второго списка и подсчитывать количество вхождений каждого из них в первый список. По сути, это равносильно целому столбцу дополнительных вычислений, свернутому в одну формулу:

Подсчет количества совпадений отдельным столбцом

Во-вторых, функция СУММПРОИЗВ (SUMPRODUCT) здесь выполняет две функции — суммирует вычисленные СЧЁТЕСЛИ совпадения и заодно превращает нашу формулу в формулу массива без необходимости нажимать сочетание клавиш Ctrl+Shift+Enter. Формула массива необходима, чтобы функция СЧЁТЕСЛИ в режиме с двумя аргументами-диапазонами корректно отработала свою задачу.

Вывод списка совпадений формулой массива

Если нужно не просто подсчитать количество совпадений, но и вывести совпадающие элементы отдельным списком, то потребуется не самая простая формула массива:

Вывод совпадений в двух списках формулой массива

В английской версии это будет, соответственно:

=INDEX(Список1;MATCH(1;COUNTIF(Список2;Список1)*NOT(COUNTIF($E$1:E1;Список1));0))

Логика работы этой формулы следующая:

  • фрагмент СЧЁТЕСЛИ(Список2;Список1), как и в примере до этого, ищет совпадения элементов из первого списка во втором
  • фрагмент НЕ(СЧЁТЕСЛИ($E$1:E1;Список1)) проверяет, не найдено ли уже текущее совпадение выше
  • и, наконец, связка функций ИНДЕКС и ПОИСКПОЗ извлекает совпадающий элемент

Не забудьте в конце ввода этой формулы нажать сочетание клавиш Ctrl+Shift+Enter, т.к. она должна быть введена как формула массива.

Возникающие на избыточных ячейках ошибки #Н/Д можно дополнительно перехватить и заменить на пробелы или пустые строки «» с помощью функции ЕСЛИОШИБКА (IFERROR).

Вывод списка совпадений с помощью слияния запросов Power Query

На больших таблицах формула массива из предыдущего способа может весьма ощутимо тормозить, поэтому гораздо удобнее будет использовать Power Query. Это бесплатная надстройка от Microsoft, способная загружать в Excel 2010-2013 и трансформировать практически любые данные. Мощь и возможности Power Query так велики, что Microsoft включила все ее функции по умолчанию в Excel начиная с 2016 версии. 

Для начала, нам необходимо загрузить наши таблицы в Power Query. Для этого выделим первый список и на вкладке Данные (в Excel 2016) или на вкладке Power Query (если она была установлена как отдельная надстройка в Excel 2010-2013) жмем кнопку Из таблицы/диапазона (From Table):

Загрузка списков в Power Query

Excel превратит нашу таблицу в «умную» и даст ей типовое имя Таблица1. После чего данные попадут в редактор запросов Power Query. Никаких преобразований с таблицей нам делать не нужно, поэтому можно смело жать в левом верхнем углу кнопку Закрыть и загрузить — Закрыть и загрузить в… (Close & Load To…) и выбрать в появившемся окне Только создать подключение (Create only connection):

Закрыть и загрузить в        Только подключение

Затем повторяем то же самое со вторым диапазоном.

И, наконец, переходим с выявлению совпадений. Для этого на вкладке Данные или на вкладке Power Query находим команду Получить данные — Объединить запросы — Объединить (Get Data — Merge Queries — Merge):

Объединение запросов в Power Query

В открывшемся окне делаем три вещи:

  1. выбираем наши таблицы из выпадающих списков
  2. выделяем столбцы, по которым идет сравнение
  3. выбираем Тип соединения = Внутреннее (Inner Join)

Слияние для выявления совпадающих строк

После нажатия на ОК на экране останутся только совпадающие строки:

Результат слияния

Ненужный столбец Таблица2 можно правой кнопкой мыши удалить, а заголовок первого столбца переименовать во что-то более понятное (например Совпадения). А затем выгрузить полученную таблицу на лист, используя всё ту же команду Закрыть и загрузить (Close & Load):

Выгрузка результатов на лист

Если значения в исходных таблицах в будущем будут изменяться, то необходимо не забыть обновить результирующий список совпадений правой кнопкой мыши или сочетанием клавиш Ctrl+Alt+F5

Макрос для вывода списка совпадений

Само-собой, для решения задачи поиска совпадений можно воспользоваться и макросом. Для этого нажмите кнопку Visual Basic на вкладке Разработчик (Developer). Если ее не видно, то отобразить ее можно через Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon).

В окне редактора Visual Basic нужно добавить новый пустой модуль через меню Insert — Module и затем скопировать туда код нашего макроса:

Sub Find_Matches_In_Two_Lists()
    Dim coll As New Collection
    Dim rng1 As Range, rng2 As Range, rngOut As Range
    Dim i As Long, j As Long, k As Long

    Set rng1 = Selection.Areas(1)
    Set rng2 = Selection.Areas(2)
    Set rngOut = Application.InputBox(Prompt:="Выделите ячейку, начиная с которой нужно вывести совпадения", Type:=8)

    'загружаем первый диапазон в коллекцию
    For i = 1 To rng1.Cells.Count
        coll.Add rng1.Cells(i), CStr(rng1.Cells(i))
    Next i
    
    'проверяем вхождение элементов второго диапазона в коллекцию
    k = 0
    On Error Resume Next
    For j = 1 To rng2.Cells.Count
        Err.Clear
        elem = coll.Item(CStr(rng2.Cells(j)))
        If CLng(Err.Number) = 0 Then
            'если найдено совпадение, то выводим со сдвигом вниз
            rngOut.Offset(k, 0) = rng2.Cells(j)
            k = k + 1
        End If
    Next j
End Sub

Воспользоваться добавленным макросом очень просто. Выделите, удерживая клавишу Ctrl, оба диапазона и запустите макрос кнопкой Макросы на вкладке Разработчик (Developer) или сочетанием клавиш Alt+F8. Макрос попросит указать ячейку, начиная с которой нужно вывести список совпадений и после нажатия на ОК сделает всю работу:

Макрос поиска совпадений в двух списках

Более совершенный макрос подобного типа есть, кстати, в моей надстройке PLEX для Microsoft Excel.

Ссылки по теме

  • Поиск различий в двух списках Excel
  • Слияние двух списков без дубликатов (3 способа)
  • Что такое макросы, как их использовать, куда копировать код макросов на Visual Basic

Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Office для бизнеса Excel 2010 Excel 2007 Еще…Меньше

Чтобы сравнить данные в двух столбцах Microsoft Excel и найти повторяющиеся записи, воспользуйтесь следующими способами. 

Способ 1. Использование формулы на этом этапе

  1. Начните Excel.

  2. На новом примере введите следующие данные (оставьте столбец B пустым):

    A

    B

    C

    1

    1

    3

    2

    2

    5

    3

    3

    8

    4

    4

    2

    5

    5

    0

  3. Введите в ячейку B1 следующую

    формулу:=IF(ISERROR(MATCH(A1,$C$1:$C$5,0)),»»,A1)

  4. Выберем ячейку С1 по B5.

  5. В Excel 2007 и более поздних версиях Excel выберите Заполнить в группе Редактирование, а затем выберите Вниз.

    Повторяющиеся числа отображаются в столбце B, как в следующем примере: 

    A

    B

    C

    1

    1

    3

    2

    2

    2

    5

    3

    3

    3

    8

    4

    4

    2

    5

    5

    5

    0

Способ 2. Использование макроса Visual Basic макроса

Предупреждение: Корпорация Майкрософт предоставляет примеры программирования только для иллюстрации без гарантии, выраженной или подразумеваемой. Это относится и не только к подразумеваемой гарантии пригодности и пригодности для определенной цели. В этой статье предполагается, что вы знакомы с языком программирования, который демонстрируется, и средствами, используемыми для создания и от debug procedures. Инженеры службы поддержки Майкрософт могут объяснить функциональные возможности конкретной процедуры. Однако они не будут изменять эти примеры, чтобы обеспечить дополнительные функциональные возможности или процедуры по построению в необходимом порядке.

Чтобы использовать макрос Visual Basic для сравнения данных в двух столбцах, с помощью следующих действий:

  1. Запустите Excel.

  2. Нажмите ALT+F11, чтобы запустить Visual Basic редактора.

  3. В меню Вставка выберите Модуль.

  4. Введите следующий код на листе модуля:

    Sub Find_Matches()
    Dim CompareRange As Variant, x As Variant, y As Variant
    ' Set CompareRange equal to the range to which you will
    ' compare the selection.
    Set CompareRange = Range("C1:C5")
    ' NOTE: If the compare range is located on another workbook
    ' or worksheet, use the following syntax.
    ' Set CompareRange = Workbooks("Book2"). _
    ' Worksheets("Sheet2").Range("C1:C5")
    '
    ' Loop through each cell in the selection and compare it to
    ' each cell in CompareRange.
    For Each x In Selection
    For Each y In CompareRange
    If x = y Then x.Offset(0, 1) = x
    Next y
    Next x
    End Sub

  5. Нажмите ALT+F11, чтобы вернуться к Excel.

    1. Введите в качестве примера следующие данные (оставьте столбец B пустым):
       

      A

      B

      C

      1

      1

      3

      2

      2

      5

      3

      3

      8

      4

      4

      2

      5

      5

      0

  6. Выберем ячейку от A1 до A5.

  7. В Excel 2007 и более поздних версиях Excel выберите вкладку Разработчик, а затем в группе Код выберите макрос.

    Примечание: Если вкладка Разработчик не отключается, возможно, ее нужно включить. Для этого выберите Файл > параметры > настроитьленту , а затем выберите вкладку Разработчик в поле настройки справа.

  8. Щелкните Find_Matches, а затем нажмите кнопку Выполнить.

    Повторяющиеся числа отображаются в столбце B. Совпадающие числа будут поместиться рядом с первым столбцом, как показано ниже.

    A

    B

    C

    1

    1

    3

    2

    2

    2

    5

    3

    3

    3

    8

    4

    4

    2

    5

    5

    5

    0

Нужна дополнительная помощь?

Silvester

1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

1

Excel

Макрос: Поиск совпадений, перенос совпавшей ячейки и рядом с ней стоящей ячейки

21.11.2019, 08:10. Показов 9702. Ответов 17

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Доброго времени суток ! Прошу помощи с написанием макроса, очень очень очень выручите!
Задача такова
1 — есть книга из 3х листов ( 1 лист Временный, 2й Совпавшие, 3й База)
2 — необходимо сравнить значения со списка в листе БАЗА со списком в листе ВРЕМЕННЫЙ а именно со вторым столбцом «Совпавшие»
3 — если есть совпадения между значениями в листе база и значениями в листе Временный (во втором столбце «Совпавшие») то нужно скопировать из листа временный эту ячейку и соседние с ней( левую и правую)

я уже нашел примерно подходящий макрос в интернете но его нужно допилить до конца но я к сожалению не владею такими знаниями.

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
36
37
38
39
Sub Procedure_1()
 
    Dim lLastRowA As Long
    Dim lLastRowC As Long
    Dim i As Long
    Dim rFind As Excel.Range
    
    
    lLastRowA = Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row
    
    'номер строки с которой начать вставлять
    lLastRowC = Worksheets(2).Cells(Rows.Count, "C").End(xlUp).Row + 3
    
    Application.ScreenUpdating = False
    
    'номер строки с которой начну поиск
    For i = 2 To lLastRowA Step 1
       
        
       
        Set rFind = Columns("B").Find(What:=Cells(i, "A").Text, LookIn:=xlValues, _
            LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)
      
        If Not rFind Is Nothing Then
            Worksheets(2).Cells(lLastRowC, "C").Value = Cells(i, "A").Value
         
            lLastRowC = lLastRowC + 1
        End If
            
    Next i
    
   
    MsgBox "Распределение Чека Закончена!", vbInformation
 
   
    Application.ScreenUpdating = True
    
End Sub

Файл прилагаю с книгой для работы.

Заранее огромное спасибо!!!

Вложения

Тип файла: xlsx КНИГАА.xlsx (21.3 Кб, 67 просмотров)



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

21.11.2019, 08:10

Ответы с готовыми решениями:

Откорректировать макрос так, чтобы поиск осуществлялся не с ячейки А1, а с ячейки C21
Как в этом макросе прописать, чтобы поиск осуществлялся в столбике "С", но с 21-ой строки?

Sub…

Макрос для копирования ячейки и перенос ее по условию
Здравствуйте! помогите создать макрос, чтобы при нажатии кнопки, "сохранить", данные из столбца…

Макрос, который увеличивает значение ячейки А на 1 при изменении ячейки В
Добрый день.

Я написал макрос, который увеличивает значение ячейки А на 1 при изменении ячейки…

Редактирование ячейки и перенос значения ячейки через форму
Доброго времени суток люди) Помогите чем сможете, всю голову уже изломали. Сначала хотели кнопку с…

17

2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,143

21.11.2019, 10:44

2

Silvester,

Это ваш финальный файл?
Не будет ли вопросов типа :
» А как этот код подправить для такого-то файла?»



0



1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

21.11.2019, 11:04

 [ТС]

3

Добрый день! Над финальным файлом я еще работаю! он будет делаться долго и поэтому я щас набросал как примерно все будет,
если есть возможность то подпишите в коде макроса что да что значит!
Об изменениях
В книге, в листе «Временный» расположение данных относительно столбцов и строк A,B,С не будет менятся, будет варьироваться только количество данных(сейчас там 30 а возможно будет больше, или меньше)

В книге, в листе «Совпавшие» расположение данных могут меняться, тоесть 3 столбца с названиями «ячейка слева,ячейка справа совпавшие» будут не измены но вот их расположение будет меняться( тоесть сейчас они стоят на 2й строке B,C,D , а могут стоять в 5строке E,F,G)

В книге, в листе «Совпавшие» расположение данных меняться не будет! все будет так как есть, только со временем я буду добавлять в список новые значения!

и еще вопрос но если и так можно сделать то это будет просто ЧУДО!

Те данные которые попадут в лист Совпавшие в столбец совпавшие к ним можно будет скопировать примечание с листа База?
тоесть мы сравниваем данные между листами временный и база и если находит совпадение то копируем в лист совпавшие и если возможно то чтобы в этот же лист копировалось примечание совпавшего с базы?

Извиняюсь если что то непонятно заранее ! могу разьяснить более подробно если возникнут вопросы..

Заранее спасибо большое!!!!



0



Narimanych

2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,143

21.11.2019, 11:12

4

Silvester,
Для вашего файла попробуйте:

Кликните здесь для просмотра всего текста

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
Sub MMM()
LR1 = Sheets("временный").Cells(Rows.Count, 1).End(xlUp).Row
LR2 = Sheets("База").Cells(Rows.Count, 1).End(xlUp).Row
 
ARR1 = Range(Sheets("временный").Cells(2, 1), Sheets("временный").Cells(LR1, 3)).Value
ARR2 = Range(Sheets("База").Cells(2, 1), Sheets("База").Cells(LR2, 1)).Value
ReDim ARR3(1 To LR1 - 1, 1 To 3)
 
m = 1
For i = 1 To LR1 - 1
  For j = 1 To LR2 - 1
      If ARR1(i, 2) = ARR2(j, 1) Then
           For n = 1 To 3
           ARR3(m, n) = ARR1(i, n)
           Next
           m = m + 1
           Exit For
       End If
  Next
Next
 
Sheets("Совпавшие").[b3].Resize(LR1 - 1, 3) = ARR3
 
 
End Sub



2



1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

21.11.2019, 13:25

 [ТС]

5

Работает!!)))) Спасибо большое, только одно пару вопросов
1 — можно ли как нибудь исправить то в каком формате он копирует данные из листа временный в лист совпавшие «ячейку справа», почему то он все конвертирует
2 — можете разьяснить что где и куда для листа совпавшие т.к. (В книге, в листе «Совпавшие» расположение данных могут меняться, тоесть 3 столбца с названиями «ячейка слева,ячейка справа совпавшие» будут не измены но вот их расположение будет меняться( тоесть сейчас они стоят на 2й строке B,C,D , а могут стоять в 5строке E,F,G)
3 — а если в листе база будет не один столб код сильно поменяется? или можно этот повторить но что то в нем изменить для другого столбика?

Спасибо огромное, очень выручаете и если это возможно то рассмотрите возможность воплощения и этого

«и еще вопрос но если и так можно сделать то это будет просто ЧУДО!

Те данные которые попадут в лист Совпавшие в столбец совпавшие к ним можно будет скопировать примечание с листа База?
тоесть мы сравниваем данные между листами временный и база и если находит совпадение то копируем в лист совпавшие и если возможно то чтобы в этот же лист копировалось примечание совпавшего с базы?»

Заранее спасибо!

Добавлено через 3 минуты
С проблемой переноса ячейки справа разобрался)))

Добавлено через 3 минуты
дико извиняюсь что сразу не сказал а возможно чтобы макрос все нашедшие совпадения в листе временные помечал каким нить цветом или еще как нибудь?

Добавлено через 1 час 2 минуты
Еще раз извиняюсь! конечный файл! больше ничего менять не буду точно!

Необходимо чтобы он с листа БАЗА, столбца БАЗА1 сравнивал с листом временный и если есть совпадения то копировал в лист совпавшие в столбцы совпавшие1(также 3 ячейки) и точно также для каждого столбца в листе база

и отмечал найденные совпадения в листе временный каким нибудь цветом

и с листа база примечания совпавших ячеек

Еще раз извиняюсь за свой косяк! больше изменений не будет



0



1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

21.11.2019, 13:26

 [ТС]

6

Сам файл



0



2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,143

21.11.2019, 14:06

7

Silvester, Silvester,

В файле поменял только названия листов на A, B,& C .

Нажимаете на кнопку на листе А и ждете…



1



2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,143

21.11.2019, 14:18

8

Silvester,

Цитата
Сообщение от Silvester
Посмотреть сообщение

и с листа база примечания совпавших ячеек

Для больших объемов будет медленней работать.



1



1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

21.11.2019, 17:03

 [ТС]

9

Спасибо большое! Все прекрасно работает ! ВЫ просто гений!!!!!!!

Напишите пожалуйста что мне нужно добавить в макрос если в листе С появится еще один столбец и по нему надо будет делать сверку ?

И напишите пожалуйста примерно где что примерно значит, в крации(меня больше интересует как выбирать чтобы он начал вставлять не с 3й строчи а с пятой например)

ЕЩЕ РАЗ СПАСИБО ВАМ ОГРОМНОЕ,ВЫ МЕНЯ ОЧЕНЬ СИЛЬНО ВЫРУЧИЛИ!!!!!



0



Narimanych

2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,143

21.11.2019, 17:57

10

Silvester,
Ничего гениального во мне нет….- я простой человек.
и код — не идеален- для больших объемов скорость упадет неимоверно….

Цитата
Сообщение от Silvester
Посмотреть сообщение

Напишите пожалуйста что мне нужно добавить в макрос если в листе С появится еще один столбец и по нему надо будет делать сверку ?
И напишите пожалуйста примерно где что примерно значит, в крации(меня больше интересует как выбирать чтобы он начал вставлять не с 3й строчи а с пятой например)

Замените ваш код на этот ..

Кликните здесь для просмотра всего текста

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Sub MMM()
Sheets("B").Range("B3:O5000").Clear
 
LR1 = Sheets("A").Cells(Rows.Count, 1).End(xlUp).Row
LR21 = Sheets("C").Cells(Rows.Count, 1).End(xlUp).Row
LR22 = Sheets("C").Cells(Rows.Count, 2).End(xlUp).Row
LR23 = Sheets("C").Cells(Rows.Count, 3).End(xlUp).Row
 
 
Application.ScreenUpdating = False
M = 3  ' если поменяете на 5 - будет вставлять с 5 ой строки  ( для 1ой базы)
N = 3   ' если поменяете на 5 - будет вставлять с 5 ой строки  ( для 2ой базы)
Q = 3   ' если поменяете на 5 - будет вставлять с 5 ой строки  ( для 3ей базы)
 
 
 
For i = 2 To LR1
  For j = 2 To LR21
      If Sheets("A").Cells(i, 2).Value = Sheets("C").Cells(j, 1).Value Then
           With Range(Sheets("A").Cells(i, 1), Sheets("A").Cells(i, 3))
           .Copy Sheets("B").Cells(M, 2)
           .Interior.Color = vbYellow
           End With
           Sheets("C").Cells(j, 1).Copy Sheets("B").Cells(M, 3)
           M = M + 1
           Exit For
           
       End If
  Next
  
  For x = 2 To LR22
      If Sheets("A").Cells(i, 2).Value = Sheets("C").Cells(x, 2).Value Then
           With Range(Sheets("A").Cells(i, 1), Sheets("A").Cells(i, 3))
          
           .Copy Sheets("B").Cells(N, 7)
            .Interior.Color = vbYellow
           End With
             Sheets("C").Cells(x, 2).Copy Sheets("B").Cells(N, 8)
           
           N = N + 1
           Exit For
           
       End If
  Next
  
  
  For y = 2 To LR23
      If Sheets("A").Cells(i, 2).Value = Sheets("C").Cells(y, 3).Value Then
           With Range(Sheets("A").Cells(i, 1), Sheets("A").Cells(i, 3))
           
           .Copy Sheets("B").Cells(Q, 13)
           .Interior.Color = vbYellow
           End With
           Sheets("C").Cells(y, 3).Copy Sheets("B").Cells(Q, 14)
           Q = Q + 1
           Exit For
           
       End If
  Next
  
  
  
  
  
  
  
Next
 
 
 
 
 
Application.ScreenUpdating = True
MsgBox ("COMPLETE")
End Sub

При добавке столбца в лист С необходимо
1)Найти последнюю заполненную строчку в столбце ( в данном случае 4-ом):
LR24 = Sheets(«C»).Cells(Rows.Count, 4).End(xlUp).Row

2) Задать какую- нибудь переменную «U» и присвоить ей значение по аналогии :
M = 3
N = 3
Q = 3
U=3

3) добавить в код еще oдин блок:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
For f = 2 To LR24 
      If Sheets("A").Cells(i, 2).Value = Sheets("C").Cells(f, 3).Value Then
           With Range(Sheets("A").Cells(i, 1), Sheets("A").Cellsf(f, 3))
           
           .Copy Sheets("B").Cells(U, 13) ' Здесь поменять 13 на номер столбца по аналогии с другими блоками...
           .Interior.Color = vbYellow
           End With
           Sheets("C").Cells(f, 4).Copy Sheets("B").Cells(U, 14)  ' Здесь поменять 14 на номер столбца по аналогии с другими блоками...
          U = U+ 1
           Exit For
       Next f



0



1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

22.11.2019, 15:13

 [ТС]

11

Доброго времени суток! не работает формула хотя все проставил как нужно! вылазит ошибка «Next without For»
Подскажите что делать?



0



2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,143

22.11.2019, 17:01

12

Цитата
Сообщение от Silvester
Посмотреть сообщение

Доброго времени суток! не работает формула хотя все проставил как нужно! вылазит ошибка «Next without For»
Подскажите что делать?

После 10й строки

End if



0



Silvester

1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

22.11.2019, 17:29

 [ТС]

13

Вставил! все заработало без ошибок но все равно не ищет ! см файл во вложении

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Sub MMM()
Sheets("B").Range("B3:O5000").Clear
 
LR1 = Sheets("A").Cells(Rows.Count, 1).End(xlUp).Row
LR21 = Sheets("C").Cells(Rows.Count, 1).End(xlUp).Row
LR22 = Sheets("C").Cells(Rows.Count, 2).End(xlUp).Row
LR23 = Sheets("C").Cells(Rows.Count, 3).End(xlUp).Row
LR24 = Sheets("C").Cells(Rows.Count, 4).End(xlUp).Row
Application.ScreenUpdating = False
M = 3
N = 3
Q = 3
U = 3
For i = 2 To LR1 - 1
  For j = 2 To LR21 - 1
      If Sheets("A").Cells(i, 2).Value = Sheets("C").Cells(j, 1).Value Then
           With Range(Sheets("A").Cells(i, 1), Sheets("A").Cells(i, 3))
           
 
           .Copy Sheets("B").Cells(M, 2)
                      .Interior.Color = vbYellow
           End With
           Sheets("C").Cells(j, 1).Copy Sheets("B").Cells(M, 3)
           M = M + 1
           Exit For
           
       End If
  Next
  
  For x = 2 To LR22 - 1
      If Sheets("A").Cells(i, 2).Value = Sheets("C").Cells(x, 2).Value Then
           With Range(Sheets("A").Cells(i, 1), Sheets("A").Cells(i, 3))
          
           .Copy Sheets("B").Cells(N, 7)
            .Interior.Color = vbYellow
           End With
             Sheets("C").Cells(x, 2).Copy Sheets("B").Cells(N, 8)
           
           N = N + 1
           Exit For
           
       End If
  Next
  
  
  For y = 2 To LR23 - 1
      If Sheets("A").Cells(i, 2).Value = Sheets("C").Cells(y, 3).Value Then
           With Range(Sheets("A").Cells(i, 1), Sheets("A").Cells(i, 3))
           
           .Copy Sheets("B").Cells(Q, 13)
           .Interior.Color = vbYellow
           End With
           Sheets("C").Cells(y, 3).Copy Sheets("B").Cells(Q, 14)
           Q = Q + 1
           Exit For
           
       End If
  Next
  
  For f = 2 To LR24
      If Sheets("A").Cells(i, 2).Value = Sheets("C").Cells(f, 3).Value Then
           With Range(Sheets("A").Cells(i, 1), Sheets("A").Cellsf(f, 3))
           
           .Copy Sheets("B").Cells(U, 17) ' ????? ???????? 13 ?? ????? ??????? ?? ???????? ? ??????? ???????...
           .Interior.Color = vbYellow
           End With
           Sheets("C").Cells(f, 4).Copy Sheets("B").Cells(U, 18)  ' ????? ???????? 14 ?? ????? ??????? ?? ???????? ? ??????? ???????...
          U = U + 1
           Exit For
           End If
       Next f
  
  
  
  
  
Next
 
 
 
 
 
Application.ScreenUpdating = True
MsgBox ("COMPLETE")
End Sub



1



1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

22.11.2019, 17:32

 [ТС]

14

см файл



0



2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,143

22.11.2019, 18:06

15

Silvester,
Fixed…



0



1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

23.11.2019, 10:04

 [ТС]

16

Доброе утро! почему то не выходит у меня добавить еще один столбец (6 например и потом надо будет еще много добавлять) и выделяет желтым то что не нужно!

По итогу я допилил конечный файл так как он будет выглядить в жизни(см во вложении)

Принцип тот же:
В листе BASE зеленым отмечены колонки ,каждую колонку нужно сравнить со списком в листе CHECK(столбец MP Task
) и если есть совпадения то переместить совпавшую ячейку и ее соседние ячейки слева и справа в соответствующий столбец в листе GRAP с соответствующем примечанием из листа BASE.
И пометить все найденные ячейки цветом в листе CHECK
Файлы в листе BASE будут время от времени пополняться, ну так для инфо

И если можно то также сделать кнопку в листе СHECK
Пожалуйста помогите уже доделать это дело до конца!
Заранее спасибо!



0



2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,143

23.11.2019, 13:48

17

Silvester,

Исходя из посланного материала , считаю, что вы сами можете доделать.
Вам было послано 3 ФАЙЛА .

СМ. детали разъяснения в пункте 2…

Удачи.



0



1 / 1 / 0

Регистрация: 25.03.2015

Сообщений: 10

23.11.2019, 14:42

 [ТС]

18

Да знаю что сам могу сделать но почему макрос неправильно выделяет желтым цветом даже в том крайне высланом вами файле?
что не так там ?



0



Based on Ahmed’s answer, after some cleaning up and generalization, including the other «Find» parameters, so we can use this function in any situation:

'Uses Range.Find to get a range of all find results within a worksheet
' Same as Find All from search dialog box
'
Function FindAll(rng As Range, What As Variant, Optional LookIn As XlFindLookIn = xlValues, Optional LookAt As XlLookAt = xlWhole, Optional SearchOrder As XlSearchOrder = xlByColumns, Optional SearchDirection As XlSearchDirection = xlNext, Optional MatchCase As Boolean = False, Optional MatchByte As Boolean = False, Optional SearchFormat As Boolean = False) As Range
    Dim SearchResult As Range
    Dim firstMatch As String
    With rng
        Set SearchResult = .Find(What, , LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
        If Not SearchResult Is Nothing Then
            firstMatch = SearchResult.Address
            Do
                If FindAll Is Nothing Then
                    Set FindAll = SearchResult
                Else
                    Set FindAll = Union(FindAll, SearchResult)
                End If
                Set SearchResult = .FindNext(SearchResult)
            Loop While Not SearchResult Is Nothing And SearchResult.Address <> firstMatch
        End If
    End With
End Function

Usage is the same as native .Find, but here is a usage example as requested:

Sub test()
  Dim SearchRange As Range, SearchResults As Range, rng As Range
    Set SearchRange = MyWorksheet.UsedRange
    Set SearchResults = FindAll(SearchRange, "Search this")
    
    If SearchResults Is Nothing Then
        'No match found
    Else
        For Each rng In SearchResults
            'Loop for each match
        Next
    End If
End Sub

Метод Find объекта Range для поиска ячейки по ее данным в VBA Excel. Синтаксис и компоненты. Знаки подстановки для поисковой фразы. Простые примеры.

Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.

Синтаксис метода Range.Find

Expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.

В скобках перечислены параметры метода, среди них только What является обязательным.

Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.

Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.

Параметры метода Range.Find

Наименование Описание
Обязательный параметр
What Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра — Variant.
Необязательные параметры
After Ячейка, после которой следует начать поиск.
LookIn Уточняет область поиска. Список констант xlFindLookIn:

  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • xlFormulas (-4123) – формулы.
LookAt Поиск частичного или полного совпадения. Список констант xlLookAt:

  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
SearchOrder Определяет способ поиска. Список констант xlSearchOrder:

  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
SearchDirection Определяет направление поиска. Список констант xlSearchDirection:

  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
MatchCase Определяет учет регистра:

  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
MatchByte Условия поиска при использовании двухбайтовых кодировок:

  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
SearchFormat Формат поиска – используется вместе со свойством Application.FindFormat.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes.

В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

Знаки подстановки для поисковой фразы

Условные знаки в шаблоне поисковой фразы:

  • ? – знак вопроса обозначает любой отдельный символ;
  • * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
  • ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).

Простые примеры

При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:

  1. Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
  2. Если поисковая фраза в заданном диапазоне найдена не будет, метод Range.Find возвратит значение Nothing. Обращение к свойствам несуществующей ячейки будет генерировать ошибки. Поэтому, перед использованием результатов поиска, необходимо проверить объектную переменную на содержание в ней значения Nothing.

В примерах используются переменные:

  • myPhrase – переменная для записи поисковой фразы;
  • myCell – переменная, которой присваивается первая найденная ячейка, содержащая поисковую фразу, или значение Nothing, если поисковая фраза не найдена.

Пример 1

Sub primer1()

Dim myPhrase As Variant, myCell As Range

myPhrase = «стакан»

Set myCell = Range(«A1:L30»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

MsgBox «Строка найденной ячейки: « & myCell.Row

MsgBox «Столбец найденной ячейки: « & myCell.Column

MsgBox «Адрес найденной ячейки: « & myCell.Address

Else

MsgBox «Искомая фраза не найдена»

End If

End Sub

В этом примере мы присваиваем переменной myPhrase значение для поиска – "стакан". Затем проводим поиск этой фразы в диапазоне "A1:L30" с присвоением результата поиска переменной myCell. Далее проверяем переменную myCell, не содержит ли она значение Nothing, и выводим соответствующие сообщения.

Ознакомьтесь с работой кода VBA в случаях, когда в диапазоне "A1:L30" есть ячейка со строкой, содержащей подстроку "стакан", и когда такой ячейки нет.

Пример 2

Теперь посмотрим, как метод Range.Find отреагирует на поиск числа. В качестве диапазона поиска будем использовать первую строку активного листа Excel.

Sub primer2()

Dim myPhrase As Variant, myCell As Range

myPhrase = 526.15

Set myCell = Rows(1).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

Else: MsgBox «Искомая фраза не найдена»

End If

End Sub

Несмотря на то, что мы присвоили переменной числовое значение, метод Range.Find найдет ячейку со значением и 526,15, и 129526,15, и 526,15254. То есть, как и в предыдущем примере, поиск идет по подстроке.

Чтобы найти ячейку с точным соответствием значения поисковой фразе, используйте константу xlWhole параметра LookAt:

Set myCell = Rows(1).Find(myPhrase, , , xlWhole)

Аналогично используются и другие необязательные параметры. Количество «лишних» запятых перед необязательным параметром должно соответствовать количеству пропущенных компонентов, предусмотренных синтаксисом метода Range.Find, кроме случаев указания необязательного параметра по имени, например: LookIn:=xlValues. Тогда используется одна запятая, независимо от того, сколько компонентов пропущено.

Пример 3

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

Sub primer3()

Dim myPhrase As Variant, myCell As Range

myPhrase = «01.02.2019»

myPhrase = CDate(myPhrase)

Set myCell = Range(«A:A»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Номер начальной строки: « & myCell.Row

Else: MsgBox «Даты « & myPhrase & » в таблице нет»

End If

End Sub

Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.

Понравилась статья? Поделить с друзьями:
  • Макрос для excel поиск решения
  • Макрос для excel поиск по слову
  • Макрос для excel перебор ячеек
  • Макрос для excel отчет
  • Макрос для excel отправка почты через outlook