Операторы сравнения чисел и строк, ссылок на объекты (Is) и строк по шаблону (Like), использующиеся в VBA Excel. Их особенности, примеры вычислений.
Операторы сравнения чисел и строк
Операторы сравнения чисел и строк представлены операторами, состоящими из одного или двух математических знаков равенства и неравенства:
- < – меньше;
- <= – меньше или равно;
- > – больше;
- >= – больше или равно;
- = – равно;
- <> – не равно.
Синтаксис:
Результат = Выражение1 Оператор Выражение2 |
- Результат – любая числовая переменная;
- Выражение – выражение, возвращающее число или строку;
- Оператор – любой оператор сравнения чисел и строк.
Если переменная Результат будет объявлена как Boolean (или Variant), она будет возвращать значения False и True. Числовые переменные других типов будут возвращать значения 0 (False) и -1 (True).
Операторы сравнения чисел и строк работают с двумя числами или двумя строками. При сравнении числа со строкой или строки с числом, VBA Excel сгенерирует ошибку Type Mismatch (несоответствие типов данных):
Sub Primer1() On Error GoTo Instr Dim myRes As Boolean ‘Сравниваем строку с числом myRes = «пять» > 3 Instr: If Err.Description <> «» Then MsgBox «Произошла ошибка: « & Err.Description End If End Sub |
Сравнение строк начинается с их первых символов. Если они оказываются равны, сравниваются следующие символы. И так до тех пор, пока символы не окажутся разными или одна или обе строки не закончатся.
Значения буквенных символов увеличиваются в алфавитном порядке, причем сначала идут все заглавные (прописные) буквы, затем строчные. Если необходимо сравнить длины строк, используйте функцию Len.
myRes = «семь» > «восемь» ‘myRes = True myRes = «Семь» > «восемь» ‘myRes = False myRes = Len(«семь») > Len(«восемь») ‘myRes = False |
Оператор Is – сравнение ссылок на объекты
Оператор Is предназначен для сравнения двух переменных со ссылками на объекты.
Синтаксис:
Результат = Объект1 Is Объект2 |
- Результат – любая числовая переменная;
- Объект – переменная со ссылкой на любой объект.
Если обе переменные Объект1 и Объект2 ссылаются на один и тот же объект, Результат примет значение True. В противном случае результатом будет False.
Set myObj1 = ThisWorkbook Set myObj2 = Sheets(1) Set myObj3 = myObj1 Set myObj4 = Sheets(1) myRes = myObj1 Is myObj2 ‘myRes = False myRes = myObj1 Is myObj3 ‘myRes = True myRes = myObj2 Is myObj4 ‘myRes = True |
По-другому ведут себя ссылки на диапазоны ячеек. При присвоении ссылок на один и тот же диапазон нескольким переменным, в памяти создаются уникальные записи для каждой переменной.
Set myObj1 = Range(«A1:D4») Set myObj2 = Range(«A1:D4») Set myObj3 = myObj1 myRes = myObj1 Is myObj2 ‘myRes = False myRes = myObj1 Is myObj3 ‘myRes = True |
Оператор Like – сравнение строк по шаблону
Оператор Like предназначен для сравнения одной строки с другой по шаблону.
Синтаксис:
Результат = Выражение Like Шаблон |
- Результат – любая числовая переменная;
- Выражение – любое выражение, возвращающее строку;
- Шаблон – любое строковое выражение, которое может содержать знаки подстановки.
Строка, возвращенная аргументом Выражение, сравнивается со строкой, возвращенной аргументом Шаблон. Если обе строки совпадают, переменной Результат присваивается значение True, иначе – False.
myRes = «восемь» Like «семь» ‘myRes = False myRes = «восемь» Like «*семь» ‘myRes = True myRes = «Куда идет король» Like «идет» ‘myRes = False myRes = «Куда идет король» Like «*идет*» ‘myRes = True |
Со знаками подстановки для оператора Like вы можете ознакомиться в статье Знаки подстановки для шаблонов.
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
1 |
|
Сравнение двух диапазонов ячеек на совпадение29.05.2012, 00:04. Показов 23504. Ответов 20
Здравствуйте! Подскажите пожалуйста…
0 |
Заблокирован |
||||
29.05.2012, 06:59 |
2 |
|||
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
31.05.2012, 13:37 [ТС] |
3 |
Спасибо, а как сделать чтобы этот же код продолжал работать в след.ячейках например не А1:А3 и С1:С3, а изменил диапазон со сдвигом вправо, т.е. В1:В3 и D1: D3 стало, чтобы не писать его для всех ячеек, а просто со сдвигом вправо? Спасибо
0 |
17991 / 7617 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
|
01.06.2012, 09:20 |
4 |
И сколько таких сдвигов планируется?
0 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
01.06.2012, 13:00 [ТС] |
5 |
Примерно 30 сдвигов
0 |
Dragokas 17991 / 7617 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
||||
01.06.2012, 16:15 |
6 |
|||
Решение 1. Прокрутка через смещения
4 |
ikki призрак 3261 / 889 / 119 Регистрация: 11.05.2012 Сообщений: 1,702 Записей в блоге: 2 |
||||||||
01.06.2012, 16:38 |
7 |
|||||||
а так не проще?
0 |
Dragokas |
01.06.2012, 17:23
|
Не по теме: Да, я забыл как это делается. Спасибо.
0 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
01.06.2012, 22:54 [ТС] |
9 |
Спасибо!
Len(a) <> 0 а что значит эта строка?
0 |
17991 / 7617 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
|
02.06.2012, 05:16 |
10 |
Без нее, если попадутся 2 пустые ячейки, начнет писать о совпадении. У меня они были почти все пустые, поэтому я это дело отключил.
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
02.06.2012, 08:45 [ТС] |
11 |
Спасибо! Как раз то, что нужно.
0 |
irealife 2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
||||
03.07.2012, 23:15 [ТС] |
12 |
|||
Подскажите пожалуйста, а как написать так, чтобы к letters8 прибавлялось 1 при одном совпадении и прибавлялась 2 при больше двух совпадениях.
0 |
Dragokas 17991 / 7617 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
||||
04.07.2012, 02:51 |
13 |
|||
Если правильно Вас понял, общее кол-во совпадений считаем, как сумму любых совпадений значений в 3 х 3 ячеек в текущем смещении. При этом, если совпадений ровно 2, то ничего не прибавляем.
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
07.07.2012, 13:52 [ТС] |
14 |
При выполнении данного кода, у меня при 1 совпадении все правильно происходит, а при больше двух к letters8 прибавляется 5 вместо 2.
0 |
17991 / 7617 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
|
07.07.2012, 14:09 |
15 |
Так здесь добавляется сразу же, как только найдет совпадения в одном смещении. Тогда строку № 15 переместите между 8 и 9 (а № 3 удалить).
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
07.07.2012, 15:31 [ТС] |
16 |
У меня снова не выходит, теперь получается так, что при любом количестве совпадений прибавляется к letters8 значение 2, а должно, чтобы при отсутствии совпадений — не прибавляться ничего, при одном совпадении — прибавляться единица. И проблема по-моему в переменной k. Я в ячейки добавляю все разные значения, а k он мне выводит равное трем, поэтому и прибавляется все время 2 к letters8.
0 |
17991 / 7617 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
|
07.07.2012, 22:30 |
17 |
Можете выложить файл с некоторыми фрагментами цифер для теста.
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
08.07.2012, 01:15 [ТС] |
18 |
А вы можете почту написать свою? я на почту скину файл? Добавлено через 2 часа 23 минуты Добавлено через 13 минут
0 |
Dragokas 17991 / 7617 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
||||
08.07.2012, 02:03 |
19 |
|||
Да? А я — нет. Можете просветить, чтобы в следующий раз тоже знать как правильно объяснять?
Из леттерсов тоже сделал массив, так как не знал они теперь отдельно подсчитываются или складываются из всех строк. Если что поубираете массивы (скобки).
1 |
irealife 2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
||||
08.07.2012, 10:30 [ТС] |
20 |
|||
Вы в самом начале правильно мне все написали, ошибка у меня была в диапазоне: было от 0 до 150, а нужно было от 0 до 75, и в кейсах у меня он не понимал что такое Case 1, поэтому я ему указала конкретно на равенство через Case Is. И все, спасибо вам)
0 |
VBA сравнение ячеек и значений |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Gorr98 Пользователь Сообщений: 17 |
Подскажите пожалуйста, как организовать поиск на несовпадение? Прикрепленные файлы
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#2 29.06.2016 18:50:38
Не находится, так как на втором листе нет значений, которые бы отсутствовали на первом. Прикрепленные файлы
|
||
JeyCi Пользователь Сообщений: 3357 |
#3 29.06.2016 19:56:42 а что делать с дублями в 1-й таблице?
файл в папку C:1 Прикрепленные файлы
Изменено: JeyCi — 29.06.2016 20:20:29 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Мотя Пользователь Сообщений: 3218 |
#4 29.06.2016 20:43:07
1 таблица должна дополниться только новыми данными из 2 таблицы, т.е. 1 таблица может иметь кучу строк, представленных одним данным. Gorr98 ! Юрий М . Прикрепленные файлы
|
||
Gorr98 Пользователь Сообщений: 17 |
Огого! Никогда бы не подумал, что это может быть так просто, да еще и в такое маленькое количество строк! Спасибо большое, благодаря таким, как вы, чайники вроде меня черпают опыт чашками, а не ложками) Насчет кода — да, согласен, очень чудной, может потому, что основу подсмотрел, а потом попытался сам его изменить. |
Hugo Пользователь Сообщений: 23249 |
#6 30.06.2016 08:32:14
так показали бы тут код где ещё меньше строк — тот с кибера от fever brain
Только тут у него идёт сравнение обратное заказанному, но не суть.
Если данных много — добавкой rn=rn.value можно анализ перевести в массивы (только тип rn убрать). Изменено: Hugo — 30.06.2016 08:33:02 |
|||||||||
Gorr98 Пользователь Сообщений: 17 |
#7 30.06.2016 16:59:30
Юрий М, расскажите, пожалуйста, что означают приставки xl? Так и не смог разобраться. Знаю, что xlUp — это верхняя граница. Кстати, почему мы используем верхнюю границу, а не нижнюю? С нижней попробовал — не работает. Но ведь мы используем последнее значение снизу — почему тогда xlUp? Set Rng = Columns(1).Find(what:=.Cells(i, 1), LookIn:=xlFormulas, lookAt:=xlWhole) — а в этой строке такая логика, что задаем Rng первую колонку и ищем ее в первой колонке добавленного листа, верно? Если да, то what тут означает «ищем совпадение»? А что значат LookIn и lookAt? Надеюсь, что не сильно завалил вопросами |
||
Hugo Пользователь Сообщений: 23249 |
По второму вопросу — задаём не первую колонку, а задаём найти. И ищем в первой колонке что, в чём и как. А xlUp — это вверх. Вверх от в данном случае последней ячейки столбца, пока не наткнёмся на значение. Юра, я пришёл — а тебя нет… Изменено: Hugo — 30.06.2016 17:20:23 |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#9 30.06.2016 17:13:02 Всякие xl — это своего рода константы-сокращения: xlFormulas, xlWhole, xlNone, XlYesNo и т.д. Т.е. «готовые к употреблению» параметры )
what — какое значение ищем. |
||
Gorr98 Пользователь Сообщений: 17 |
О! с what, lookIn и lookAt понятно стало, а вот xlUp не совсем — выходит, да, бывают пустые ячейки, на которые xlDown наткнется и подумает, что это конец данных. Но xlUP ведь тоже должен тогда споткнуться об эту же пустую ячейку? И еще, если возможно, посоветуйте, пожалуйста, какую-нибудь литературу по vba |
Hugo Пользователь Сообщений: 23249 |
xlUP идёт снизу вверх, по пустым, он наткнётся на первую заполненную. Снизу! список этих сокращений — в редакторе жмёте F2, там всё. Изменено: Hugo — 30.06.2016 18:01:31 |
С.М. Пользователь Сообщений: 936 |
#12 30.06.2016 21:36:14 Вариант с xlDown:
Прикрепленные файлы
|
||
Перейти к основному содержанию
Статья даёт ответы на следующие вопросы:
- Как сравнить две таблицы в 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
- макросы