Извлечение (вырезание) части строки с помощью кода VBA Excel из значения ячейки или переменной. Функции Left, Mid и Right, их синтаксис и аргументы. Пример.
Эта функция извлекает левую часть строки с заданным количеством символов.
Синтаксис функции Left:
Left(строка, длина)
- строка — обязательный аргумент: строковое выражение, из значения которого вырезается левая часть;
- длина — обязательный аргумент: числовое выражение, указывающее количество извлекаемых символов.
Если аргумент «длина» равен нулю, возвращается пустая строка. Если аргумент «длина» равен или больше длины строки, возвращается строка полностью.
Функция Mid
Эта функция извлекает часть строки с заданным количеством символов, начиная с указанного символа (по номеру).
Синтаксис функции Mid:
Mid(строка, начало, [длина])
- строка — обязательный аргумент: строковое выражение, из значения которого вырезается часть строки;
- начало — обязательный аргумент: числовое выражение, указывающее положение символа в строке, с которого начинается извлекаемая часть;
- длина — необязательный аргумент: числовое выражение, указывающее количество вырезаемых символов.
Если аргумент «начало» больше, чем количество символов в строке, функция Mid возвращает пустую строку. Если аргумент «длина» опущен или его значение превышает количество символов в строке, начиная с начального, возвращаются все символы от начальной позиции до конца строки.
Функция Right
Эта функция извлекает правую часть строки с заданным количеством символов.
Синтаксис функции Right:
Right(строка, длина)
- строка — обязательный аргумент: строковое выражение, из значения которого вырезается правая часть;
- длина — обязательный аргумент: числовое выражение, указывающее количество извлекаемых символов.
Если аргумент «длина» равен нулю, возвращается пустая строка. Если аргумент «длина» равен или больше длины строки, возвращается строка полностью.
Пример
В этом примере будем использовать все три представленные выше функции для извлечения из ФИО его составных частей. Для этого запишем в ячейку «A1» строку «Иванов Сидор Петрович», из которой вырежем отдельные компоненты и запишем их в ячейки «A2:A4».
Sub Primer() Dim n1 As Long, n2 As Long Range(«A1») = «Иванов Сидор Петрович» ‘Определяем позицию первого пробела n1 = InStr(1, Range(«A1»), » «) ‘Определяем позицию второго пробела n2 = InStr(n1 + 1, Range(«A1»), » «) ‘Извлекаем фамилию Range(«A2») = Left(Range(«A1»), n1 — 1) ‘Извлекаем имя Range(«A3») = Mid(Range(«A1»), n1 + 1, n2 — n1 — 1) ‘Извлекаем отчество Range(«A4») = Right(Range(«A1»), Len(Range(«A1»)) — n2) End Sub |
На практике часто встречаются строки с лишними пробелами, которые необходимо удалить перед извлечением отдельных слов.
Lina1515 Пользователь Сообщений: 15 |
Всем доброго времени суток! Может кто-то уже сталкивался? Заранее спасибо за помощь! |
Kuzmich Пользователь Сообщений: 7998 |
#2 06.09.2017 21:23:36
Использовать Find |
||
Kuzmich Пользователь Сообщений: 7998 |
#3 06.09.2017 21:37:33
Макрос, запускать при активном листе Tabelle1, значения подтягиваются в столбец В. В ячейке с Potato уберите пробел в конце
|
||||
Nordheim Пользователь Сообщений: 3154 |
#4 06.09.2017 21:47:28
«Все гениальное просто, а все простое гениально!!!» |
||
Lina1515 Пользователь Сообщений: 15 |
#5 06.09.2017 21:51:09 Спасибо большое! |
На чтение 12 мин. Просмотров 18.1k.
Функция VBA InStr является одной из наиболее часто используемых функций в VBA. Он используется для нахождения текста внутри строки и действительно отлично справляется с работой.
Тем не менее, она часто используется, чтобы помочь извлечь часть строки, и эту задачу она выполняет плохо.
Если вы обнаружили, что извлечение текста в VBA является болезненным процессом, тогда читайте дальше. Эта статья покажет вам более простой и лучший способ, используя три реальных примера!
Содержание
- Краткое руководство к статье
- Краткая справка
- Введение
- Когда VBA InStr, Left, Right и Mid полезны
- Работа со строками различной длины
- Использование функции VBA InStr с Mid
- Функция Split
- Пример 1: Получение части имени файла
- Пример 2: диапазон IP-адресов
- Пример 3. Проверьте правильность имени файла
- Заключение
Краткое руководство к статье
В следующей таблице приведено краткое руководство к тому, что рассматривается в этой статье.
Строка | Тип | Задача | Как |
1234ABC334 | Фиксированный размер | Оставить слева 4 символа | Left(s,4) |
1234ABC334 | Фиксированный размер | Оставить справа 3 символа |
Right(s,3) |
1234ABC334 | Фиксированный размер | Оставить 5, 6, 7 символы | Mid(s,5,3) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить имя | Split(s,» «)(0) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить отчество |
Split(s,» «)(1) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить фамилию |
Split(s,» «)(2) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить фамилию |
Dim v As Variant v = Split(s, » «) lastname= v(UBound(v)) |
Краткая справка
Чтобы узнать больше об элементах, упомянутых в статье, перейдите по следующим ссылкам:
- Если вы хотите узнать больше о функциях InStr или InStrRev, пожалуйста, прочитайте Поиск в строке.
- Если вы хотите узнать больше о функциях Mid, Left или Right, посмотрите раздел Извлечение части строки.
- Для получения дополнительной информации о функции Split проверьте Строка в массив, используя Split.
- Оператор Like включен в Сравнение строк с шаблоном
Я использую Debug.Print в моих примерах. Он печатает значения в Immediate Window, которое вы можете просмотреть, нажав Ctrl + G (или выберите View-> Immediate Window)
Введение
В этой статье я собираюсь показать вам лучший способ извлечения символов из строки, чем использование функции VBA InStr с Left, Right или Mid.
Эта статья разбита следующим образом:
- Раздел 1: Как извлечь из строк фиксированного размера.
- Раздел 2: Как извлечь из строк переменного размера.
- Раздел 3: Как извлечь из строки переменного размера, используя функцию Split.
- Разделы с 4 по 6: некоторые примеры из реальной жизни.
Когда VBA InStr, Left, Right и Mid полезны
Если вы хотите проверить, содержит ли строка значение, InStr подходит для этой работы. Если вы хотите сделать простое извлечение, то отлично подойдут Left, Right и Mid.
Использование InStr для проверки, содержит ли строка текст
В следующем примере мы проверяем, содержит ли ФИО «Петрович». Если возвращаемое значение InStr больше нуля, то строка содержит значение, которое мы проверяем.
' Проверьте, содержит ли строка Петрович If InStr("Иван Петрович Сидоров", "Петрович") > 0 Then Debug.Print "Найдено" End If
Извлечение с Left, Right и Mid
Функция Left используется для получения символов слева от строки.
Функция Right используется для получения символов справа от строки.
Функция Mid используется для середины строки. Она такая же, как
Left, за исключением того, что вы даете ему стартовую позицию.
Sub IzvlechTekst() Dim s As String: s = "ABCD-7789.WXYZ" Debug.Print Left(s, 2) ' Печатает AB Debug.Print Left(s, 4) ' Печатает ABCD Debug.Print Right(s, 2) ' Печатает YZ Debug.Print Right(s, 4) ' Печатает WXYZ Debug.Print Mid(s, 1, 2) ' Печатает AB Debug.Print Mid(s, 6, 4) ' Печатает 7789 End Sub
Эти три функции работают нормально, если требуемый текст всегда одинакового размера и в одном и том же месте. Для других сценариев они требуют использования InStr, чтобы найти определенную позицию в строке. Это усложняет их использование.
Используйте Left, Right или Mid, когда символы всегда будут в одной и той же позиции.
Работа со строками различной длины
Многие из строк, с которыми вы имеет дело, разной длины. Простой пример — когда у вас есть дело со списком имен. Длина строки и требуемая часть (например, имя) могут каждый раз отличаться. Например:
Brooke Hilt
Pamela Jurado
Zack Kinzel
Eddy Wormley
Kaitlyn Rainer
Jacque Trickett
Kandra Stanbery
Margo Hoppes
Berenice Meier
Garrett Hyre
(Если вам нужен случайный список имен, попробуйте этот генератор случайных имен)
Использование функции VBA InStr с Left
В следующем примере мы собираемся получить имя из строки. В этой строке первое имя — это имя перед первым пробелом.
Мы используем функцию VBA InStr, чтобы получить позицию первого пробела. Мы хотим получить все символы до пробела. Мы вычитаем одну из позиции, так как это дает нам позицию последней буквы имени.
Sub PoluchitImya() Dim s As String, lPosition As Long s = "John Henry Smith" ' Печатает John lPosition = InStr(s, " ") - 1 Debug.Print Left(s, lPosition) s = "Lorraine Huggard" ' Печатает Lorraine lPosition = InStr(s, " ") - 1 Debug.Print Left(s, lPosition) End Sub
Давайте посмотрим на первый пример в приведенном выше коде. Первый пробел находится в позиции 5. Мы вычтем 1, что дает нам позицию 4. Это позиция последней буквы John, т.е.
Затем мы даем 4 функции Left, и она возвращает первые четыре символа, например, «John»
Мы можем выполнить ту же задачу в одной строке, передав возвращаемое значение из InStr в функцию Left.
Dim s As String s = "John Henry Smith" ' Печатает John Debug.Print Left(s, InStr(s, " ") - 1)
Использование функции VBA InStr с Right
В этом примере мы получим последнее слово в строке, то есть Smith. Мы можем использовать функцию InStrRev. Это то же самое, что InStr, за исключением того, что поиск выполняется с конца строки.
Важно отметить, что InStrRev дает нам позицию с начала строки. Поэтому нам нужно использовать его немного иначе, чем мы использовали InStr и Left.
Sub PoluchitFamiliyu() Dim s As String: s = "John,Henry,Smith" Dim Position As Long, Length As Long Position = InStrRev(s, ",") Length = Len(s) ' Печатает Smith Debug.Print Right(s, Length - Position) ' Альтернативный метод. Печатает Smith - делает в одну строку Debug.Print Right(s, Len(s) - InStrRev(s, ",")) End Sub
Как работает приведенный выше пример:
- Мы получаем позицию последнего пробела, используя InStrRev: 11
- Мы получаем длину строки: 16.
- Вычитаем позицию из длины: 16-11 = 5
- Мы даем 5 функции Right и возвращаем Smith
Использование функции VBA InStr с Mid
В следующем примере мы получим «Henry» из строки. Слово, которое мы ищем, находится между первым и вторым пробелом.
Мы будем использовать функцию Mid здесь.
Sub PoluchitVtoroeImya() Dim s As String: s = "John Henry Smith" Dim firstChar As Long, secondChar As Long Dim count As Long ' Найти пробел плюс 1. Результат 6 firstChar = InStr(s, " ") + 1 ' Найти 2-й пробел. Результат 11 secondChar = InStr(firstChar, s, " ") ' Получить число символов. Результат 5 count = secondChar - firstChar ' Печатает Henry Debug.Print Mid(s, firstChar, count) End Sub
Как видите, это сложно сделать и требует немного усилий, чтобы выяснить. Нам нужно найти первое место. Тогда нам нужно найти второе место. Затем мы должны вычесть одно из другого, чтобы дать нам количество символов, которые нужно взять.
Если у вас есть строка с большим количеством слов, то это может быть очень сложно. К счастью для нас, гораздо проще было извлечь символы из строки. Это называется функцией Split.
Функция Split
Мы можем использовать функцию Split для выполнения приведенных выше примеров. Функция Split разбивает строку на массив. Тогда мы можем легко получить доступ к каждому элементу.
Давайте попробуем те же три примера еще раз, и на этот раз мы будем использовать Split.
Dim s As String: s = "John Henry Smith" Debug.Print Split(s, " ")(0) ' John Debug.Print Split(s, " ")(1) ' Henry Debug.Print Split(s, " ")(2) ' Smith
Ого! Какая разница с использованием Split. Как это работает:
- Функция Split разбивает строку везде, где есть пробел.
- Каждый элемент помещается в массив, начиная с нуля.
- Используя номер местоположения, мы можем получить доступ к элементу массива.
В следующей таблице показано, как может выглядеть массив после использования Split.
Примечание: первая позиция в массиве равна нулю. Наличие нулевых массивов является стандартным в языках программирования.
0 | 1 | 2 |
John | Henry | Smith |
В приведенном выше коде мы разделяем строку каждый раз, когда ее используем. Мы также можем разделить строку один раз и сохранить ее в переменной массива. Тогда мы можем получить к нему доступ, когда захотим.
Sub SplitName() Dim s As String: s = "John Henry Smith" Dim arr() As String arr = Split(s, " ") Debug.Print arr(0) ' John Debug.Print arr(1) ' Henry Debug.Print arr(2) ' Smith End Sub
Если вы хотите узнать больше о массивах, я написал о них целую статью под названием «Полное руководство по использованию массивов в Excel VBA».
В следующих разделах мы рассмотрим примеры из реальной жизни. Вы увидите преимущество использования Split вместо функции InStr.
Пожалуйста, не стесняйтесь попробовать это сами. Это отличный способ учиться, и вы можете повеселиться, пытаясь понять их (или, может быть, только у меня так!)
Пример 1: Получение части имени файла
Представьте, что мы хотим извлечь числа из следующих имен файлов
«VB_23476_Val.xls»
«VV_987_Val.txt»
«VZZA_12223_Val.doc»
Это похоже на пример, где мы получаем второй элемент. Чтобы получить значения здесь, мы используем подчеркивание (то есть «_»), чтобы разбить строку. Смотрите пример кода ниже:
Sub PoluchitNomer() ' Печатает 23476 Debug.Print Split("VB_23476_Val.xls", "_")(1) ' Печатает 987 Debug.Print Split("VV_987_Val.txt", "_")(1) ' Печатает 12223 Debug.Print Split("ABBZA_12223_Val.doc", "_")(1) End Sub
В реальном мире вы обычно читаете такие строки из разных ячеек. Допустим, эти имена файлов хранятся в ячейках от А1 до А3. Мы немного изменим приведенный выше код:
Sub ChitatNomera() Dim c As Range For Each c In Range("A1:A3") ' Разделите каждый элемент по мере его прочтения Debug.Print Split(c, "_")(1) Next c End Sub
Пример 2: диапазон IP-адресов
Пример здесь взят из вопроса на веб-сайте StackOverflow.
У пользователя есть строка с IP-адресом в формате «BE-ABCDDD-DDS 172.16.23.3».
Он хочет, чтобы IP в диапазоне от 172,16 до 172,31 был действительным. Так например:
- «BE-ABCDDD-DDS 172.16.23.3» действителен
- «BE-ABCDDD-DDS 172.25.23.3» действителен
- «BE-ABCDDED-DDS 172.14.23.3» не действителен
- «BE-ABCDDDZZ-DDS 172.32.23.3» не действителен
Вот как бы я это сделал. Сначала я разбил строку по периодам. Число, которое мы ищем, находится между первым и вторым периодом. Поэтому это второй пункт. Когда мы разделяем строку, она помещается на первую позицию в массиве (помните, что массив начинается с нулевой позиции).
Полученный массив будет выглядеть так:
0 | 1 | 2 | 3 |
BE-ABCDDD-DDS 172 | 31 | 23 | 3 |
Код ниже показывает, как это сделать.
Sub IPAdd() ' Проверьте номер, чтобы проверить разные IP-адреса Dim s1 As String: s1 = "BE-ABCDDD-DDS 172.31.23.3" ' Разбить строку, используя символ точки Dim num As Long num = Split(s1, ".")(1) ' Проверьте правильность номера Debug.Print num >= 16 And num <= 31 End Sub
Пример 3. Проверьте правильность имени файла
В этом последнем примере мы хотим проверить правильность имени файла. Есть три правила.
- Должно заканчиваться на .pdf
- Он должен содержать АА
- Он должен содержать 1234 после А
В следующих таблицах показаны некоторые допустимые и недействительные элементы:
Имя файла | Статус |
AA1234.pdf | Действителен |
AA_ljgslf_1234.pdf | Действителен |
AA1234.pdf1 | Недействительно — не заканчивается на .pdf |
1234 AA.pdf | Недействительно — АА не до 1234 |
12_AA_1234_NM.pdf | Действителен |
Сначала мы сделаем это, используя функции InStr и Right.
Sub IspInstr() Dim f As String: f = "AA_1234_(5).pdf" ' Сначала найдите АА, так как 1234 должен идти после Dim lPos As Long: lPos = InStr(f, "AA") ' Ищите 1234 и убедитесь, что последние четыре символа - .pdf Debug.Print InStr(lPos, f, "1234") > 0 And Right(f, 4) = ".pdf" End Sub
Этот код очень грязный. К счастью для нас, у VBA есть Сравнение с шаблоном. Мы можем проверить шаблон строки без необходимости искать элементы и позиции и т.д. Мы используем оператор Like в VBA для сопоставления с шаблоном. Пример ниже показывает, как это сделать.
Sub IspSravnenie() Dim f As String: f = "AA_1234_(5).pdf" ' Определить шаблон Dim pattern As String: pattern = "*AA*1234*.pdf" ' Проверьте каждый элемент по шаблону Debug.Print f Like pattern ' ИСТИНА End Sub
В приведенном выше примере звездочка в шаблоне относится к любому количеству символов.
Давайте разберем этот паттерн * AA * 1234 * .pdf
*- любая группа символов
AA — точные символы AА
*- любая группа символов
1234 — точные символы 1234
*- любая группа символов
.pdf — точные символы .pdf
Чтобы показать, что это работает правильно, давайте попробуем это на всех именах примеров в таблице.
Sub IspSravnenieTest() ' Создать коллекцию имен файлов Dim coll As New Collection coll.Add "AA1234.pdf" coll.Add "AA_ljgslf_1234.pdf" coll.Add "AA1234.pdf1" coll.Add "1234 AA.pdf" coll.Add "12_AA_1234_NM.pdf" ' Определить шаблон Dim pattern As String: pattern = "*AA*1234*.pdf" ' Проверьте каждый элемент по шаблону Dim f As Variant For Each f In coll Debug.Print f Like pattern Next f End Sub
На выходе:
ИСТИНА
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ИСТИНА
Чтобы узнать больше о сопоставлении с шаблоном и ключевом слове Like, ознакомьтесь с этой публикацией.
Заключение
InStr и InStrRev действительно полезны только для простых задач, таких как проверка наличия текста в строке.
Left, Right и Mid полезны, когда положение текста всегда одинаково.
Функция Split — лучший способ извлечь переменную строку.
При попытке проверить формат строки, которая не является фиксированной по размеру, ключевое слово Like (т.е. Сопоставление с образцом) обычно обеспечивает более простое решение.
Sub Макрос()
Dim shSrc As Worksheet, shRes As Worksheet
Dim A(), res()
Dim lr As Long, i As Long
‘1. Присваиваем имена листам, с которыми надо работать. Затем
‘ в коде можно удобно обращаться к этим листам.
Set shRes = Worksheets(«Tabelle1»)
Set shSrc = Worksheets(«Tabelle2»)
‘2. Копируем данные из столбца A в массив. Это нужно для ускорения макроса,
‘ т.к. с массивом быстрее работать, чем с эксель-ячейками.
‘ Поиск последней строки. End — не работает со скрытыми строками.
lr = shRes.Cells(shRes.Rows.Count, «A»).End(xlUp).row
A() = shRes.Range(«A2:A» & lr).value
‘3. Создание ячеек в массиве-результате. Сначала в него запишутся данные,
‘ а затем массив будет вставлен на лист. Это тоже нужно для ускорения макроса.
ReDim res(1 To UBound(A, 1), 1 To 1)
‘4. Включение перехватчика ошибок. Ошибка будет происходить, если на листе-источнике
‘ нет искомого текста.
On Error Resume Next
‘5. Поиск и запись результата в массив «res».
For i = 1 To UBound(A, 1)
res(i, 1) = WorksheetFunction.VLookup(«*/» & A(i, 1), shSrc.Columns(«B:D»), 3, 0)
Next i
‘6. Отключение перехватчика ошибок.
On Error GoTo 0
‘7. Вставка результата в эксель.
shRes.Range(«C2»).Resize(UBound(res, 1)).value = res()
End Sub
[свернуть]
Поиск ячеек, содержащих определенное слова (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