Наша подписчица группы в Фейсбук «Красный уголок бухгалтера» поделилась макросом Excel для сверки огромных диапазонов данных.
Вот простая инструкция к макросу:
1. Нужно выделить два столбца с диапазонами, которые нужно сравнить.
2. Запускаете макрос. Он выделяет суммы попарно, не выделяет все одинаковые суммы, как в случае с условным форматированием.
Чем еще помогут табличные программы бухгалтерам
О пользе Гугл.Таблиц для составления отчетности мы рассказывали в материале про анализ финансовой отчетности компании. Таблица создана на основе коэффициентов, которые используют банки, чтобы оценить финансовое состояние компании.
Еще можно узнать, как Гугл.Таблицы помогают сверить соотношение данных Отчёта о финансовых результатах и декларации по налогу на прибыль.
Сервисы Гугл бесплатны.
Как бухгалтеру освоить Excel
Какие книги и видео мастер-класс помогут бухгалтерам освоить Excel, можно узнать в статье бухгалтера Галины Плехановой. Там она рассказывает, как пользовалась программой, еще будучи налоговым инспектором.
Макрос для сверки таблиц (VBA) |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Т.е. это уже четвёртая ступень проверки — когда не прошли предыдущие проверки?
Да, работает, на «Садыкововне» выводит разницу (в моём примере):
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 |
|||||||||||
чтобы заполнить массив данными из диапазона
строка 2. все переменные кроме последней имеют тип Variant
слыхал, неплохим способом повысить быстородействие на около 30%, является использование смещения вместо прямого обращения к различным ячейкам. Property Offset([RowOffset], [ColumnOffset]) As Range
0 |
Перейти к основному содержанию
Статья даёт ответы на следующие вопросы:
- Как сравнить две таблицы в Excel с помощью макросов VBA?
- Как обращаться к ячейкам таблицы Excel с помощью VBA?
- Как осуществлять перебор ячеек таблицы в цикле с помощью VBA?
В предыдущей статье Сравнение таблиц в Excel мы рассмотрели подход к сравнению сложных таблиц с использованием формул и без программирования.
В данной статье рассмотрим способ сравнения таблиц Excel с помощью VBA макросов на примере тех же исходных данных.
Проиллюстрируем задачу картинкой из первой статьи.
Для начала напишем алгоритм наших действий по сравнению таблиц.
- Определим диапазоны данных первой и второй таблицы, то есть найдем последние значимые строки и сохраним их номера в переменных (последняя строка таблицы 1 — last_i и последняя строка таблицы 2 — last_j).
- Начнем проходить по каждой строке таблицы 2 (внешний цикл), данные из которой нужно перенести в таблицу 1. С первой строки данных (в примере это строка 3) до последней строки таблицы 2.
- Для каждой строки таблицы 2 определим идентификатор строки, путем формирования строки, содержащей полный адрес квартиры (значения из нескольких колонок, разделенные дефисами).
- Начнем проходить по каждой строке таблицы 1 (внутренний цикл) с первой строки данных (в примере это строка 3) до последней строки таблицы 1, определяя при этом идентификатор строки.
- Сравним значения идентификаторов строк таблицы 1 и таблицы 2.
- Если идентификаторы равны, перепишем ФИО покупателя из ячейки таблицы 2 в соответствующую ячейку таблицы 1; прервем внутренний цикл по таблице 1 и перейдем к следующей строке таблицы 2 (переход к п.2).
Теперь остается реализовать алгоритм в виде программного кода макроса.
Для этого откроем вкладку Вид ленты функций Excel. Щелкнем на нижнюю часть со стрелкой кнопки Макросы. В открывшемся подменю выберем Запись макроса. В результате начнется запись нового макроса. Поскольку код мы будем формировать вручную, то еще раз зайдем в подменю макросов и выберем Остановить запись. Далее еще раз войдем в подменю макросов и выберем Макросы.
В появившемся диалоге выделим наш макрос и нажмем Изменить.
На экране откроется окно редактора макросов 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
- сравнение таблиц
- VBA
- макросы