Форум по VBA и MS Office

VBA, Excel => VBA, макросы в Excel => Тема начата: Lina от 06 сентября 2017, 21:11

Название: Excel VBA: Поиск части текста с помощью макроса.
Отправлено: Lina от 06 сентября 2017, 21:11
У меня возник вопрос. Я его оформила в Excel. Сама задача очень просто решается в Excel. Я бы использовала =VLOOKUP("*"&A2&"*";Tabelle2!B:D;3;0).
Но я бы хотела это автоматизировать в макросе. Я пыталась сделать через Formula.R1C1 и Index Match, но насколько я поняла RC не может искать часть текста из ячейки. Есть ли какие-нибудь другие варианты решения этого вопроса?

[вложение удалено администратором]
Название: Re: Excel VBA: Поиск части текста с помощью макроса.
Отправлено: Администратор от 06 сентября 2017, 22:20
Макросы есть двух видов:
1) в виде формулы
2) макросы, которые запускаются кнопкой или другими способами

Вам какой вариант нужен?
Название: Re: Excel VBA: Поиск части текста с помощью макроса.
Отправлено: Lina от 06 сентября 2017, 22:52
второй
Название: Re: Excel VBA: Поиск части текста с помощью макроса.
Отправлено: Администратор от 06 сентября 2017, 22:57
На листе "Tabelle2" в столбце "B" данные находятся всегда после слеша? Если да, то может быть тогда разбивать данные в ячейке по слешу и анализировать вторую часть?
Название: Re: Excel VBA: Поиск части текста с помощью макроса.
Отправлено: Lina от 07 сентября 2017, 12:36
Да, данные всегда после слеша. Поэтому я и подумала вытаскивать их в отдельный столбец.
Название: Re: Excel VBA: Поиск части текста с помощью макроса.
Отправлено: Администратор от 07 сентября 2017, 16:22
Вариант с использованием эксель-функции ВПР (в VBA функция ВПР называется "VLookup").
В вашем файле-примере есть правые концевые пробелы, которые изменяют слова, поэтому нужно сделать так, чтобы не было лишних пробелов.

Макрос
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
[свернуть]
Название: Re: Excel VBA: Поиск части текста с помощью макроса.
Отправлено: Lina от 07 сентября 2017, 19:54
Спасибо большое за помощь!