Vba excel если в тексте есть слово

Вы пробуете сделать выбор из того, что выбора не имеет. Т.е., если бы Вы проверяли только наличие слова «Форум1», тогда применение Select Case было бы оправданным, например

Visual Basic
1
2
3
4
5
6
7
8
Select Case InStr(1, Cells(i, 1).Value, "Форум1",vbTextCompare)
     Case is = 1 ' "Форум1" - первое слово фразы
           '(какие-то действия)
     Case is = 0 ' "Форум1" отсутствует 
           '(какие-то действия)
     Case is>1 ' "Форум1" находится в середине фразы      
           '(какие-то действия)
End select

В Вашем случае Вы ищете три разных выражения, и тогда лучьше использовать что-то другое, как подсказывает, например, Pavel55.
И все-таки желательно применять .Value, vbTextCompare (vbBinaryCompare)

Добавлено через 4 часа 19 минут
Давайте тогда добьем строковую функцию instr() до конца.
Никогда не возникала у меня подобная ситуация, но не так давно участник форума Скрипт посоветовал применить Instr() совместно с функцией, к примеру, Ucase() — тоже строковая фукция. И буквально на следующий день…. Поэтому и Вам передаю его совет. Все-таки лучьше застраховаться и писать в функции следующим образом (или что-то подобное):

Visual Basic
1
InStr(1, Ucase(Cells(i, 1).Value), Ucase("Форум1"),vbTextCompare)

Что б понять, прогоните где-то в модуле выражение:

Visual Basic
1
2
3
Dim mStr$
    mstr="Форум1"
    Debug.Print Ucase(mstr) ' Ctrl + G. Можно еще Ucase("Форум1"), или Ucase(Trim(Cells(i,1).value))

При этом, сами значения mStr и cells(i,1).value изменится только в момент (и на момент) применения ф-ции InStr для сравнения. Но это не панацэя!
Удачи.

 

Tanya15

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

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

Здравствуйте, подскажите, пожалуйста, как правильно прописать код VBA.
Необходимо в диапазоне текстовых ячеек найти ячейки которые содержат слово, например «яблоко». Т.е. есть ячейки с текстом «зеленое яблоко», «красное яблоко», «яблоко» и тд, необходимо, что бы он нашел всех их.

 

V

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

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

и что дальше с этим делать будете?
как вариант таблицу загнать в массив и циклом перебирать .

 

Пытливый

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

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

Варианты: Воспользоваться методом Find для диапазона. Вопрос — что дальше с ними делать надо? :)

upd V, опередил с вопросом! :)

Кому решение нужно — тот пример и рисует.

 

Nordheim

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

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

#4

02.02.2018 11:12:01

Код
Sub test()
Dim i&, iCnt1&, iCnt2&, arr()
'1 вариант поиск на листе
For i = 1 To 100
    If UCase(Cells(i, 1).Value) Like UCase("яблоко") Then iCnt1 = iCnt1 + 1
Next i
'2 вариант поиск в массиве
arr = Range([a1], [a100]).Value
For i = 1 To 100
    If UCase(arr(i, 1)) Like UCase("яблоко") Then iCnt2 = iCnt2 + 1
Next i
'итог
MsgBox "На листе " & iCnt1 & "  ябл." & vbLf & "В массиве " & iCnt2 & " ябл."
End Sub

Изменено: Nordheim02.02.2018 11:13:37

«Все гениальное просто, а все простое гениально!!!»

 

Tanya15

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

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

Мой пример

Sub Кнопка2_Щелчок()
Dim i As Single, j As Single, s As Single
s = 0
For i = 2 To 6
For j = 1 To 6

If Cells(i, j) = «яблоко» Then
s = s + Cells(i, j + 1)
End If
Next j
Cells(i, 7) = s
s = 0
Next i

End Sub

итого
яблоко 1 арбуз 25 яблоко 25 26
апельсин 2 апельсин 26 арбуз 14 0
зеленое яблоко 3 яблоко 24 вишня 86 24
яблоко арбуз 4 апельсин 28 зеленое яблоко 92 0
красное яблоко 5 красное яблоко 33 апельсин 32 0

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

Изменено: Tanya1502.02.2018 12:10:19

 

Казанский

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

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

#6

02.02.2018 12:13:03

Tanya15,

Код
If Cells(i, j) like "*яблоко*" Then 
 

Tanya15

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

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

Все так просто :(  Спасибо!

 

Nordheim

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

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

#8

02.02.2018 12:17:43

под ваш пример.

Код
Sub test()
Dim i&, iCnt1&, iCnt2&, arr(), ikey
'1 вариант
For Each ikey In ActiveSheet.UsedRange
    If UCase(ikey.Value) Like UCase("*яблоко*") Then iCnt1 = ikey(1, 2) + iCnt1
Next ikey
MsgBox "На листе " & iCnt1 & "  ябл."
End Sub

Изменено: Nordheim02.02.2018 12:20:58

«Все гениальное просто, а все простое гениально!!!»

В VBA для этих целей есть функция InStr. Используется как

InStr([start,] string1, string2[, compare])

где start — необязательный параметр, указывающий начальную позицию для поиска (по умолчанию с первого символа)
string1 — строка, в которой осуществляется поиск
string2 — искомая строка
compare — необязательный параметр, указывающий метод сравнения (бинарное, текстовое или сравнение информации в базах данных (только для Access)). По умолчанию используется бинарное сравнение.

Возвращаемые значения функции:
NULL — если любая из строк NULL,
0 — если string1 пустая строка либо string2 не найдена, либо start больше длины строки string1,
start — если string2 пустая строка,
если строка string2 найдена внутри строки string1, то возвращает позицию, в которой найдено совпадение.

Пример использования

Function contains(string1 As String, string2 As String, Optional start As Integer = 1, _
        Optional compare As VbCompareMethod = vbTextCompare) As Boolean
    ' функция проверки вхождения строки string2 в строку string1 без учёта регистра  
    ' если string2 - пустая строка, то возвращается False
    Dim findPosition As Integer

    contains = False
    findPosition = InStr(start, string1, string2, compare)
    If Len(string2) > 0 And findPosition >= start Then contains = True
End Function

Sub test()
    Dim str1 As String, str2 As String
    Dim start As Integer

    str1 = "absqwerty"
    str2 = "qwer"
    MsgBox contains(str1, str2)
End Sub

I want to check a range of cells for a certain piece of text. This text is always in my document, except it’s cell is variable (column is always B). So I check a range from 1:75 whether any cells contain a piece of text, but it doesn’t seem to work.

Dim FoundRange As Range
Set FoundRange = Cells.Find("5/7 binnen 4h")
Range("I" & EmptyCell + 2).Value = ... (value of cell I on same row as B)

Cell I’m looking for always contains this text Onderhoud 5/7 binnen 4h but its position can vary, that’s why I just need to check whether it contains any of it. When I find that cell, I need the value I on the same row.

Any suggestions are welcome!

Community's user avatar

asked Feb 23, 2012 at 16:13

CustomX's user avatar

2

Could you not just search for the substring?

Sheet1.Cells.Find("string to find")

Will return the a range containing the string (or nothing if the string can’t be found.

For example

Public Sub Macro1()
Dim FoundRange As Range

Set FoundRange = Sheet1.Cells.Find("5/7 binnen 4h")

' display the cell address to the user
MsgBox FoundRange.Address


' put the found value in column i in the same row as the found text in a known location ($C$1 in this case)
Sheet1.Range("$C$1").Value = Sheet1.Cells(FoundRange.Row, 9).Value

' put the found value in four columns to the right in the same row as the found text in a known location ($C$1 in this case)
Sheet1.Range("$C$2").Value = FoundRange.Offset(0, 4).Value

End Sub

answered Feb 23, 2012 at 16:26

Steve Homer's user avatar

Steve HomerSteve Homer

3,8272 gold badges21 silver badges40 bronze badges

9

This is too much to fit into a comment, so posting it as an answer…

You should be careful when using Find() with just a single argument: if you’ve previously used Find() in your code and (eg) specified an argument lookat:=xlWhole then you may not get the results you expect, particularly if you’re looking for a substring of a cell’s value. Settings passed to Find() are persistent: if you don’t specify an argument then it may be carried over from the previous use.

As an example (working with a sheet containing the text «hello tom» in B4:

Sub Tester()

    Dim f

    Set f = ActiveSheet.Cells.Find(what:="tom", lookat:=xlPart)
    Report f

    Set f = ActiveSheet.Cells.Find(what:="tom", lookat:=xlWhole)
    Report f

    Set f = ActiveSheet.Cells.Find("tom")
    Report f

End Sub

Sub Report(f)
    If Not f Is Nothing Then
        Debug.Print f.Address
    Else
        Debug.Print "not found"
    End If
End Sub

Running this gives:

$B$4
not found
not found

I seem to recall this is also the case if you’ve used Find() «manually» and then use it in code later in the same session (didn’t test though).

answered Feb 23, 2012 at 17:24

Tim Williams's user avatar

Tim WilliamsTim Williams

150k8 gold badges96 silver badges124 bronze badges

2

Поиск ячеек, содержащих определенное слова (VBA)

​Смотрите также​​ открытого файла.​200?’200px’:»+(this.scrollHeight+5)+’px’);»>=ЕСЛИ(ЕНД(ПОИСКПОЗ(1;—ЕЧИСЛО(ПОИСК({«Дефектоскопист»:»Электрогазосварщик»:»Электросварщик»};B2));0));»»;»+ретик»)​ = 7 To​
​ Split(Mid(adr, 2, 1000))​ занят.​Alex77755​в этом прайсе​ справки) For Each​Dim iWord As​ 400, что там​ я видимо слишком​ сделать — 20х20​alucard91​ ячейки — 10;​

​ в макросе. Я​​ Single​Tanya15​Вот код, но​
​AlexM​ i1 For i​Vlad999​yl3d​

​: Можно как-нибудь так.​​ беру цену D8​ c In [A1:C5]​ Variant, iSource As​ в строке -​ много хочу от​:)
​ в словарь с​: VBA для Excel.​:)

​ «AN185» — 5.​​ пыталась сделать через​s = 0​: Здравствуйте, подскажите, пожалуйста,​ думаю вам он​:​ = 1 To​: 1. уберите скобки​: Vlad999 , ясно​Развивать дальше фильтры​вставляю в базу​ ‘ If c.Font.Name​ Range, iCell As​ непонятно (может там​ экселя))​ столбцом, split ячейки,​Массив ключевых слов​ ИНАЧЕ во всех​ Formula.R1C1 и Index​For i =​ как правильно прописать​ ничем не поможет,​китин​ 4 .Pattern =​ у ms​Vlad999​ и условия​ H43​ Like «Cour*» Then​

​ Range iWord =​​ слов в пару​
​Но начальная проблема​
​ перебор этого массива,​ и специфика текста​ других случаях -​ Match, но насколько​
​ 2 To 6​
​ код VBA.​ т.к. вставляет полностью​
​, зачем ПОИСКПОЗ()​ «s?передачаs» If .test(Range(«A»​
​Dim ms2. замените​:​
​yl3d​________________​ ‘ c.Font.Name =​
​ Replace([A1], » «,​
​ раз больше).​
​ решена, вопрос закрыт,​ проверка по словарю,​
​ в ячейке исключает​
​ 6.67.​
​ я поняла RC​
​For j =​Необходимо в диапазоне​ весь файл.​
​200?’200px’:»+(this.scrollHeight+5)+’px’);»>=ЕСЛИ(ИЛИ(ЕЧИСЛО(ПОИСК({«Дефектоскопист»:»Электрогазосварщик»:»Электросварщик»};B2)));»+ретик»;»»)​ & j).Offset(, i).Value)​ часть кода, это​yl3d​: Добрый вечер, специалисты​но из производителей​ «Times New Roman»​ «-«, , 1)​

​Да и вообще​​ всем спасибо!​ выполнение макроса, выход.​ одновременное упоминание двух​

​Я сделал эту​​ не может искать​:(​ 1 To 6​

​ текстовых ячеек найти​​Sub find Set​
​китин​ Then Range(«K» &​ еще одна проверка​, результат записывать в​ по экселю.​ штук 20​ If c Like​ ‘: iWord =​ где это всё…​Hugo121​Т.к. так и​ ключей.​ формулу, но она​

planetaexcel.ru

поиск части текста макрос VBA

​ часть текста из​​If Cells(i, j)​ ячейки которые содержат​
​ imprng =activecell Open​:​ j) = «Есть»​ если искомое не​ одну ячейку или​Помогите разобраться с​артикулов десятки тысяч,​ «*» & pomenat​ Replace(iWord, «.», «»)​ может там вообще​: Да что там​ не сказали что​Так что возможно​ работает некорректно…​ ячейки. Есть ли​ = «яблоко» Then​ слово, например «яблоко».​ «файл» for input​AlexM​ Exit For Else​ найдено.​ один адрес -​
​ проблемой.​описания каждый придумывает​
​ & «*» Then​ Set iSource =​

​ нигде ни одного​​ сложного — добавить​

​ за таблица и​​ лишь одно совпадение​ЕСЛИ(ЕОШИБКА(ПОИСК(«AN85A «;B38;1));10;ЕСЛИ(ЕОШИБКА(ПОИСК(«AN185A»;B38;1));5;6.67))​ какие-нибудь другие варианты​s = s​ Т.е. есть ячейки​ as #1 Do​,​ Range(«K» & j)​If adr <>​ одна ячейка?​В книге несколько​ в своем формате​ c.Font.Name = «Times​ [AG2:BE14] For Each​ привычного пробела нет​ пробелы по концам,​ ячейка — только​ -> один макрос.​Sh_Alex​ решения этого вопроса?​ + Cells(i, j​ с текстом «зеленое​ until eof(1) Line​просто ПОИСК не​ = «Нет» End​

​ «» Then ms​​проверяйте​ листов.​ в какой колонке​ New Roman» End​ iWord In Split(iWord,​ Хотя раз код​ чтоб находить слова​ алгоритм.​Спасибо.​: Вот так будет​Может кто-то уже​ + 1)​ яблоко», «красное яблоко»,​

​ input #1, text​​ работал, а до​

planetaexcel.ru

Поиск куска текста в ячейке

​ If Next i,​​ = Split(Mid(adr, 2,​Sub vvv() Dim​На листах 1,2,3,4​ какую инфу писать​ If Nextили​ «-«) Set iCell​ отработал — значит​ целиком…​alucard91​pashulka​ правильно: =ЕСЛИ(ЕОШИБКА(ПОИСК(«AN85A»;A1));ЕСЛИ(ЕОШИБКА(ПОИСК(«AN185A»;A1));6.67;5);10)​ сталкивался?​
​End If​ «яблоко» и тд,​ Sheets(«Лист1»).Select Range(«A5»).Select activeCell​
​ ИЛИ мозгов не​

​ j End With​​ 1000)) Cells(i, 5).Resize(,​ Ws As Worksheet,​
​ в некоторых ячейках​

​Не могу найти​​InStr​ = iSource.Find(Trim(iWord), ,​ были.​Вообще если бы​: Спасибо, вечером опробую.​: Один из возможных​
​С уважением, Александр.​

​Заранее спасибо за​​Next j​ необходимо, что бы​ = text Loop​

planetaexcel.ru

Поиск значения в ячейке

​ хватило​​ End Sub​
​ UBound(ms) + 1)​ i%, FR As​
​ находится текст.​ формулу которая найдет​
​заюзать — самое​ xlValues, xlWhole) If​Где должен быть​ был сразу показан​Если не получится​ вариантов :​Sh_Alex​ помощь!​Cells(i, 7) =​ он нашел всех​ Close #1 End​AlexM​
​Пытливый​
​ = ms End​ Range, adr$, f$,​
​На листе «Поиск»​
​ выбранное слово или​
​ доступное средство…​
​ Not iCell Is​
​ код — это​ материал для работы​ — выложу файл-образец.​Private Sub Test()​
​: А с учетом​Kuzmich​

​ s​​ их.​ sub​
​: Для уменьшения количества​: Здравствуйте.​ If​ a$, ms() For​ — находится столбец​ выражение в общей​voidex​

​ Nothing Then »’​​ выяснили​
​ — всем было​pashulka, большое спасибо,​ Dim iWord As​ того, что функция​: Использовать Find​
​s = 0​V​Aleks777​
​ букв в формуле​

​Мне необходимо собрать​​yl3d​ i = 5​
​ C5:C17 — в​ ячейке и вернет​: спасибо! instr то​ Exit For End​alucard91​ бы легче.​ очень компактный код,​ Variant, iCell As​ ПОИСК(«AN85A»;A1) при отрицательном​Kuzmich​Next i​: и что дальше​:​ можно поэкспериментировать с​ формулу, которая:​: Vlad999 , спасибо​ To Cells(Rows.Count, 3).End(xlUp).Row​ котором вписаны слова,​
​ номер этой ячейки,​ что нужно​ If Next​: Спасибо за оживленный​pashulka​ все работает прекрасно​ Range For Each​ результате выдает #ЗНАЧ!,​: Макрос, запускать при​End Sub​ с этим делать​f1eshka​ массивом, например так​- берет Ф.И.О​ большое.​ f = Cells(i,​ по которым я​http://office.microsoft.com/ru-ru/ex…_matches_speci​artsmart​Hugo121​

​ дискус)​​:​Вот только как​ iWord In Split([A1])​ то можно покороче:​
​ активном листе Tabelle1,​итогояблоко1арбуз25яблоко2526апельсин2апельсин26арбуз140зеленое яблоко 3яблоко24вишня8624яблоко​ будете?​,​200?’200px’:»+(this.scrollHeight+5)+’px’);»>{«ефект»:»рогаз»:»росва»}​
​ человека (столбец 1),​Все работает.​ 3).Value For Each​
​ хочу осуществить поиск.​A​: Добрый день,​: Добавил небольшой код,​Приведу документ в​alucard91​ добавить поиск по​
​ Set iCell =​ =ЕСЛИ(ЕОШ(ПОИСК(«AN85A»;A1));ЕСЛИ(ЕОШ(ПОИСК(«AN185A»;A1));6.67;5);10)​ значения подтягиваются в​ арбуз 4апельсин28зеленое яблоко920красное​как вариант таблицу​

​Sub test() ‘​​Пытливый​
​- находит его​adrinalinka​
​ Ws In Sheets​Как макросом -​Данные​
​уже сломал голову​ подправил чуть существующее​ удобоваримый вид и​, Если не подлежит​
​ ключу из двух​ [A5:T24].Find(iWord, , xlValues,​С уважением, Александр.​ столбец В. В​

​ яблоко5красное яблоко33апельсин320​​ загнать в массив​ strFilePath = «MyTestFile.txt»​:​

​ должность (столбец 2),​​: Добрый день!​​ If Ws.Name <>​​ провести поиск ключевых​Белов​ в попытке решить​ (минимально — выход​
​ выложу завтра сюда​ редактированию, то как​ слов?​ xlWhole) If Not​azat​ ячейке с Potato​В итоге считает​ и циклом перебирать​ Call ImportFromTxt(«D:1.txt», «*строка*»)​AlexM​- и если​Нужна Ваша помощь.​ «Поиск» Then Set​ слов по листам​БД123​ проблему​ если не нашёлся​

​ с полным описанием​​ узнать что сколько​Ну тоесть Дядя​ iCell Is Nothing​: Отлично. Все заработало.​
​ уберите пробел в​ только «яблоко», а​ .​ End Sub Sub​,​ в его должности​
​ Видела похожие темы,​ FR = Ws.Cells.Find(f)​ 1,2,3,4 и вывести​Формула Описание (результат)​
​есть 4 прайса​ ключ, и выбор​ задачи.​

​ слов должен содержать​​ он ищет, а​ Then Run Choose(iCell.Column,​ Только вместо A1​ конце Sub iType()​ зеленые и красные​
​Пытливый​ ImportFromTxt(ByVal strFilePath As​китин​ находит определенные слова​ но все равно​

​ If Not FR​​ найденный текст -​​=ЕСЛИ(ЕЧИСЛО(ПОИСК(«л»;A2));»Верно»; «Неверно») Проверка​​ поставщиков, у них​ не А1, а​Извините за конфуз)​ ключ ?​ вот Дядя Вася​
​ «Change», «Delta», «Sum»,​ надо B38)​ Dim i As​
​ не учитывает. Необходимо,​: Варианты: Воспользоваться методом​ String, ByVal strLike​,​ (в 1 ячейке​ не получилось сделать.​

​ Is Nothing Then​​ в третью строку​ ячейки A2 на​ меняются цены и​ первой ячейки найденного​

​Hugo121​​Может Вы хотите​​ — уже нет.​​ и т.д.) Exit​alucard91​ Long Dim iLastRow​​ чтобы считал по​​ Find для диапазона.​ As String) Const​Мужики спасибо!​ — 1 слово)​Дана таблица. По​ adr = adr​ листа «Поиск» -​
​ наличие буквы «л»​ наличие (нужно обновить)​ диапазона, и убрал​​: Не нужен обязательно​​ перебрать все варианты​

​Hugo121​​ For End If​
​: Добрый день!​ As Long Dim​ всем ячейкам в​ Вопрос — что​ ForReading As Byte​Вы не совсем​ выдает в ячейку​ столбцам перечислены стадии​ & » «​ с выводом адреса​ (Верно)​
​Название все пишут​ удаление диапазона, ибо​ оригинал (личные и​ ?​: Мой алгоритм в​ Next End SubИли​Имеется некая ячейка,​ FoundCell As Range​
​ которых содержится слово​ дальше с ними​ = 1 Dim​

​ меня поняли:​​ «+ ретик», если​ переработки (всего 4​
​ & Ws.Name &​ ячейки, в которой​=ЕЧИСЛО(ПОИСК(«БД»;A3)) Проверка ячейки​ по разному но​ это мне мешало​
​ секретные данные убирайте),​

​Или же Вам​​ первом варианте избавлен​ так, если в​ содержащая текст.​ iLastRow = Cells(Rows.Count,​ «яблоко»​ делать надо?​ i As Long​мне нужна была​ слова не встречаются​ стадии — 4​

​ «!» & FR.Address​​ был найден этот​ A3 на наличие​ содержатся точно либо​ Заменил на очистку​
​ нужен полный аналог​ достаточно частичного совпадения​ от этой проблемы.​ таблице ключевых слов​Имеется таблица 20*20,​ «C»).End(xlUp).Row Range(«B2:B» &​Казанский​
​upd V, опередил​ Dim fso As​ формула, которая:​ — оставляет ячейку​ столбца). В какой-то​ ‘—цикл по следующим​
​ текст ?​ текста «БД» (ИСТИНА)​

​ правильный номер номер​​ — смотрите там​​ — форматы, расположение​​ … тогда замените​pashulka​ первый столбец, не​​ содержащая ключевые слова.​​ iLastRow).ClearContents With Worksheets(«Tabelle2»)​: Tanya15, If Cells(i,​ с вопросом!​
​ Object, tso As​- берет Ф.И.О​ пустой.​ из стадий может​ найденным ячейкам a​Vlad999​вроде работает и​ (в разных форматах,​ есть остатки!)​ данных, ну и​ xlWhole на xlPart​:​ [A:A] :​Как при помощи​ For i =​ j) like «*яблоко*»​Nordheim​ Object Dim strLine​

​ человека (столбец 1),​​200?’200px’:»+(this.scrollHeight+5)+’px’);»>​ встречаться «передача», которая​ = FR.Address ‘—запоминаем​: на листе один​ показывает ВЕРНО/НЕВЕРНО​ с пробелом,точкой или​Это для начала,​ в данном случае​ или добавьте символ​alucard91​Private Sub Test2()​ макроса запустить проверку​ 2 To iLastRow​
​ Then​: Sub test() Dim​ As String Dim​- находит его​

​=ЕСЛИ(ИЛИ(ВПР(A2;A:B;2;0)=»Дефектоскопист»;ВПР(A2;A:B;2;0)=»Электрогазосварщик»;ВПР(A2;A:B;2;0)=»Электросварщик»);»+ретик»;»»)​​ может звучать по-разному​ адрес первой найденной​

CyberForum.ru

Поиск в ячейках по части слова

​ текст всегда в​​но как понять​ тире и тп.)​
​ там ведь нужно​ свои макросы не​ подстановки «*»​
​, В этом случае​ Dim iWord As​ ячейки, чтобы при​ Set FoundCell =​Tanya15​ i&, iCnt1&, iCnt2&,​ x As Long:​ должность (столбец 2)​Нет формулы поиска​ (например, передача с​ ячейки Do Set​ одном экземпляре?​ в какой ячейке​ или правильное указание​ поиск ключей переделывать,​ лишним будет показать,​Hugo121​

​ — можно выбрать​​ Variant, iSource As​ нахождении в ней​
​ .Columns(2).Find(Cells(i, «A»), ,​: Все так просто​ arr() ‘1 вариант​ x = 1​ и уже ПОТОМ…​ слова в массиве.​ передачей обязательств или​ FR = Ws.Cells.FindNext(FR)​yl3d​ он нашел соответствие??​ модели в тексте​ а некогда…​ если возможно.​​: — так все​​ другой критерий разделения​ Range, iCell As​

​ любого слова из​​ xlValues, xlPart) If​Спасибо!​

CyberForum.ru

Поиск определенной части текста в ячейке

​ поиск на листе​​ Set fso =​
​Но с Вашей​китин​ передача в стороннюю​
​ If FR.Address =​: Vlad999 , нет​Alex77755​ (с пробелом или​
​Hugo121​alucard91​ ключи говорят что​ ключей, например, запятую​ Range Set iSource​ столбца 1 -​ Not FoundCell Is​Nordheim​ For i =​ CreateObject(«Scripting.FileSystemObject») ‘ Set​ помощью у меня​: может так?только нужные​
​ организацию). Надо, чтобы​ a Then Exit​ — может быть​
​: Я бы формулами​ без, или в​: Переделал поиск -​
​: Секретных данных нет,​ известны — есть​
​Код A1 =​ = [C5:V24] For​
​ выполнить макрос 1,​ Nothing Then Cells(i,​

​: под ваш пример.​​ 1 To 100​ tso = fso.OpenTextFile(strFilePath,​
​ получилось!!!​

​ слова надо вынести​​ в пятом столбце​ Do adr =​
​ несколько ячеек с​ не стал такое​ скобках)​
​ проверяйте.​
​ условия и задачи​
​ где-то некая таблица.​ Дядя Вася, мама,​
​ Each iWord In​
​ из столбца 2​ «B») = .Cells(FoundCell.Row,​
​Sub test() Dim​ If UCase(Cells(i, 1).Value)​
​ ForReading) i =​
​ЕСЛИ(ИЛИ(ЕЧИСЛО(ПОИСК({«Дефектоскопист»:»Электрогазосварщик»:»Электросварщик»};ВПР(A2;Лист1!A:B;2;0))));»+ретик»;»»)​ в отдельный столбец​
​ выполнялось следующее условие​
​ adr & «​ похожим текстом​ делать.​Нужно найти соответствие​
​voidex​ постарался максимально расписать​pashulka​ мыла, раму ‘можно​ Split([A1]) Set iCell​ — выполнить макрос​
​ «D») End If​
​ i&, iCnt1&, iCnt2&,​
​ Like UCase(«яблоко») Then​
​ 1 Do While​
​Второй лист.​
​200?’200px’:»+(this.scrollHeight+5)+’px’);»>=ЕСЛИ(ЕНД(ПОИСКПОЗ(1;—ЕЧИСЛО(ПОИСК($E$6:$E$8;B2));0));»»;»+ретик»)​
​ =если в каком​ » & Ws.Name​Vlad999​Макросами проще. Загонять​
​ прайсов и базы​: Всем доброго времени​ в самом документе.​
​:​ без пробелов Private​
​ = iSource.Find(iWord, ,​ 2, и так​ Next End With​

​ arr(), ikey ‘1​​ iCnt1 = iCnt1​ Not tso.AtEndOfStream ‘​СПАСИБО!!!​
​формула массива​ из столбцов есть​ & «!» &​
​: для одного.​ в массивы и​ по модели/номеру​ суток​
​От использования разных​Hugo121​ Sub Test1v2() Dim​ xlValues, xlWhole) If​ для каждого столбца​

​ End Sub​​ вариант For Each​ + 1 Next​
​ strLine = tso.ReadLine​
​f1eshka​только не понял​
​ слово «передача», то​ FR.Address Loop ‘————​
​Sub vvv() Dim​ работать с ними.​

​если есть совпадение​​есть макрос(точнее его​ макросов в зависимости​, Имелось ввиду, что​

​ iWord As Variant,​​ Not iCell Is​
​ ключевых слов.​Nordheim​

CyberForum.ru

Поиск текста с выводом адреса ячейки

​ ikey In ActiveSheet.UsedRange​​ i ‘2 вариант​ If strLine Like​
​: Доброго времени суток.​ причем тут ФИО?​
​ появляется слово «есть».​ End If End​
​ Ws As Worksheet,​Но по тем​ указать Цену из​
​ часть которую я​ от результата совпадения​ если изначально -​ iCell As Range​ Nothing Then Run​Пример:​
​: Sub test() Dim​ If UCase(ikey.Value) Like​ поиск в массиве​ strLike Then Cells(x,​ Допустим есть файл​YouGreed​Задача, вроде простая,​ If Next ‘Cells(i,​ i%, FR As​ данным, что приложены​ Прайса в Базу​

​ бы хотел изменить​​ в таблице ушел​ было достаточно искать​ For Each iWord​

​ Choose(iCell.Column — iSource.Column​​Ячейка = «мама​ i&, cell As​ UCase(«*яблоко*») Then iCnt1​ arr = Range([a1],​

​ 1).Value = strLine​​ info.txt ( состоит​
​: Пытливый, Так?​ но не могу​ 5) = adr​ Range, adr$, f$​ даже не могу​если изменилось указать​pomenat = InputBox(«введите​ к одному макросу,​любое слово​ In Split([A1], «,»)​ + 1, «Change»,​ мыла раму»​ Range With Sheets(«Tabelle1″)​ = ikey(1, 2)​ [a100]).Value For i​ x = x​ из множества строк,​200?’200px’:»+(this.scrollHeight+5)+’px’);»>=ЕСЛИ(СУММ(($E$5:$E$7=ПСТР(ВПР($A2;$A$2:$B$4;2;);1;НАЙТИ(» «;ВПР($A2;$A$2:$B$4;2;);1)-1))*СТРОКА($A2));»+ ретик»;»-«)​ сообразить, как с​ ‘если в одну​ For i =​ подсказать конкретно.​ наличие 1/0​ слово») For Z​ зависящему от этого​

​из перечисленных, т.е.​​ Set iCell =​

​ «Delta», «Sum», и​​Таблица ключевых слов:​​ For i =​​ + iCnt1 Next​ = 1 To​ + 1 End​ например gsd =​
​Откровенно, накидал туда,​
​ помощью формул ее​ ‘если один адрес​ 5 To Cells(Rows.Count,​Для более конкретного​пример привел в​ = Z To​ результата.​ есть строка «дядю​ [A5:T24].Find(Trim(iWord), , xlValues,​ т.д.) Exit For​….1…….|……2……|…….3….​ 2 To .Cells(.Rows.Count,​ ikey MsgBox «На​ 100 If UCase(arr(i,​ If i =​ 797 …. dig​ всякого всякого, можно​ решить. Буду благодарна​ — одна ячейка​ 3).End(xlUp).Row f =​ ответа нужны конкретные​ приложении.​ LastRow1 If UCase(Cells(Z,​PS: кнопку убрал​ вася мама мыла​ xlWhole) If Not​ End If Next​Мама…|..Дядя…|..Дедка​ 1).End(xlUp).Row Set cell​ листе » &​ 1)) Like UCase(«яблоко»)​ i + 1​ = 7666 и​ попроще…​ за помощь!​ ms = Split(Mid(adr,​ Cells(i, 3).Value For​ файлы что есть​Буду благодарен за​ c).Text) = UCase(pomenat)​ в сторону и​ раму» и мы​ iCell Is Nothing​ End SubP.S. При​Папа….|…Тетя…|…Бабка​

​ = Sheets(«Tabelle2»).Columns(«b:b»).Find(Trim(.Cells(i, 1).Value),​​ iCnt1 & «​ Then iCnt2 =​
​ Loop tso.Close Set​ т.д.) в корне​
​Пытливый​Svsh2015​ 2, 1000)) Cells(i,​
​ Each Ws In​ и что хотелось​ помощь!​

​ And…..Как сделать так,​​ забыл вернуть, она​ ищем, сначала дядю,​
​ Then ‘Выполнение необходимого​ желании, можно использовать​Выполнить макрос #1​ lookat:=xlPart) If Not​ ябл.» End Sub​
​ iCnt2 + 1​ tso = Nothing​ в с экселевким(готова​: китин,​: добрый день,​ 5).Resize(, UBound(ms) +​ Sheets If Ws.Name​

​ бы получить​​Alex77755​ чтобы можно было​
​ на той же​

CyberForum.ru

Поиск фрагментов текста в ячейке с использованием макросов

​ потом васю и​​ макроса Exit For​
​ массив​ так как ячейка​ cell Is Nothing​Lina1515​
​ Next i ‘итог​ Set fso =​ таблица) нужно сделать​Принцип работы очень​для тестирования кнопка​ 1) = ms​ <> «Поиск» Then​artsmart​: Открой секрет как​ ввести(в inputbox) не​ вкладке что и​ т.д.​ End If Next​Hugo121​ содержит слово из​ Then .Cells(i, 2).Value​: Всем доброго времени​ MsgBox «На листе​
​ Nothing End Sub​ так, чтобы через​ нравится. Но можно​ test в файл-примере,​ ‘————————- adr =​ Set FR =​

​: Вот сделал два​​ ты получил 9792,02?​
​ полное содержание ячейки,​ описание, только сбоку.​То теперь, когда​
​ End Sub​

​: Добавляем к значению​​ первого столбца.​ = cell(1, 3)​ суток!​
​ » & iCnt1​Hugo121​ vba ексель находил​ без выноса? как-то​ кнопка clean -очистить:​ «» Next End​ Ws.Cells.Find(f) If Not​ файла вырезка​От сюда?​ которое надо обработать​Большое спасибо за​ выяснилось, что искомое​alucard91​ ячейки по пробелу​Надеюсь не сильно​ Next i End​Я недавно начала​ & » ябл.»​: Обычно нужно вставлять​ в этом файле​

CyberForum.ru

Поиск конкретного слова из текста в ячейке (Формулы/Formulas)

​ в формуле прописать​​Код =ЕСЛИ(СЧЁТЕСЛИ(B7:E7;»*Передача*»)>0;»Есть»;»Нет»)​
​ Sub​ FR Is Nothing​
​Прайслист поставщика 1​artsmart​
​ (например: желтый дом),​ внимание.​
​ значение может содержать​: Hugo121, простите, Ваш​ по концам (в​ запутал. Спасибо))​ With End Sub​ работать в VBA,​ & vbLf &​ не одно значение,​ определенные строки и​ (документ итак забит​
​Svsh2015​
​yl3d​

​ Then adr =​страница 2 -​

​: Через вспомогательные файлы​​ а одно слово​pashulka​несколько слов​​ вариант с пробелами​​ переменной).​
​pashulka​Lina1515​

​ поэтому у меня​​ «В массиве «​
​ а много, и​
​ выставлял в конкретные​ до отказа).​: добрый вечер,можно также​

​: Vlad999 , один​​ adr & «​
​ база данных SQL​ вообще-то делал​ «желтый» или «дом»​:​, возник мой вопрос.​ показался мне слишком​

​Цикл по 20х20​​: Excel ? Word​
​: Спасибо большое!​ возник маленький вопрос.​ & iCnt2 &​ разных. Поэтому есть​

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

​ адрес- одна ячейка.​​ » & Ws.Name​​нужно из 1​​Из прайса всю​​ или если возможно(так​

​alucard91​​Hugo121​​ запутанным.​​ (можно 2 вложенных),​hands hands hands​ ?​azat​ Я его оформила​ » ябл.» End​

​ смысл сперва прочитать​​ этом, чтобы взятая​: YouGreed,​ в файл-примере:​Vlad999 , не​​ & "!" &​

​ страницы​​ строку разбиваю на​hands ​ для общего развития)​​, На первый взгляд,​​: Вопрос понятен.​​pashulka, текст в​
​ к каждому значению​
​Если в ячейке​: Подскажите пожалуйста правильную​
​ в Excel. Сама​ Sub​
​ весь файл в​ строка вставлялась в​
​Извини, формула хорошая​Sub yy() Dim​ работает.​
​ FR.Address End If​вытащить цены во​ слова​
​ вообще «жел»(если такое​
​ реальный разделитель данных,​
​Но без примера​

excelworld.ru

Поиск определенного текста в файле .txt и вставка в определенную ячейку в Excel

​ А1 редактированию не​​ прибавляем пробелы, ищем​ будет текст «папа​ формулу… Мне надо​ задача очень простая,​Tanya15​ словарь (ну или​ эксель с данными​ но если слово​ i&, j&, i1&​Выдает ошибку «run-time​ Next Cells(i, 5)​ вторую​F43​ возможно)​ у Вас это​ и подробного описания​ подлежит, так что​ используя Instr()​ + тетя =​ чтобы в ячейке​ если её решать​: Мой пример​ в коллекцию), а​ после знака равенства.​
​ не в начале​ i1 = Range(«B»​ error ’13’: Type​ = adr adr​artsmart​
​сравниваются с​Апострофф​-​ задачи непонятно, что​ буду пытаться составить​Если нашли -​ адюльтер», то какой​ B38 формула проверала​ в Excel. Я​Sub Кнопка2_Щелчок()​

​ затем циклом по​​ Пока сам только​​ предложения — сыпется.​​ & Cells.Rows.Count).End(xlUp).Row With​
​ mistmatch»​ = «» Next​: Что никто задачи​названиями, моделями, номерами​: Метод Range.Find с​и в этом​ вообще оптимальнее искать​ более четкие ключи​ анализ столбца, выполнение​ макрос нужно выполнить​ наличие текста «AN85A»​ бы использовала =VLOOKUP(«*»&A2&»*»;Sheet2!B:D;3;0).​Dim i As​ листу всё собранное​ научился делать простейший​китин​ CreateObject(«VBScript.RegExp»): .IgnoreCase =​и подсвечивает строку​ End Subдля нескольких​ ранее не рашал​ прайсов​ параметром LookAt:=xlPart​ случае, можно протестировать​ — ключей изначально​ для избежания колизий.​ макроса, выход.​ 1, 2 или​ и в случае​ Но я бы​ Single, j As​ разложить по местам.​ импорт данных из​: легко​ True For j​

​ кода: ms =​​ чуть позже. пока​ подобной?​получаем B8​или (тоже из​ :​ ясно что всего​Да и вообще​Можно и иначе​ 1+2​ истины, то значение​ хотела это автоматизировать​

CyberForum.ru

​ Single, s As​

Содержание

  1. VBA Excel «contains» операторы?
  2. 3 ответа 3
  3. Проверка условий (If…Then…)
  4. Краткое руководство по VBA If Statement
  5. Что такое IF и зачем оно тебе?
  6. Тестовые данные
  7. Формат операторов VBA If Then
  8. Простой пример If Then
  9. Условия IF
  10. Использование If ElseIf
  11. Использование If Else
  12. Используя If And/If Or
  13. Функция IIF
  14. Использование Select Case

VBA Excel «contains» операторы?

Нужно, чтобы при сравнивании двух похожих строчек String.

Например: If «йцуке» содержит/включает «йцу» = true.

В других есть такой метод «contains», а в VBA как?

3 ответа 3

В дополнение к уже опубликованному ответу:

Можно использовать оператор like :

Данный оператор чувствителен к регистру, поэтому если нужно опустить чувствительность, можно использовать один из двух вариантов:

    Option Compare Text

Использовать Lcase либо Ucase , т.е. на вашем примере может выглядеть так:

if Lcase(«йЦуКе») like Lcase(«*ЙцУ*») then .

В VBA для этих целей есть функция InStr. Используется как

где start — необязательный параметр, указывающий начальную позицию для поиска (по умолчанию с первого символа)
string1 — строка, в которой осуществляется поиск
string2 — искомая строка
compare — необязательный параметр, указывающий метод сравнения (бинарное, текстовое или сравнение информации в базах данных (только для Access)). По умолчанию используется бинарное сравнение.

Возвращаемые значения функции:
NULL — если любая из строк NULL ,
0 — если string1 пустая строка либо string2 не найдена, либо start больше длины строки string1 ,
start — если string2 пустая строка,
если строка string2 найдена внутри строки string1 , то возвращает позицию, в которой найдено совпадение.

Повторюсь, но все же. InStr, Like — для строки. Если же массив строк, то используется Filter

Filter ( , [, ] [, ]) — просматривает массив строковых значений и ищет в нем все подстроки, совпадающие с заданной строкой. Эта функция имеет четыре аргумента: — искомая строка; — параметр (boolean значение), который указывает, будут ли возвращаемые строки включать искомую подстроку или, наоборот, возвращаться будут только те строки массива, которые не содержат искомой строки в качестве подстроки; — параметр, определяющий метод сравнения строк.

Источник

Проверка условий (If…Then…)

Угадай, если сможешь, и выбери, если посмеешь

Краткое руководство по VBA If Statement

Описание Формат Пример
If Then If [условие верно]
Then [действие]
End If
If score = 100
Then Debug.Print
«Отлично»
End If
If Else If [условие верно]
Then [действие]
Else [действие]
End If
If score = 100
Then Debug.Print
«Отлично»
Else Debug.Print
«Попробуй снова»
End If
If ElseIf If [1 условие верно]
Then [действие]
ElseIf [2 условие
верно]
Then [действие]
End If
If score = 100
Then Debug.Print
«Отлично»
ElseIf score > 50
Then Debug.Print
«Пройдено»
ElseIf score 50
Then Debug.Print
«Пройдено»
ElseIf score > 30
Then Debug.Print
«Попробуй снова»
Else Debug.Print
«Ой»
End If
If без Endif
(Только одна
строка)
If [условие верно]
Then [действие]
If value

В следующем коде показан простой пример использования оператора VBA If

Что такое IF и зачем оно тебе?

Оператор VBA If используется, чтобы позволить вашему коду делать выбор, когда он выполняется.

Вам часто захочется сделать выбор на основе данных, которые читает ваш макрос.

Например, вы можете захотеть читать только тех учеников, у которых оценки выше 70. Когда вы читаете каждого учащегося, вы можете использовать инструкцию If для проверки отметок каждого учащегося.

Важным словом в последнем предложении является проверка. Оператор If используется для проверки значения, а затем для выполнения задачи на основе результатов этой проверки.

Тестовые данные

Мы собираемся использовать следующие тестовые данные для примеров кода в этом посте.

Формат операторов VBA If Then

Формат оператора If Then следующий

За ключевым словом If следуют условие и ключевое слово Then

Каждый раз, когда вы используете оператор If Then, вы должны использовать соответствующий оператор End If.

Когда условие оценивается как истинное, обрабатываются все строки между If Then и End If.

Чтобы сделать ваш код более читабельным, рекомендуется делать отступы между операторами If Then и End If.

Отступ между If и End If

Отступ означает просто переместить строку кода на одну вкладку вправо. Правило большого пальца состоит в том, чтобы сделать отступ между начальным и конечным операторами, такими как:

Sub … End Sub
If Then … End If
If Then… ElseIf … Else … Endif
For … Next
Do While … Loop
Select Case … End Case

Для отступа в коде вы можете выделить строки для отступа и нажать клавишу Tab. Нажатие клавиш Shift + Tab сделает отступ кода, т.е. переместит его на одну вкладку влево.

Вы также можете использовать значки на панели инструментов Visual Basic для отступа кода.

Если вы посмотрите на примеры кода на этом сайте, вы увидите, что код имеет отступ.

Простой пример If Then

Следующий код выводит имена всех студентов с баллами более 50.

  • Василий Кочин
  • Максим Бородин
  • Дмитрий Маренин
  • Олеся Клюева
  • Евгений Яшин

Поэкспериментируйте с этим примером и проверьте значение или знак > и посмотрите, как изменились результаты.

Условия IF

Часть кода между ключевыми словами If и Then называется условием. Условие — это утверждение, которое оценивается как истинное или ложное. Они в основном используются с операторами Loops и If. При создании условия вы используете такие знаки, как «>, ,> =,

Условие Это верно, когда
x 5 x больше, чем 5
x >= 5 x больше, либо равен 5
x = 5 x равен 5
x <> 5 x не равен 5
x > 5 And x 10 x равен 2 ИЛИ x больше,чем 10
Range(«A1») = «Иван» Ячейка A1 содержит текст «Иван»
Range(«A1») <> «Иван» Ячейка A1 не содержит текст «Иван»

Вы могли заметить x = 5, как условие. Не стоит путать с х = 5, при использовании в качестве назначения.

Когда в условии используется «=», это означает, что «левая сторона равна правой стороне».

В следующей таблице показано, как знак равенства используется в условиях и присваиваниях.

Использование «=» Тип Значение
Loop Until x = 5 Условие Равен ли x пяти
Do While x = 5 Условие Равен ли x пяти
If x = 5 Then Условие Равен ли x пяти
For x = 1 To 5 Присваивание Установите значение х = 1, потом = 2 и т.д.
x = 5 Присваивание Установите х до 5
b = 6 = 5 Присваивание и
условие
Присвойте b
результату условия
6 = 5
x = MyFunc(5,6) Присваивание Присвойте х
значение,
возвращаемое
функцией

Последняя запись в приведенной выше таблице показывает оператор с двумя равными. Первый знак равенства — это присвоение, а любые последующие знаки равенства — это условия.

Поначалу это может показаться странным, но подумайте об этом так. Любое утверждение, начинающееся с переменной и равно, имеет следующий формат

[переменная] [=] [оценить эту часть]

Поэтому все, что находится справа от знака равенства, оценивается и результат помещается в переменную. Посмотрите на последние три строки таблицы, как:

Использование If ElseIf

Инструкция ElseIf позволяет вам выбирать из нескольких вариантов. В следующем примере мы печатаем баллы, которые находятся в диапазоне.

Важно понимать, что порядок важен. Условие If проверяется первым.

Если это правда, то печатается «Высший балл», и оператор If заканчивается.

Если оно ложно, то код переходит к следующему ElseIf и проверяет его состояние.

Давайте поменяемся местами If и ElseIf из последнего примера. Код теперь выглядит так

В этом случае мы сначала проверяем значение более 75. Мы никогда не будем печатать «Высший балл», потому что, если значение больше 85, это вызовет первый оператор if.

Чтобы избежать подобных проблем, мы должны использовать два условия. Они помогают точно указать, что вы ищете, чтобы избежать путаницы. Пример ниже показывает, как их использовать. Мы рассмотрим более многочисленные условия в разделе ниже.

Давайте расширим оригинальный код. Вы можете использовать столько операторов ElseIf, сколько захотите. Мы добавим еще несколько, чтобы учесть все наши классификации баллов.

Использование If Else

Утверждение Else используется, как ловушка для всех. Это в основном означает «если бы не было условий» или «все остальное». В предыдущем примере кода мы не включили оператор печати для метки сбоя. Мы можем добавить это, используя Else.

Так что, если это не один из других типов, то это провал.

Давайте напишем некоторый код с помощью наших примеров данных и распечатаем студента и его классификацию.

Результаты выглядят так: в столбце E — классификация баллов

Используя If And/If Or

В выражении If может быть несколько условий. Ключевые слова VBA And и Or позволяют использовать несколько условий.

Эти слова работают так же, как вы используете их на английском языке.

Давайте снова посмотрим на наши примеры данных. Теперь мы хотим напечатать всех студентов, которые набрали от 50 до 80 баллов.

Мы используем Аnd, чтобы добавить дополнительное условие. Код гласит: если оценка больше или равна 50 и меньше 75, напечатайте имя студента.

Вывести имя и фамилию в результаты:

  • Дмитрий Маренин
  • Олеся Клюева
  • Евгений Яшин

В нашем следующем примере мы хотим знать, кто из студентов сдавал историю или геометрию. Таким образом, в данном случае мы говорим, изучал ли студент «История» ИЛИ изучал ли он «Геометрия» (Ctrl+G).

  • Василий Кочин
  • Александр Грохотов
  • Дмитрий Маренин
  • Николай Куликов
  • Олеся Клюева
  • Наталия Теплых
  • Дмитрий Андреев

Использование нескольких таких условий часто является источником ошибок. Эмпирическое правило, которое нужно помнить, должно быть максимально простым.

Использование IF AND

And работает следующим образом:

Условие 1 Условие 2 Результат
ИСТИНА ИСТИНА ИСТИНА
ИСТИНА ЛОЖЬ ЛОЖЬ
ЛОЖЬ ИСТИНА ЛОЖЬ
ЛОЖЬ ЛОЖЬ ЛОЖЬ

Что вы заметите, так это то, что And верно только тогда, когда все условия выполняются.

Использование IF OR

Ключевое слово OR работает следующим образом

Условие 1 Условие 2 Результат
ИСТИНА ИСТИНА ИСТИНА
ИСТИНА ЛОЖЬ ИСТИНА
ЛОЖЬ ИСТИНА ИСТИНА
ЛОЖЬ ЛОЖЬ ЛОЖЬ

Что вы заметите, так это то, что OR ложно, только когда все условия ложны.

Смешивание And и Or может затруднить чтение кода и привести к ошибкам. Использование скобок может сделать условия более понятными.

Использование IF NOT

Также есть оператор NOT. Он возвращает противоположный результат условия.

Условие Результат
ИСТИНА ЛОЖЬ
ЛОЖЬ ИСТИНА

Следующие две строки кода эквивалентны.

Помещение условия в круглые скобки облегчает чтение кода

Распространенное использование Not — при проверке, был ли установлен объект. Возьмите Worksheet для примера. Здесь мы объявляем рабочий лист.

Мы хотим проверить действительность mySheet перед его использованием. Мы можем проверить, если это Nothing.

Нет способа проверить, является ли это чем-то, поскольку есть много разных способов, которым это может быть что-то. Поэтому мы используем NOT с Nothing.

Если вы находите это немного запутанным, вы можете использовать круглые скобки, как здесь

Функция IIF

VBA имеет функцию, аналогичную функции Excel If. В Excel вы часто используете функцию If следующим образом:

= ЕСЛИ (F2 =»»,»», F1 / F2)

= If (условие, действие, если ИСТИНА, действие, если ЛОЖЬ).

VBA имеет функцию IIf, которая работает так же. Давайте посмотрим на примере. В следующем коде мы используем IIf для проверки значения переменной val. Если значение больше 10, мы печатаем ИСТИНА, в противном случае мы печатаем ЛОЖЬ.

В нашем следующем примере мы хотим распечатать «Удовлетворитеьно» или «Незачет» рядом с каждым студентом в зависимости от их баллов. В первом фрагменте кода мы будем использовать обычный оператор VBA If, чтобы сделать это.

В следующем фрагменте кода мы будем использовать функцию IIf. Код здесь намного аккуратнее.

Функция IIf очень полезна для простых случаев, когда вы имеете дело с двумя возможными вариантами.

Использование Nested IIf

Вы также можете вкладывать IIf-операторы, как в Excel. Это означает использование результата одного IIf с другим. Давайте добавим еще один тип результата в наши предыдущие примеры. Теперь мы хотим напечатать «Отлично», «Удовлетворительно» или «Незачетт» для каждого студента.

Используя обычный VBA, мы сделали бы это так

Используя вложенные IIfs, мы могли бы сделать это так

Использование вложенного IIf хорошо в простых случаях, подобных этому. Код прост для чтения и, следовательно, вряд ли вызовет ошибки.

Чего нужно остерегаться

Важно понимать, что функция IIf всегда оценивает как Истинную, так и Ложную части выражения независимо от условия.

В следующем примере мы хотим разделить по баллам, когда он не равен нулю. Если он равен нулю, мы хотим вернуть ноль.

Однако, когда отметки равны нулю, код выдаст ошибку «Делить на ноль». Это потому, что он оценивает как Истинные, так и Ложные утверждения. Здесь ложное утверждение, т.е. (60 / Marks), оценивается как ошибка, потому что отметки равны нулю.

Если мы используем нормальный оператор IF, он будет запускать только соответствующую строку.

Это также означает, что если у вас есть функции для ИСТИНА и ЛОЖЬ, то обе будут выполнены. Таким образом, IIF будет запускать обе функции, даже если он использует только одно возвращаемое значение. Например:

IF против IIf

В этом случае вы можете видеть, что IIf короче для написания и аккуратнее. Однако если условия усложняются, вам лучше использовать обычное выражение If. Недостатком IIf является то, что он недостаточно известен, поэтому другие пользователи могут не понимать его так же, как и код, написанный с помощью обычного оператора if.

Кроме того, как мы обсуждали в последнем разделе, IIF всегда оценивает части ИСТИНА и ЛОЖЬ, поэтому, если вы имеете дело с большим количеством данных, оператор IF будет быстрее.

Мое эмпирическое правило заключается в том, чтобы использовать IIf, когда он будет прост для чтения и не требует вызовов функций. Для более сложных случаев используйте обычный оператор If.

Использование Select Case

Оператор Select Case — это альтернативный способ написания статистики If с большим количеством ElseIf. Этот тип операторов вы найдете в большинстве популярных языков программирования, где он называется оператором Switch. Например, Java, C #, C ++ и Javascript имеют оператор switch.

Давайте возьмем наш пример DobClass сверху и перепишем его с помощью оператора Select Case.

Ниже приведен тот же код с использованием оператора Select Case. Главное, что вы заметите, это то, что мы используем “Case 85 to 100” rather than “marks >=85 And marks =85 And marks

Ответ на упражнение

Следующий код показывает, как выполнить вышеупомянутое упражнение.

Примечание: есть много способов выполнить задачу, поэтому не расстраивайтесь, если ваш код отличается.

Источник

замечания

Когда вам нужно проверить наличие или позицию подстроки внутри строки, VBA предлагает функции InStr и InStrRev которые возвращают позицию символа подстроки в строке, если она присутствует.

Используйте InStr, чтобы определить, содержит ли строка подстроку

Const baseString As String = "Foo Bar"
Dim containsBar As Boolean

'Check if baseString contains "bar" (case insensitive)
containsBar = InStr(1, baseString, "bar", vbTextCompare) > 0
'containsBar = True

'Check if baseString contains bar (case insensitive)
containsBar = InStr(1, baseString, "bar", vbBinaryCompare) > 0
'containsBar = False

Используйте InStr, чтобы найти позицию первого экземпляра подстроки

Const baseString As String = "Foo Bar"
Dim containsBar As Boolean

Dim posB As Long
posB = InStr(1, baseString, "B", vbBinaryCompare)
'posB = 5

Используйте InStrRev, чтобы найти позицию последнего экземпляра подстроки

Const baseString As String = "Foo Bar"
Dim containsBar As Boolean

'Find the position of the last "B"
Dim posX As Long
'Note the different number and order of the paramters for InStrRev
posX = InStrRev(baseString, "X", -1, vbBinaryCompare)
'posX = 0

Метод Find объекта Range для поиска ячейки по ее данным в VBA Excel. Синтаксис и компоненты. Знаки подстановки для поисковой фразы. Простые примеры.

Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.

Синтаксис метода Range.Find

Expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.

В скобках перечислены параметры метода, среди них только What является обязательным.

Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.

Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.

Параметры метода Range.Find

Наименование Описание
Обязательный параметр
What Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра — Variant.
Необязательные параметры
After Ячейка, после которой следует начать поиск.
LookIn Уточняет область поиска. Список констант xlFindLookIn:

  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • xlFormulas (-4123) – формулы.
LookAt Поиск частичного или полного совпадения. Список констант xlLookAt:

  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
SearchOrder Определяет способ поиска. Список констант xlSearchOrder:

  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
SearchDirection Определяет направление поиска. Список констант xlSearchDirection:

  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
MatchCase Определяет учет регистра:

  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
MatchByte Условия поиска при использовании двухбайтовых кодировок:

  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
SearchFormat Формат поиска – используется вместе со свойством Application.FindFormat.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes.

В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

Знаки подстановки для поисковой фразы

Условные знаки в шаблоне поисковой фразы:

  • ? – знак вопроса обозначает любой отдельный символ;
  • * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
  • ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).

Простые примеры

При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:

  1. Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
  2. Если поисковая фраза в заданном диапазоне найдена не будет, метод Range.Find возвратит значение Nothing. Обращение к свойствам несуществующей ячейки будет генерировать ошибки. Поэтому, перед использованием результатов поиска, необходимо проверить объектную переменную на содержание в ней значения Nothing.

В примерах используются переменные:

  • myPhrase – переменная для записи поисковой фразы;
  • myCell – переменная, которой присваивается первая найденная ячейка, содержащая поисковую фразу, или значение Nothing, если поисковая фраза не найдена.

Пример 1

Sub primer1()

Dim myPhrase As Variant, myCell As Range

myPhrase = «стакан»

Set myCell = Range(«A1:L30»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

MsgBox «Строка найденной ячейки: « & myCell.Row

MsgBox «Столбец найденной ячейки: « & myCell.Column

MsgBox «Адрес найденной ячейки: « & myCell.Address

Else

MsgBox «Искомая фраза не найдена»

End If

End Sub

В этом примере мы присваиваем переменной myPhrase значение для поиска – "стакан". Затем проводим поиск этой фразы в диапазоне "A1:L30" с присвоением результата поиска переменной myCell. Далее проверяем переменную myCell, не содержит ли она значение Nothing, и выводим соответствующие сообщения.

Ознакомьтесь с работой кода VBA в случаях, когда в диапазоне "A1:L30" есть ячейка со строкой, содержащей подстроку "стакан", и когда такой ячейки нет.

Пример 2

Теперь посмотрим, как метод Range.Find отреагирует на поиск числа. В качестве диапазона поиска будем использовать первую строку активного листа Excel.

Sub primer2()

Dim myPhrase As Variant, myCell As Range

myPhrase = 526.15

Set myCell = Rows(1).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

Else: MsgBox «Искомая фраза не найдена»

End If

End Sub

Несмотря на то, что мы присвоили переменной числовое значение, метод Range.Find найдет ячейку со значением и 526,15, и 129526,15, и 526,15254. То есть, как и в предыдущем примере, поиск идет по подстроке.

Чтобы найти ячейку с точным соответствием значения поисковой фразе, используйте константу xlWhole параметра LookAt:

Set myCell = Rows(1).Find(myPhrase, , , xlWhole)

Аналогично используются и другие необязательные параметры. Количество «лишних» запятых перед необязательным параметром должно соответствовать количеству пропущенных компонентов, предусмотренных синтаксисом метода Range.Find, кроме случаев указания необязательного параметра по имени, например: LookIn:=xlValues. Тогда используется одна запятая, независимо от того, сколько компонентов пропущено.

Пример 3

Допустим, у нас есть многострочная база данных в Excel. В первой колонке находятся даты. Нам необходимо создать отчет за какой-то период. Найти номер начальной строки для обработки можно с помощью следующего кода:

Sub primer3()

Dim myPhrase As Variant, myCell As Range

myPhrase = «01.02.2019»

myPhrase = CDate(myPhrase)

Set myCell = Range(«A:A»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Номер начальной строки: « & myCell.Row

Else: MsgBox «Даты « & myPhrase & » в таблице нет»

End If

End Sub

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

Понравилась статья? Поделить с друзьями:
  • Vba excel если if счетесли
  • Vba excel замена части строки
  • Vba excel доступ к таблице
  • Vba excel замена символа строке
  • Vba excel дождаться выполнения