Сравнить текст в ячейках excel vba

Операторы сравнения чисел и строк, ссылок на объекты (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 вы можете ознакомиться в статье Знаки подстановки для шаблонов.

I would like to compare 2 cells’ value and see whether they are match or not.
I know how to do it on excel but I dont’ know how to put it vba code.

Input & output:

  1. The value of cell A1 is already in the excel.
  2. Manually enter a value in Cell B1.
  3. click on a button_click sub to see whether the value on 2 cells are the same or not.
  4. Show «Yes» or «No» on cell C1

Excel formula:

=IF(A1=B1,"yes","no")

asked Jan 21, 2015 at 15:55

pexpex223's user avatar

Give this a try:

Sub CompareCells()
    If [a1] = [b1] Then
        [c1] = "yes"
    Else
        [c1] = "no"
    End If
End Sub

Assign this code to the button.

answered Jan 21, 2015 at 15:58

Gary's Student's user avatar

Gary’s StudentGary’s Student

95.3k9 gold badges58 silver badges98 bronze badges

1

If (Range("A1").Value = Range("B1").Value) Then
    Range("C1").Value = "Yes"
Else
    Range("C1").Value = "No"
End If

Chrismas007's user avatar

Chrismas007

6,0654 gold badges23 silver badges47 bronze badges

answered Jan 21, 2015 at 16:03

Eswin's user avatar

EswinEswin

292 bronze badges

5

You can use the IIF function in VBA. It is similar to the Excel IF

[c1] = IIf([a1] = [b1], "Yes", "No")

answered Jan 21, 2015 at 16:47

Paul Kelly's user avatar

Paul KellyPaul Kelly

9057 silver badges13 bronze badges

1

Here is an on change Sub (code MUST go in the sheet module). It will only activate if you change a cell in column B.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target is Nothing Then Exit Sub
    If Target.Cells.Count > 1 Then Exit Sub
    If Target.Column <> 2 Then Exit Sub
    If Cells(Target.Row, 1).Value = Cells(Target.Row, 2).Value Then
        Cells(Target.Row, 3).Value = "Yes"
    Else
        Cells(Target.Row, 3).Value = "No"
    End If
End Sub

For the record, this doesn’t use a button, but it accomplishes your goal of calculating if the two cells are equal any time you manually enter data into cells in Col B.

answered Jan 21, 2015 at 16:08

Chrismas007's user avatar

Chrismas007Chrismas007

6,0654 gold badges23 silver badges47 bronze badges

Sub CompareandHighlight()
    Dim n As Integer
    Dim sh As Worksheets
    Dim r As Range

    n = Worksheets("Indices").Range("E:E").Cells.SpecialCells(xlCellTypeConstants).Count
    Application.ScreenUpdating = False 

    Dim match As Boolean
    Dim valE As Double
    Dim valI As Double
    Dim i As Long, j As Long

    For i = 2 To n
        valE = Worksheets("Indices").Range("E" & i).Value
        valI = Worksheets("Indices").Range("I" & i).Value

        If valE = valI Then

        Else:                           
            Worksheets("Indices").Range("E" & i).Font.Color = RGB(255, 0, 0)
        End If
    Next i

    Application.ScreenUpdating = True
End Sub

barbsan's user avatar

barbsan

3,39811 gold badges21 silver badges28 bronze badges

answered Nov 21, 2018 at 9:29

Madhushree's user avatar

0

I think you would be best served using VBA which you could then deploy as a User Defined Function (UDF)

  • hold down altf11 to go to the VBE
  • Insert … Module
  • copy and paste in the code below
  • hold down altf11 to go back to Excel

Then call the function in Excel such as
=DupeWord(A1,A2)
to find any matches between A1 and A2

enter image description here

Usr Defined Function

Function DupeWord(str1 As String, str2 As String) As String
Dim vArr1
Dim vArr2
Dim vTest
Dim lngCnt As Long
vArr1 = Split(Replace(str1, " ", vbNullString), ",")
vArr2 = Split(Replace(str2, " ", vbNullString), ",")
On Error GoTo strExit

For lngCnt = LBound(vArr1) To UBound(vArr1)
vTest = Application.Match(vArr1(lngCnt), vArr2, 0)
If Not IsError(vTest) Then DupeWord = DupeWord & vArr1(lngCnt) & ", "
Next lngCnt
If Len(DupeWord) > 0 Then
DupeWord = Left$(DupeWord, Len(DupeWord) - 2)
Else
strExit:
DupeWord = "No Matches!"
End If

End Function

Use inside VBA

Sub test()
MsgBox DupeWord("dog, cat, rabbit, mouse, lion, bear, tiger", "sausage, pickle, dog, cat, elephant, bread")
End Sub

Хитрости »

12 Апрель 2015              30620 просмотров


Сравнение текста по части предложения

Довольно часто возникает проблема сравнения двух строк(ячеек) по части текста. Если точнее — по совпадению слов. Чем больше слов в двух строках совпадает — тем больше они считаются похожими. Так, к примеру текст «Защитная пленка iPhone» и текст «Защитная пленка для Samsung GalaxyII» совпадут только на 40%, а «шла маша по шоссе» и «маша по шоссе шла» — на 100%.
Я не имею ввиду сейчас случаи вроде двух строк: «привет» и «превет». Для подобного сравнения можно написать решения различные, но скорость их выполнения как правило оставляет желать лучшего, да и точность такого сравнения тоже не на высоте, если не использовать всевозможные справочники
На деле подобная задача встречается достаточно часто и предположу, что данная статья может быть полезна очень многим. Итак, как ни жаль, но подобную задачу невозможно решить без применения Visual Basic for Applications(VBA). Решение, которое я предложу — функция пользователя. Поэтому прежде чем его использовать настоятельно рекомендую прочесть следующие статьи:

  • Что такое функция пользователя(UDF)? — обязательно
  • Почему не работает макрос? — обязательно
  • Что такое макрос и где его искать? — не помешает
  • Что такое модуль? Какие бывают модули? — не помешает

Собственно сам код функции:

Option Explicit
Option Compare Text
'---------------------------------------------------------------------------------------
' Procedure : CompareTxt
' DateTime  : 10.03.2015 22:46
' Author    : The_Prist(Щербаков Дмитрий)
'             WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
'             http://www.excel-vba.ru
' Purpose   : Сравнивает две строки по совпадению отдельных слов. Выводит процент, саму строку и номер строки
'             s1       - исходный текст(ссылка на ячейку или текст)
'             mass     - диапазон значений для сравнения с исходным текстом(ссылка на ячейку или текст)
'             sDelim   - разделитель слов в тексте. По умолчанию пробел
'             lFstLast - указатель, выводить первое или последнее подходящее совпадение.
'                        По умолчанию 0(последнее максимально совпадающее).
'                        Если указать 1 - будет выбрано первое подходящее(в котором совпадают все слова)
'             lShowAllInfo - указатель на результат. Допускается четыре значения:
'                            -1 - показывается вся информация: Процент совпадения строк, Найденное значение,
'                                 Номер строки в указанном диапазоне в которой найдено значение
'                             1 - Выводится только процент совпадения строк
'                             2 - выводится только значение
'                             3 - выводится только номер строки с найденным значением
'                             По умолчанию применяется -1(вся информация)
'             Синтаксис:
'                    =CompareTxt(A1;B1:B100)         - с разделителем по умолчанию
'                    =CompareTxt(A1;B1:B100;"-")     - с разделителем короткое тире(-)
'                    =CompareTxt(A1;B1:B100;"-";;2)  - с разделителем короткое тире(-) и выводом только значения
'---------------------------------------------------------------------------------------
Function CompareTxt(s1 As String, mass As Range, Optional sDelim As String = " ", Optional lFstLast As Long = 0, Optional lShowAllInfo As Long = -1)
    Dim as1, as2, l1 As Long, l2 As Long, lr As Long
    Dim asStr2
    Dim s As String, s2 As String, lp, lTmpCom As Long, lResCom As Long
    Dim lResR As Long, sResS As String, v
 
    as1 = Split(s1, sDelim)
    asStr2 = mass.Value
    If Not IsArray(asStr2) Then ReDim asStr2(1 To 1, 1 To 1): asStr2(1, 1) = mass.Value
 
    For lr = 1 To UBound(asStr2, 1)
        as2 = Split(asStr2(lr, 1), sDelim)
        lResCom = 0
        For l1 = LBound(as1) To UBound(as1)
            s = as1(l1)
            For l2 = LBound(as2) To UBound(as2)
                If as2(l2) = s Then
                    lResCom = lResCom + 1
                    Exit For
                End If
            Next l2
        Next l1
        If lTmpCom < lResCom Then
            lTmpCom = lResCom
            lResR = lr
            sResS = asStr2(lr, 1)
            lp = lp + 1
        End If
        If lFstLast Then
            If lTmpCom >= (UBound(as1) + 1) Then
                Exit For
            End If
        End If
    Next lr
    v = (lTmpCom / (UBound(as1) + 1)) * 100
    Select Case lShowAllInfo
    Case -1
        CompareTxt = "Процент совпадения: " & v & "; Значение: " & sResS & "; Строка в массиве mass: " & lResR
    Case 1 'только процент
        CompareTxt = v
    Case 2 'только значение строки
        CompareTxt = sResS
    Case 3 'только номер строки
        CompareTxt = lResR
    End Select
End Function

Данный код необходимо вставить в стандартный модуль книги(выше я привел ссылки на статьи, чтобы более точно понять куда и как вставить). Функция ищет указанное значение(s1) в массиве значений(mass) и выводит максимально подходящее значение. Максимально подходящее, естественно, полное совпадение — то, которое совпадает на 100%. Если же полного совпадения среди значений массива(mass) не будет найдено, то будет выведено значение с максимальным процентом совпадения. В таких случаях всегда можно указать последним аргументом(lShowAllInfo) -1 или 3, чтобы посмотреть номер строки в указанном диапазоне(mass) и сверить уже глазами подходит это значение или нет.
Синтаксис:
=CompareTxt(A1;B1:B100) — с разделителем по умолчанию
=CompareTxt(A1;B1:B100;»-«) — с разделителем короткое тире(-)
=CompareTxt(A1;B1:B100;»-«;;2) — с разделителем короткое тире(-) и выводом только значения
Аргументы:
s1 — исходный текст(ссылка на ячейку или текст)
mass — диапазон значений для сравнения с исходным текстом(ссылка на ячейку или текст)
sDelim — разделитель слов в тексте. По умолчанию пробел.
lFstLast — указатель, выводить первое или последнее подходящее совпадение. По умолчанию 0(последнее максимально совпадающее). Если указать 1 — будет выбрано первое подходящее(в котором совпадают все слова)
lShowAllInfo — указатель на результат. Допускается четыре значения:

  • -1 — показывается вся информация: Процент совпадения строк, Найденное значение, номер строки в указанном диапазоне в которой найдено значение
  • 1 — Выводится только процент совпадения строк
  • 2 — выводится только значение
  • 3 — выводится только номер строки с найденным значением. По умолчанию применяется -1(вся информация)

Ниже функция в файле с примерами использования:

  Tips_Macro_ComparePart.xls (50,5 KiB, 3 594 скачиваний)


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

 

Vadim_EC

Пользователь

Сообщений: 9
Регистрация: 09.11.2015

#1

14.11.2015 12:51:00

Доброго времени суток.
Прошу вас подсказать. Нужно сравнить две строки на условие полного соответствия.
Пробовал:

Код
If КОММЕНТАРИЙ=ЗНАЧЕНИЕ_ИСКОМОГО_КОММЕНТАРИЯ Then

не получилось.

Код VBA 13-я строка:

Код
Function АДСС_ЯЧ_С_КОМ_ВЕРСИЯ_ДЛЯ_ВОПРОСА(ЗНАЧЕНИЕ_ИСКОМОГО_КОММЕНТАРИЯ As String, ИМЯ_ЛИСТА As String)
'ВОЗВРАЩАЕТ АДРЕС ЯЧЕЙКИ С ИСКОМЫМ КОММЕНТАРИЕМ НА НУЖНОМ ЛИСТЕ
Application.Volatile True 'АВТОМАТИЧЕСКОЕ ОБНОВЛЕНИЕ РЕЗУЛЬТАТОВ
Dim ЛИСТ As Worksheet
Dim ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ
Dim КОММЕНТАРИЙ As String
Set ЛИСТ = Worksheets(ИМЯ_ЛИСТА)
On Error Resume Next
For Each ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ In Worksheets(ЛИСТ.Name).UsedRange
'ЦИКЛ ПРОВЕРКИ КОММЕНТАРИЯ КАЖДОЙ ЯЧЕЙКИ В РАБОЧЕЙ ОБЛАСТИ
КОММЕНТАРИЙ = ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ.Comment.Text
If Err.Number = 0 Then
If InStr(1, КОММЕНТАРИЙ, ЗНАЧЕНИЕ_ИСКОМОГО_КОММЕНТАРИЯ, vbTextCompare) <> 0 Then АДСС_ЯЧ_С_КОМ_ВЕРСИЯ_ДЛЯ_ВОПРОСА = ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ.Address
Else
Err.Clear
End If
Next
End Function

Изменено: Vadim_EC14.11.2015 12:53:02

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#2

14.11.2015 12:56:50

Код
Option Compare Binary

и/или

Код
strcomp()

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

МВТ

Пользователь

Сообщений: 1198
Регистрация: 01.02.2015

#3

14.11.2015 13:00:49

А откуда у Вас должна ошибка взяться при присвоении текстовой переменной значения другой текстовой переменной

Код
КОММЕНТАРИЙ = ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ.Comment.Text

В крайнем случае, результатом будет пустая строка. Попробуйте так

Код
If ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ.Comment.Text <> "" Then _
If InStr(1, КОММЕНТАРИЙ, ЗНАЧЕНИЕ_ИСКОМОГО_КОММЕНТАРИЯ, vbTextCompare) <> 0 Then _
    АДСС_ЯЧ_С_КОМ_ВЕРСИЯ_ДЛЯ_ВОПРОСА = ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ.Address

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

С виду код рабочий. Вероятно строки реально не равны. Проверьте, записав значения каждой строки в ячейку. Скорее всего где-то лишний пробел или другие символы отличаются. Например где-то «а» русская, а где-то английская. С виду одинаковые, а на деле отличаются.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

МВТ

Пользователь

Сообщений: 1198
Регистрация: 01.02.2015

#5

14.11.2015 13:05:16

Насчет ошибки был неправ, понял, что не во всех ячейках есть комменты. Тогда проверять

Код
If Not .Comment Is Nothing Then 
 

Vadim_EC

Пользователь

Сообщений: 9
Регистрация: 09.11.2015

#6

14.11.2015 13:26:34

Спасибо большое!
Код сработал с StrComp, и с «=»

Код
Function АДСС_ЯЧ_С_КОМ_ВЕРСИЯ_ДЛЯ_ВОПРОСА2(ЗНАЧЕНИЕ_ИСКОМОГО_КОММЕНТАРИЯ As String, ИМЯ_ЛИСТА As String)
'ВОЗВРАЩАЕТ АДРЕС ЯЧЕЙКИ С ИСКОМЫМ КОММЕНТАРИЕМ НА НУЖНОМ ЛИСТЕ
Application.Volatile True 'АВТОМАТИЧЕСКОЕ ОБНОВЛЕНИЕ РЕЗУЛЬТАТОВ
Dim ЛИСТ As Worksheet
Dim ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ
Dim КОММЕНТАРИЙ As String
Set ЛИСТ = Worksheets(ИМЯ_ЛИСТА)
On Error Resume Next
For Each ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ In Worksheets(ЛИСТ.Name).UsedRange
'ЦИКЛ ПРОВЕРКИ КОММЕНТАРИЯ КАЖДОЙ ЯЧЕЙКИ В РАБОЧЕЙ ОБЛАСТИ
КОММЕНТАРИЙ = ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ.Comment.Text
If Err.Number = 0 Then
If StrComp(КОММЕНТАРИЙ, ЗНАЧЕНИЕ_ИСКОМОГО_КОММЕНТАРИЯ) = 0 Then АДСС_ЯЧ_С_КОМ_ВЕРСИЯ_ДЛЯ_ВОПРОСА2 = ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ.Address
Else
Err.Clear
End If
Next
End Function

и

Код
Function АДСС_ЯЧ_С_КОМ_ВЕРСИЯ_ДЛЯ_ВОПРОСА3(ЗНАЧЕНИЕ_ИСКОМОГО_КОММЕНТАРИЯ As String, ИМЯ_ЛИСТА As String)
'ВОЗВРАЩАЕТ АДРЕС ЯЧЕЙКИ С ИСКОМЫМ КОММЕНТАРИЕМ НА НУЖНОМ ЛИСТЕ
Application.Volatile True 'АВТОМАТИЧЕСКОЕ ОБНОВЛЕНИЕ РЕЗУЛЬТАТОВ
Dim ЛИСТ As Worksheet
Dim ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ
Dim КОММЕНТАРИЙ As String
Set ЛИСТ = Worksheets(ИМЯ_ЛИСТА)
On Error Resume Next
For Each ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ In Worksheets(ЛИСТ.Name).UsedRange
'ЦИКЛ ПРОВЕРКИ КОММЕНТАРИЯ КАЖДОЙ ЯЧЕЙКИ В РАБОЧЕЙ ОБЛАСТИ
КОММЕНТАРИЙ = ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ.Comment.Text
If Err.Number = 0 Then
If КОММЕНТАРИЙ = ЗНАЧЕНИЕ_ИСКОМОГО_КОММЕНТАРИЯ Then АДСС_ЯЧ_С_КОМ_ВЕРСИЯ_ДЛЯ_ВОПРОСА3 = ЯЧЕЙКА_РАБОЧЕЙ_ОБЛАСТИ.Address
Else
Err.Clear
End If
Next
End Function

Просто значение комментария было с новой строкой, а в ячейке было только значение текста.

Изменено: Vadim_EC14.11.2015 13:34:40

Понравилась статья? Поделить с друзьями:
  • Сравнить ячейки excel макрос
  • Сравнить таблицы в excel условное форматирование
  • Сравнить фио в двух столбцах excel
  • Сравнить таблиц в word
  • Сравнить фамилии в списке excel