Вы пробуете сделать выбор из того, что выбора не имеет. Т.е., если бы Вы проверяли только наличие слова «Форум1», тогда применение Select Case было бы оправданным, например
Visual Basic | ||
|
В Вашем случае Вы ищете три разных выражения, и тогда лучьше использовать что-то другое, как подсказывает, например, Pavel55.
И все-таки желательно применять .Value, vbTextCompare (vbBinaryCompare)
Добавлено через 4 часа 19 минут
Давайте тогда добьем строковую функцию instr() до конца.
Никогда не возникала у меня подобная ситуация, но не так давно участник форума Скрипт посоветовал применить Instr() совместно с функцией, к примеру, Ucase() — тоже строковая фукция. И буквально на следующий день…. Поэтому и Вам передаю его совет. Все-таки лучьше застраховаться и писать в функции следующим образом (или что-то подобное):
Visual Basic | ||
|
Что б понять, прогоните где-то в модуле выражение:
Visual Basic | ||
|
При этом, сами значения mStr и cells(i,1).value изменится только в момент (и на момент) применения ф-ции InStr для сравнения. Но это не панацэя!
Удачи.
Tanya15 Пользователь Сообщений: 5 |
Здравствуйте, подскажите, пожалуйста, как правильно прописать код VBA. |
V Пользователь Сообщений: 5018 |
и что дальше с этим делать будете? |
Пытливый Пользователь Сообщений: 4587 |
Варианты: Воспользоваться методом Find для диапазона. Вопрос — что дальше с ними делать надо? upd V, опередил с вопросом! Кому решение нужно — тот пример и рисует. |
Nordheim Пользователь Сообщений: 3154 |
#4 02.02.2018 11:12:01
Изменено: Nordheim — 02.02.2018 11:13:37 «Все гениальное просто, а все простое гениально!!!» |
||
Tanya15 Пользователь Сообщений: 5 |
Мой пример Sub Кнопка2_Щелчок() If Cells(i, j) = «яблоко» Then End Sub
В итоге считает только «яблоко», а зеленые и красные не учитывает. Необходимо, чтобы считал по всем ячейкам в которых содержится слово «яблоко» Изменено: Tanya15 — 02.02.2018 12:10:19 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Казанский Пользователь Сообщений: 8839 |
#6 02.02.2018 12:13:03 Tanya15,
|
||
Tanya15 Пользователь Сообщений: 5 |
Все так просто Спасибо! |
Nordheim Пользователь Сообщений: 3154 |
#8 02.02.2018 12:17:43 под ваш пример.
Изменено: Nordheim — 02.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!
asked Feb 23, 2012 at 16:13
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 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 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 EachDim iWord As 400, что там я видимо слишком сделать — 20х20alucard91 ячейки — 10;
в макросе. Я SingleTanya15Вот код, но
AlexM i1 For iVlad999yl3d
: Можно как-нибудь так. беру цену 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 и IndexFor i = как правильно прописать ничем не поможет,китин 4 .Pattern = у msVlad999 и условия 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 inputAlexM 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 отработал — значит целиком…alucard91pashulka правильно: =ЕСЛИ(ЕОШИБКА(ПОИСК(«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 EndAlexM
Пытливый
= 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 = 0VAleks777
букв в формуле
Мне необходимо собратьyl3d i = 5
C5:C17 — в ячейке и вернет: спасибо! instr то Exit For Endalucard91 бы легче. очень компактный код, Variant, iCell As ПОИСК(«AN85A»;A1) при отрицательномKuzmichNext 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_speciartsmartHugo121
дискус):Вот только как 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 Notazat ячейке с 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Может Вы хотите — уже нет. и т.д.) Exitalucard91 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- берет Ф.И.О пустой. из стадий может найденным ячейкам aVlad999вроде работает и (в разных форматах, есть остатки!) данных, ну и xlWhole на xlPart: [A:A] :Как при помощи For i = j) like «*яблоко*»Nordheim Object Dim strLine
человека (столбец 1),200?’200px’:»+(this.scrollHeight+5)+’px’);»> встречаться «передача», которая = FR.Address ‘—запоминаем: на листе один показывает ВЕРНО/НЕВЕРНО с пробелом,точкой илиЭто для начала, в данном случае или добавьте символalucard91Private 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 (с пробелом или
Hugo121alucard91 ключи говорят что ключей, например, запятую Range Set iSource столбца 1 - Not FoundCell IsNordheim 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.NameVlad999Макросами проще. Загонять
прайсов и базы: Всем доброго времени в самом документе.
: без пробелов 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 NothingLina1515
Next i ‘итог Set fso = таблица) нужно сделатьПринцип работы оченьдля тестирования кнопка 1) = ms <> «Поиск» Thenartsmart: Открой секрет как ввести(в inputbox) не вкладке что и т.д. End If NextHugo121 содержит слово из Then .Cells(i, 2).Value: Всем доброго времени MsgBox «На листе
Nothing End Sub так, чтобы через нравится. Но можно test в файл-примере, ‘————————- adr = Set FR =
: Вот сделал два ты получил 9792,02?
полное содержание ячейки, описание, только сбоку.То теперь, когда
End Sub
: Добавляем к значению первого столбца. = cell(1, 3) суток!
» & iCnt1Hugo121 vba ексель находил без выноса? как-то кнопка clean -очистить: «» Next End Ws.Cells.Find(f) If Not файла вырезкаОт сюда? которое надо обработатьБольшое спасибо за выяснилось, что искомоеalucard91 ячейки по пробелуНадеюсь не сильно Next i EndЯ недавно начала & » ябл.»: Обычно нужно вставлять в этом файле
CyberForum.ru
Поиск конкретного слова из текста в ячейке (Формулы/Formulas)
в формуле прописатьКод =ЕСЛИ(СЧЁТЕСЛИ(B7:E7;»*Передача*»)>0;»Есть»;»Нет»)
Sub FR Is Nothing
Прайслист поставщика 1artsmart
(например: желтый дом), внимание.
значение может содержать: Hugo121, простите, Ваш по концам (в запутал. Спасибо)) With End Sub работать в VBA, & vbLf & не одно значение, определенные строки и (документ итак забит
Svsh2015
yl3d
Then adr =страница 2 -
: Через вспомогательные файлы а одно словоpashulkaнесколько слов вариант с пробелами
переменной).
pashulkaLina1515
поэтому у меня «В массиве «
а много, и
выставлял в конкретные до отказа).: добрый вечер,можно также
: Vlad999 , один adr & «
база данных SQL вообще-то делал «желтый» или «дом»:, возник мой вопрос. показался мне слишком
Цикл по 20х20: Excel ? Word
: Спасибо большое! возник маленький вопрос. & iCnt2 & разных. Поэтому есть
ячейки ексель приПытливый использовать макрос,кнопка yy
адрес- одна ячейка. » & Ws.Nameнужно из 1Из прайса всю или если возможно(так
alucard91Hugo121 запутанным. (можно 2 вложенных), ?azat Я его оформила » ябл.» End
смысл сперва прочитать этом, чтобы взятая: YouGreed, в файл-примере:Vlad999 , не & "!" &
страницы строку разбиваю на для общего развития), На первый взгляд,: Вопрос понятен.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 adrartsmart
сравниваются сАпострофф- задачи непонятно, что буду пытаться составитьЕсли нашли - адюльтер», то какой 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
Содержание
- VBA Excel «contains» операторы?
- 3 ответа 3
- Проверка условий (If…Then…)
- Краткое руководство по VBA If Statement
- Что такое IF и зачем оно тебе?
- Тестовые данные
- Формат операторов VBA If Then
- Простой пример If Then
- Условия IF
- Использование If ElseIf
- Использование If Else
- Используя If And/If Or
- Функция IIF
- Использование 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:
|
LookAt | Поиск частичного или полного совпадения. Список констант xlLookAt:
|
SearchOrder | Определяет способ поиска. Список констант xlSearchOrder:
|
SearchDirection | Определяет направление поиска. Список констант xlSearchDirection:
|
MatchCase | Определяет учет регистра:
|
MatchByte | Условия поиска при использовании двухбайтовых кодировок:
|
SearchFormat | Формат поиска – используется вместе со свойством Application.FindFormat. |
* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments
и MsgBox xlNotes
.
В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.
Знаки подстановки для поисковой фразы
Условные знаки в шаблоне поисковой фразы:
- ? – знак вопроса обозначает любой отдельный символ;
- * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
- ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).
Простые примеры
При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:
- Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
- Если поисковая фраза в заданном диапазоне найдена не будет, метод 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 |
Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.