Сравнение значений в ячейках excel vba

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

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

wtftaekwondo

0 / 0 / 0

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

Сообщений: 15

1

06.09.2019, 16:26. Показов 12374. Ответов 10

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


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

Всем привет!
Стоит задача, чтобы сравнить две ячейки на содержимое: если в 1 ячейке имеется слово из другой ячейки, то необходимо справа от него записать это слово.
У меня получается решение данной задачи, если сравнивать , образно, 500 строк с одним словом и записывать его, если оно есть.
Однако мне требуется сравнить 500 строк с 50 словами и , в случае совпадения, записать это слово.
Вот пример успешного решения для 1 слова — «Труба».
Необходимо, чтобы InStr сравнивал ячейку не со словом «Труба», а с массивом «Celevye» в котором я запишу необходимые для присвоения слова.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub reshen()
    Dim i As Integer
    Dim value As String
    Dim Celevye As Variant
    Dim TotalRows As Long
    Dim N As Integer
    TotalRows = Rows(Rows.Count).End(xlUp).Row
    Celevye = Array("Труба", "Гвоздь")
    N = 500
    Z = 50
            For j = 1 To Z
                For i = 1 To N
                    If InStr(1, Cells(i, 2), "Труба") <> 0 Then
                    Cells(i, 3) = "Труба"
                End If
                Next i
            Next j
End Sub



0



4131 / 2235 / 940

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

Сообщений: 4,624

06.09.2019, 17:34

2

wtftaekwondo, Как говорится, меньше слов, а больше дел В общем, лучше приложите небольшой фрагмент таблиц, 1) что есть и 2) что должно получиться, после выполнения макроса.



0



0 / 0 / 0

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

Сообщений: 15

06.09.2019, 17:56

 [ТС]

3

Хорошо. Вот две фотографии (пример).
Под колонкой F написаны слова, которые должны находиться в колонке «B».
В случае, если это слово содержится в ячейке, то справа оно должно записаться.

Миниатюры

Сравнение значений ячеек в Excel
 

Сравнение значений ячеек в Excel
 



0



4131 / 2235 / 940

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

Сообщений: 4,624

06.09.2019, 18:06

4

Имелся ввиду, разумеется, xls(x) файл, чтобы не вводить исходные данные, а тестировать макрос сразу.

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



0



0 / 0 / 0

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

Сообщений: 15

06.09.2019, 18:18

 [ТС]

5

За последние 2 строки извиняюсь, это идеальный вариант, которые уже обрабатывается вручную.
Необходимо просто получить «Направляющая».
Просто хотел побыстрее скинуть AS IS и TO BE поэтому не проверил.
Суть в том, чтобы третий столбец принял одно из значений массива из целевых слов (в моем примере их 3 слова).



0



4131 / 2235 / 940

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

Сообщений: 4,624

06.09.2019, 18:33

6

Вариант с помощью формулу подойдёт ?

Код

=ИНДЕКС($F$1:$F$3;ПОИСКПОЗ(1;(СЧЁТЕСЛИ(B1;$F$1:$F$3&"*"));0))



1



0 / 0 / 0

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

Сообщений: 15

06.09.2019, 18:45

 [ТС]

7

В целом тоже подойдет, спасибо)
Но если кто-то сталкивался с макросами и ему это будет знакомо, то хотелось бы еще и в VBA сделать.



0



pashulka

4131 / 2235 / 940

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

Сообщений: 4,624

06.09.2019, 21:31

8

Лучший ответ Сообщение было отмечено wtftaekwondo как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Test()
    Dim a1, a2, t, i1&, i2&
    a1 = Range("B1", Cells(Rows.Count, "B").End(xlUp)).Value
    a2 = Range("F1:F3").Value
    For i1 = 1 To UBound(a1)
        t = a1(i1, 1): a1(i1, 1) = Empty
        For i2 = 1 To 3
            If InStr(1, t, a2(i2, 1), vbTextCompare) = 1 Then
               a1(i1, 1) = a2(i2, 1)
               Exit For
            End If
        Next
    Next
    Range("C1").Resize(i1 - 1) = a1
End Sub

Или просто программно ввести вышеопубликованную формулу
правда в той формуле наличествуют лишние(ненужные) скобки для счётесли

Альтернативные варианты

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub Test2v1()
    Dim a1, a2, t, i&
    a1 = Range("B1", Cells(Rows.Count, "B").End(xlUp)).Value
    a2 = Range("F1:F3").Value
    For i = 1 To UBound(a1)
        t = Split(a1(i, 1))(0): a1(i, 1) = Empty
        If Not IsError( _
        Application.Match(t, a2, 0)) Then a1(i, 1) = t
    Next
    Range("C1").Resize(i - 1) = a1
End Sub
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Test2v2()
    Dim r As Range, a, t, i&
    a = Range("B1", Cells(Rows.Count, "B").End(xlUp)).Value
    Set r = Range("F1:F3")
    For i = 1 To UBound(a)
        t = Split(a(i, 1))(0): a(i, 1) = Empty
        If Application.CountIf(r, t) > 0 Then a(i, 1) = t
    Next
    Range("C1").Resize(i - 1) = a
End Sub



1



wtftaekwondo

0 / 0 / 0

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

Сообщений: 15

09.09.2019, 12:16

 [ТС]

9

Если не сложно, то сможете прокомментировать или объяснить данные строки:

Visual Basic
1
2
3
t = Split(a(i, 1))(0): a(i, 1) = Empty
If Application.CountIf(r, t) > 0 Then a(i, 1) = t
Range("C1").Resize(i - 1) = a



0



4131 / 2235 / 940

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

Сообщений: 4,624

09.09.2019, 13:01

10

получаем первое слово(слово=любой набор символов): «очищаем» элемент массива
countif та же функция рабочего листа счётесли
заполняем диапазон, начиная с ячейки C1 и закачивая C & i-1 (в данном конкретном случае, можно написать «C1:C» & i-1) элементами массива a

пользуйтесь клавишей F1



0



0 / 0 / 0

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

Сообщений: 21

13.09.2019, 13:51

11

Много вариантов, конечно



0



If I understand your problem correctly, the following code should allow you to do what you want. Within the code, you select the range you wish to process; the first column of each data set, and the number of columns within each data set.

It does assume only two data sets, as you wrote, although that could be expanded. And there are ways of automatically determining the dataset columns, if there is no other data in between.

Option Explicit
Option Base 0
Sub RemoveDups()
    Dim I As Long, J As Long
    Dim rRng As Range
    Dim vRng As Variant, vRes() As Variant
    Dim bRng() As Boolean
    Dim aColumns, lColumns As Long
    Dim colRowsDelete As Collection

'vRng to include from first to last column to be tested
Set rRng = Range("f1", Cells(Rows.Count, "F").End(xlUp)).Resize(columnsize:=100)
vRng = rRng
ReDim bRng(1 To UBound(vRng))

'columns to be tested
'Specify First column of each data set
aColumns = Array(1, 13)

'num columns in each data set
lColumns = 3

For I = 1 To UBound(vRng)
    bRng(I) = vRng(I, aColumns(0)) = vRng(I, aColumns(1))
    For J = 1 To lColumns - 1
        bRng(I) = bRng(I) And (vRng(I, aColumns(0) + J) = vRng(I, aColumns(1) + J))
    Next J
Next I

'Rows to Delete
Set colRowsDelete = New Collection
For I = 1 To UBound(bRng)
    If bRng(I) = True Then colRowsDelete.Add Item:=I
Next I

'Delete the rows
If colRowsDelete.Count > 0 Then
Application.ScreenUpdating = False
    For I = colRowsDelete.Count To 1 Step -1
        rRng.Rows(colRowsDelete.Item(I)).EntireRow.Delete
    Next I
End If
Application.ScreenUpdating = True
End Sub

VBA сравнение ячеек и значений

AxelTT

Дата: Пятница, 14.10.2016, 01:27 |
Сообщение № 1

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

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

Сообщений: 6


Репутация:

0

±

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


Excel 2013

Не могу реализовать VBA сравнение

Есть данные :
1) Столбец из 100-400 ячеек в каждой ячейке находится 16значный алфавитно-цифровой номер.
Например :
DAX2009855855555
AUC2009849066666

2) Каждому номер нужно едино разово присвоить значение
Например :
DAX2009855855555 это = « ручные весы v23 »
AUC2009849066666 это = « самовар v3 »

Каждый день я получаю номера из 100- 400 ячеек и нужно что бы их проверило на то значение что я им присвоил п.2. И вывело список товара, а если значение не присвоено в п.2, то что бы выводилась надпись например NEW, и по возможности что бы список товара выводился в те же ячейке в которых находился 16ти значный код.

Думаю что это возможно сделать на VBA в Excel, но к сожалению мои познания не позволяют это сделать.

Помогите пожалуйста!

 

Ответить

Pelena

Дата: Пятница, 14.10.2016, 08:50 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Файл с примером помог бы в понимании задачи


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Hugo

Дата: Пятница, 14.10.2016, 08:50 |
Сообщение № 3

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

Это можно сделать с помощью функций листа ВПР() и ЕСЛИ() и чуть поработать руками, если нужно (копирование-спецвставка).


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

AxelTT

Дата: Пятница, 14.10.2016, 10:28 |
Сообщение № 4

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

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

Сообщений: 6


Репутация:

0

±

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


Excel 2013

Рабочий файлик который каждый день приходит с новыми номерами называется TMP V1.xlsx
Номера с которыми работать в столбце К

Ну и собственно база товара в файлике BD.xlsx может быть эту базу можно как то разместить внутри кода VBA?

Задача что бы сравнило код в ячейках столбца К с БД и вставило в ячейки столбца К данные с БД

На данном уровне для меня эта задача не выполнима, помогите пожалуйста

 

Ответить

Manyasha

Дата: Пятница, 14.10.2016, 11:41 |
Сообщение № 5

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

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


Excel 2010, 2016

AxelTT, так подойдет?
[vba]

Код

Sub compareData()
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .DisplayAlerts = False
    End With
    Dim i&, newWB As Workbook, dic As Object
    Set dic = CreateObject(«scripting.dictionary»)
    With ThisWorkbook.Sheets(1)
        For i = 5 To .Cells(Rows.Count, «d»).End(xlUp).Row
            dic(Trim(.Cells(i, «d»))) = .Cells(i, «f»)
        Next i
    End With
    Set newWB = Workbooks.Open(ThisWorkbook.Path & «TMP_V1.xlsx»)
    With newWB.Sheets(1)
        For i = 7 To .Cells(Rows.Count, «k»).End(xlUp).Row
            If dic.exists(Trim(.Cells(i, «k»))) Then
                .Cells(i, «k») = dic(Trim(.Cells(i, «k»)))
            Else
                .Cells(i, «k») = «New»
            End If
        Next i
    End With
    newWB.Save
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .DisplayAlerts = True
    End With
End Sub

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

AxelTT

Дата: Пятница, 14.10.2016, 15:39 |
Сообщение № 6

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

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

Сообщений: 6


Репутация:

0

±

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


Excel 2013

Manyasha,

спасибочки, буду разбираться

 

Ответить

Hugo

Дата: Пятница, 14.10.2016, 15:50 |
Сообщение № 7

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

Manyasha, тут точки не хватает перед Rows:
[vba]

Код

With ThisWorkbook.Sheets(1)
        For i = 5 To .Cells(Rows.Count,

[/vba]
т.к. в такой комбинации условий ThisWorkbook и активная книга могут быть из разных поколений, что иногда может привести к браку в работе.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

AxelTT

Дата: Пятница, 14.10.2016, 16:19 |
Сообщение № 8

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

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

Сообщений: 6


Репутация:

0

±

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


Excel 2013

Странно, при первом нажатии на кнопку Сравнение вроде все ОК, но если нажать повторно на Сравнение то все ячейки К принимают значение NEW.
Это только у меня так? %)

 

Ответить

Manyasha

Дата: Пятница, 14.10.2016, 16:32 |
Сообщение № 9

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

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


Excel 2010, 2016

Hugo, Вы правы, я 2003-м не пользуюсь (да и на работе таких нет), поэтому допускаю такую запись)

AxelTT,

Задача что бы сравнило код в ячейках столбца К с БД и вставило в ячейки столбца К данные с БД

после запуска макроса, данные в столбце К уже не являются кодом.
Можно проставлять код в соседний столбец:
[vba]

Код

    With newWB.Sheets(1)
        For i = 7 To .Cells(Rows.Count, «k»).End(xlUp).Row
            If dic.exists(Trim(.Cells(i, «k»))) Then
                .Cells(i, «l») = dic(Trim(.Cells(i, «k»)))’код пишем в столбец L
            Else
                .Cells(i, «l») = «New»
            End If
        Next i
    End With

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

AxelTT

Дата: Пятница, 14.10.2016, 17:14 |
Сообщение № 10

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

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

Сообщений: 6


Репутация:

0

±

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


Excel 2013

Manyasha,
ну может быть можно как то придумать что бы при повторном нажатии оно не менялось на NEW плизз плизз hands respect

 

Ответить

Manyasha

Дата: Пятница, 14.10.2016, 21:45 |
Сообщение № 11

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

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


Excel 2010, 2016

AxelTT,
[vba]

Код

Sub compareData()
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .DisplayAlerts = False
    End With
    Dim i&, newWB As Workbook, dic As Object, j
    Set dic = CreateObject(«scripting.dictionary»)
    With ThisWorkbook.Sheets(1)
        For i = 5 To .Cells(Rows.Count, «d»).End(xlUp).Row
            For Each j In Array(4, 6) ‘столбцы D и F
                dic(Trim(.Cells(i, j))) = .Cells(i, «f»)
            Next j
        Next i
    End With
    Set newWB = Workbooks.Open(ThisWorkbook.Path & «TMP_V1.xlsx»)
    With newWB.Sheets(1)
        For i = 7 To .Cells(Rows.Count, «k»).End(xlUp).Row
            If dic.exists(Trim(.Cells(i, «k»))) Then
                .Cells(i, «k») = dic(Trim(.Cells(i, «k»)))
            Else
                .Cells(i, «k») = «New»
            End If
        Next i
    End With
    newWB.Save
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .DisplayAlerts = True
    End With
End Sub

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

AxelTT

Дата: Суббота, 15.10.2016, 00:15 |
Сообщение № 12

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

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

Сообщений: 6


Репутация:

0

±

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


Excel 2013

Manyasha,
ВОЛШЕБНИЦА!!! hands hands hands БОЛЬШОЕ СПАСИБО!!! respect respect respect оч хочется тебя отблагодарить!

 

Ответить

 

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, но я не знаю, как написать код vba.

Ввод и вывод:

  1. Значение ячейки A1 уже находится в Excel.
  2. Вручную введите значение в ячейку B1.
  3. щелкните подпункт button_click, чтобы увидеть, совпадают ли значения в 2 ячейках или нет.
  4. Показать «Да» или «Нет» в ячейке C1

Формула Excel:

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

5 ответов

Лучший ответ

Вы можете использовать функцию IIF в VBA. Он похож на Excel IF

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


0

Paul Kelly
21 Янв 2015 в 16:47

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


0

barbsan
21 Ноя 2018 в 09:46

Вот подписка на изменение (код ДОЛЖЕН находиться в модуле листа). Он активируется, только если вы измените ячейку в столбце 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

Для записи здесь не используется кнопка, но достигается ваша цель — вычислить, равны ли две ячейки каждый раз, когда вы вручную вводите данные в ячейки в столбце B.


0

Chrismas007
21 Янв 2015 в 16:08

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


2

Chrismas007
21 Янв 2015 в 19:09

Дайте это попробовать:

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

Назначьте этот код кнопке.


4

Gary’s Student
21 Янв 2015 в 15:58

Like this post? Please share to your friends:
  • Сравнение значений в столбцах таблицы excel
  • Сравнение значений в разных таблицах excel
  • Сравнение значений в excel макросы
  • Сравнение документов в word не работает
  • Сравнение документов в word 2007