Макросы для сверки в excel

Эксклюзивно для бухгалтеров: скачайте инструмент для сверки взаиморасчетов в Excel

Наша подписчица группы в Фейсбук «Красный уголок бухгалтера» поделилась макросом Excel для сверки огромных диапазонов данных.

авыва

Скачайте макрос для сверки взаиморасчетов в Excel.

Вот простая инструкция к макросу:

1. Нужно выделить два столбца с диапазонами, которые нужно сравнить.

2. Запускаете макрос. Он выделяет суммы попарно, не выделяет все одинаковые суммы, как в случае с условным форматированием.

Чем еще помогут табличные программы бухгалтерам

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

Еще можно узнать, как Гугл.Таблицы помогают сверить соотношение данных Отчёта о финансовых результатах и декларации по налогу на прибыль.

Сервисы Гугл бесплатны.   

Как бухгалтеру освоить Excel

Какие книги и видео мастер-класс помогут бухгалтерам освоить Excel, можно узнать в статье бухгалтера Галины Плехановой. Там она рассказывает, как пользовалась программой, еще будучи налоговым инспектором.

Присоединяйтесь к нашей группе «Красный уголок бухгалтера» в Фейсбук. Рассказываем, почему это важно и чем сообщество пригодится каждому бухгалтеру.

Макрос для сверки таблиц (VBA)

Ant645

Дата: Воскресенье, 16.02.2020, 08:34 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2019

Добрый день, помогите решить один вопрос. Нужен макрос для сверки таблиц (см. файл). В файле указаны таблицы желтые и синие (для примера взял только по две). Нужен макрос который будет сверять желтые таблицы с синими.
Сверка:
1 — допустим брал «Обозначение 1» F2 находил его в столбце 1 синей таблицы и сравнивал их количество, если количество одинаково то брал обозначение «куда входит 1» H2 находил его в столбце в столбце 2 синей таблицы и сравнивал их количество, если они одинаковы то он находил обозначение из столбца H (которое последнее сверял) в столбце A ( А2) смотрел куда оно входит (С2) находило в 4 синем столбце и сравнивало их количество.

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

обозначения могут повторятся но быть с разной входимостью, необходимо что бы смотрел все варианты.И да обозначения не всегда находятся друг на против друга (необходимо, что бы они искал обозначение по всему столбцу). (Таблицы в рабочей версии не покрашены, покрасил для удобства)
Только ячейка куда входит находится на одной строчке с обозначением (например для обозначения 1 это куда входит 1. а для обозначения 2 куда входит 2)

К сообщению приложен файл:

0652641.xlsx
(11.1 Kb)

 

Ответить

Kuzmich

Дата: Воскресенье, 16.02.2020, 11:57 |
Сообщение № 2

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

Цитата

1 — допустим брал «Обозначение 1» F2

У вас в строке 1 опечатка ‘Обознаяение 1’
Можно использовать Find (для нахождения ‘Обозначение 1’ в синей таблице)
и циклы по строкам в найденном столбце.
Какой конкретно вопрос не получается, а то написанное вами смахивает на ТЗ.

 

Ответить

Ant645

Дата: Воскресенье, 16.02.2020, 12:19 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2019

Kuzmich,
Здравствуйте!
Возможно я те точно написал. Я имел ввиду что я взял число в ячейке F2 в столбце «обозначение 1». Суть такая что значение в F2 входит в число ячейки H2, потом число из ячейки H2 расположено в столбце А (например А2), и данное число входит в число расположенное в столбце С (например С2). Но одно значение может входить в несколько других значений (например в столбце А. число 11 входит и в 122 и в 543).
Я только пытаюсь разбираться в макросах, и я не могу пока написать его(

 

Ответить

Kuzmich

Дата: Воскресенье, 16.02.2020, 13:03 |
Сообщение № 4

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

Цитата

я взял число в ячейке F2 в столбце «обозначение 1».

[vba]

Код

Set iОбозначение1 = Range(«F2»)

[/vba]

Цитата

потом число из ячейки H2 расположено в столбце А (например А2)

[vba]

Код

Set iКудаВходит1 = Columns(«A»).Find(iОбозначение1.Offset(, 2), , xlValues, xlWhole)

[/vba]

Цитата

данное число входит в число расположенное в столбце С (например С2)

[vba]

Код

Set iКудаВходит2 = iКудаВходит1.Offset(, 2)

[/vba]
[vba]

Код

Sub NA()
Dim i As Long
Dim iLastRow As Long
Dim iКудаВходит1 As Range
Dim iКудаВходит2 As Range
Dim iОбозначение1 As Range
Dim FAdr As String
   iLastRow = Cells(Rows.Count, «B»).End(xlUp).Row
    Set iОбозначение1 = Range(«F2»)
      ‘ищем в столбце А значение из столбца Н
    Set iКудаВходит1 = Columns(«A»).Find(iОбозначение1.Offset(, 2), , xlValues, xlWhole)
     If Not iКудаВходит1 Is Nothing Then
        FAdr = iКудаВходит1.Address ‘адрес первого вхождения
      Do
       Set iКудаВходит2 = iКудаВходит1.Offset(, 2)
       ‘ищем дальше по столбцу А, есть лиеще вхождение?
       Set iКудаВходит1 = Columns(«A»).FindNext(iКудаВходит1)
      Loop While iКудаВходит1.Address <> FAdr
     End If
End Sub

[/vba]
Пример кода нахождения вхождений. Попробуйте разобраться.

 

Ответить

Ant645

Дата: Воскресенье, 16.02.2020, 13:42 |
Сообщение № 5

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2019

это вы описали как работает принцип нахождения куда входит.
Но самое сложное что необходимо что бы он делал сравнения на каждом уровне количества с синей таблицей. Выстраивал цепочку и каждый этап сравнивал их количество.

например

обозначение (кол)
1 ( 1 ) — 44 ( 7 ) — 133 ( 4 ) синяя таблица

1 ( 1 ) — 44 ( 2 ) — 133 ( 4 ) желтая таблица

вот три числа и каждое куда то входит и у каждого свое количество. Так вот нужно что бы макрос проверял их количество желтой и синей таблица на предмет того что разное количество но при это у вышестоящих одинаковое количество

у 44 разное количество. а у 133 нет, а должно быть у 133 разное количество так как у нижних чисел разное. и выдавал в отдельные ячейки итог с желтой и синей таблицы где различия

 

Ответить

Т.е. это уже четвёртая ступень проверки — когда не прошли предыдущие проверки?  
Да, работает, на «Садыкововне» выводит разницу (в моём примере):  

  Option Explicit  

  Sub compare()  
   Dim temp$, a(), b(), iLastrow As Long, i As Long, el  

     ‘1.два диапазона в два массива  
   With Sheet1    ‘используется кодовое имя  
       iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row  
       a = Range(.[E2], .Range(«A» & iLastrow)).Value
   End With  

     With Sheet2    ‘используется кодовое имя  
       iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row  
       b = Range(.[E2], .Range(«A» & iLastrow)).Value
   End With  

     ‘2.создание массива для результатов  
   ReDim c(1 To UBound(b), 1 To 1)  

     ‘3.один перебор 100000*2 значений массива в словарь  
   With CreateObject(«Scripting.Dictionary»)  
       .CompareMode = vbTextCompare  

         For i = 1 To UBound(a)  
           ‘в словарь Ф+И+О+ДР (в итем счёт)  
           temp = Trim(a(i, 1)) & «|» & _  
                  Trim(a(i, 2)) & «|» & _  
                  Trim(a(i, 3)) & «|» & _  
                  Trim(a(i, 4))  
           If Not .exists(temp) Then  
               ReDim d(0 To 0)  
               d(0) = Trim(a(i, 5))  
               .Item(temp) = d  
           Else  
               d = .Item(temp)  
               ReDim Preserve d(UBound(d) + 1)  
               d(UBound(d)) = Trim(a(i, 5))  
               .Item(temp) = d  
           End If  

             ‘в словарь Ф+И+О+счёт (в итем ДР)  
           temp = Trim(a(i, 1)) & «|» & _  
                  Trim(a(i, 2)) & «|» & _  
                  Trim(a(i, 3)) & «|» & _  
                  Trim(a(i, 5))  
           If Not .exists(temp) Then  
               ReDim d(0 To 0)  
               d(0) = Trim(a(i, 4))  
               .Item(temp) = d  
           Else  
               d = .Item(temp)  
               ReDim Preserve d(UBound(d) + 1)  
               d(UBound(d)) = Trim(a(i, 4))  
               .Item(temp) = d  
           End If  

             ‘в словарь счёт (в итем Ф+И+О+ДР)  
           temp = Trim(a(i, 5))  
           If Not .exists(temp) Then  
               ReDim d(0 To 0)  
               d(0) = Trim(a(i, 1)) & «|» & _  
                      Trim(a(i, 2)) & «|» & _  
                      Trim(a(i, 3)) & «|» & _  
                      Trim(a(i, 4))  
               .Item(temp) = d  
           Else  
               d = .Item(temp)  
               ReDim Preserve d(UBound(d) + 1)  
               d(UBound(d)) = Trim(a(i, 1)) & «|» & Trim(a(i, 2)) & «|» & Trim(a(i, 3)) & «|» & Trim(a(i, 4))  
               .Item(temp) = d  
           End If  

           Next  

         ‘4.500000*2 проверок массива на наличие в словаре и заполнение массива результата  
       For i = 1 To UBound(b)  
           temp = Trim(b(i, 1)) & «|» & _  
                  Trim(b(i, 2)) & «|» & _  
                  Trim(b(i, 3)) & «|» & _  
                  Trim(b(i, 4))  

             If .exists(temp) Then  
               d = .Item(temp)  
               For Each el In d  
                   If el = Trim(b(i, 5)) Then  
                       c(i, 1) = «совпало»  
                       Exit For  
                   End If  
               Next  
               If c(i, 1) <> «совпало» Then c(i, 1) = «не совпало по счёту: » & Join(d, «|»)  
           Else  

                 temp = Trim(b(i, 1)) & «|» & _  
                      Trim(b(i, 2)) & «|» & _  
                      Trim(b(i, 3)) & «|» & _  
                      Trim(b(i, 5))  

                 If .exists(temp) Then  
                   d = .Item(temp)  
                   c(i, 1) = «не совпало по дате: » & Join(d, «|»)  
               Else  
                   temp = Trim(b(i, 5))  
                   If .exists(temp) Then  
                       d = .Item(temp)  
                       c(i, 1) = «не совпало по Ф+И+О+ДР: » & Join(d, «|»)  
                   Else  
                       c(i, 1) = «не совпало вообще!!!»  
                   End If  

                 End If  
           End If  
       Next  
   End With  

     ‘5.выгрузка результатов  
   With Sheet2    ‘используется кодовое имя  
       .[G2].Resize(i — 1) = c
   End With  

  End Sub

ironegg

1904 / 781 / 31

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

Сообщений: 1,567

29.01.2011, 23:45

5

чтобы заполнить массив данными из диапазона

Visual Basic
1
2
      Dim myarray 
      myarray = Range("a1:a10").Value
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
Sub check()
  Dim i, j, m, n  As Integer
 
   Set reportRange = Worksheets("Report").Range("A:A")
  Set dataRange = Worksheets("Data").Range("B:B")
  n = Application.WorksheetFunction.CountA(reportRange)
  m = Application.WorksheetFunction.CountA(dataRange)
  Set reportRange = Worksheets("Report").Range("A:T")
  Set dataRange = Worksheets("Data").Range("A:AL")
  
  
  For i = 2 To n
 
    For j = 2 To m
      If Worksheets("Data").Cells(i, 2).Value = Worksheets("Report").Cells(j, 1).Value Then
        Worksheets("Data").Cells(i, 23).Value = Worksheets("Report").Cells(j, 18).Value
       
          End If
        
    Next j
  
    
  Next i
  For i = 2 To n
    If Worksheets("Data").Cells(i, 22).Value = Worksheets("Data").Cells(i, 23).Value Then
      Worksheets("Data").Cells(i, 24).Value = "TRUE"
    
    Else
      Worksheets("Data").Cells(i, 24).Value = "FALSE"
    
    End If
  Next i
End Sub

строка 2. все переменные кроме последней имеют тип Variant
строка 15 и другие подобные. в цикле много тысяч раз идет обращение сначала к активной книге, потом к коллекции листов, потом к листу, потом к диапазону ячеек листа, потом к коллекции ячеек, потом к конкретной ячейке. естественно это занимает много времени. более правильным будет сохранить ссылку на диапазон ячеек в объектной переменной, а потом просто перебирать коллекцию ячеек

Visual Basic
1
2
3
4
  Set Rng1 = Worksheets("Data").Range(Cells(2, 2), Cells(n, 2)) ' где n - номер нижней ячейки
  For Each с In Rng1.Cells
    v = с.Value
  Next r

слыхал, неплохим способом повысить быстородействие на около 30%, является использование смещения вместо прямого обращения к различным ячейкам. Property Offset([RowOffset], [ColumnOffset]) As Range
возвращает новый диапазон, сдвинутый на нужное количество строк и столбцов



0



Перейти к основному содержанию

Статья даёт ответы на следующие вопросы:

  • Как сравнить две таблицы в Excel с помощью макросов VBA?
  • Как обращаться к ячейкам таблицы Excel с помощью VBA?
  • Как осуществлять перебор ячеек таблицы в цикле с помощью VBA?

В предыдущей статье Сравнение таблиц в Excel мы рассмотрели подход к сравнению сложных таблиц с использованием формул и без программирования.

В данной статье рассмотрим способ сравнения таблиц Excel с помощью VBA макросов на примере тех же исходных данных.

Проиллюстрируем задачу картинкой из первой статьи.

задача сравнения двух таблиц в Excel

Для начала напишем алгоритм наших действий по сравнению таблиц.

  1. Определим диапазоны данных первой и второй таблицы, то есть найдем последние значимые строки и сохраним их номера в переменных (последняя строка таблицы 1 — last_i и последняя строка таблицы 2 — last_j).
  2. Начнем проходить по каждой строке таблицы 2 (внешний цикл), данные из которой нужно перенести в таблицу 1. С первой строки данных (в примере это строка 3) до последней строки таблицы 2.
  3. Для каждой строки таблицы 2 определим идентификатор строки, путем формирования строки, содержащей полный адрес квартиры (значения из нескольких колонок, разделенные дефисами).
  4. Начнем проходить по каждой строке таблицы 1 (внутренний цикл) с первой строки данных (в примере это строка 3) до последней строки таблицы 1, определяя при этом идентификатор строки.
  5. Сравним значения идентификаторов строк таблицы 1 и таблицы 2.
  6. Если идентификаторы равны, перепишем ФИО покупателя из ячейки таблицы 2 в соответствующую ячейку таблицы 1; прервем внутренний цикл по таблице 1 и перейдем к следующей строке таблицы 2 (переход к п.2).

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

Для этого откроем вкладку Вид ленты функций Excel. Щелкнем на нижнюю часть со стрелкой кнопки Макросы. В открывшемся подменю выберем Запись макроса. В результате начнется запись нового макроса. Поскольку код мы будем формировать вручную, то еще раз зайдем в подменю макросов и выберем Остановить запись. Далее еще раз войдем в подменю макросов и выберем Макросы.

В появившемся диалоге выделим наш макрос и нажмем Изменить.

На экране откроется окно редактора макросов Visual Basic for Applications. В области кода (правая верхняя область) отображается код только что созданного пустого макроса.

Редактор макросов Visual Basic For Applications

В процедуру Макрос1 (между объявлениями начала и конца процедуры: Sub и End Sub) необходимо вставить код, решающий поставленную задачу.
Образец кода представлен ниже.

Sub Макрос1()
'
' Макрос1 сравнение двух таблиц с использованием макроса VBA
'

' ссылка на первый лист книги
Dim sheet1 As Worksheet
Set sheet1 = ActiveWorkbook.Sheets(1)
' ссылка на второй лист книги
Dim sheet2 As Worksheet
Set sheet2 = ActiveWorkbook.Sheets(2)

' строка для хранения идентификатора строки первой таблицы
Dim str1 As String
' строка для хранения идентификатора строки второй таблицы
Dim str2 As String

' позиция курсора (номер строки) в первой таблице
Dim i As Integer
i = 3
Dim last_i As Integer
last_i = 3
' позиция курсора (номер строки) во второй таблице
Dim j As Integer
j = 3
Dim last_j As Integer
last_j = 3

' определяем последнюю значимую строку первой таблицы (последняя строка, в первой колонке которой есть значение)
For Each Cell In sheet1.Range("A:A")
    If Cell.Row > 2 Then
        If Cell.Value > "" Then
            last_i = Cell.Row
        Else
            Exit For
        End If
    End If
Next Cell

' определяем последнюю значимую строку второй таблицы (последняя строка, в первой колонке которой есть значение)
For Each Cell In sheet2.Range("A:A")
    If Cell.Row > 2 Then
        If Cell.Value > "" Then
            last_j = Cell.Row
        Else
            Exit For
        End If
    End If
Next Cell

' пробегаем по строкам второй таблицы (внешний цикл)
For j = 3 To last_j
    ' определяем идентификатор текущей строки
    str2 = sheet2.Cells(j, 1).Value & "-" & sheet2.Cells(j, 2).Value & "-" & sheet2.Cells(j, 3).Value & "-" & sheet2.Cells(j, 4).Value
    ' пробегаем по строкам первой таблицы (внутренний цикл)
    For i = 3 To last_i
        ' определяем идентификатор текущей строки
        str1 = sheet1.Cells(i, 1).Value & "-" & sheet1.Cells(i, 2).Value & "-" & sheet1.Cells(i, 3).Value & "-" & sheet1.Cells(i, 4).Value
        ' сравниваем идентификаторы строк первой и второй таблицы
        If str2 = str1 Then
            ' если совпадение найдено, то записываем покупателя из второй таблицы в первую в строку с соответствующей ему квартирой
            sheet1.Cells(i, 5).Value = sheet2.Cells(j, 5).Value
            ' прекращаем внутренний цикл, переходим к следующей итерации внешнего цикла
            ' (к следующей записи второй таблицы)
            Exit For
        End If
    Next i
Next j

End Sub

Результат решения задачи:
результат сравнения таблиц в Excel

Другие интересные статьи

  • Как сравнить две таблицы в Excel с использованием формул?
  • Горячие клавиши Excel

Тэги: 

  • Статьи
  • Excel
  • сравнение таблиц
  • VBA
  • макросы

Понравилась статья? Поделить с друзьями:
  • Макросы для добавления с формулами строки в excel
  • Макросы для редактора word
  • Макросы для выпадающего списка excel
  • Макросы для редактирования word
  • Макросы для верстки word