Sub FindSymbol()
Dim aData(), aSpl
Dim lRw As Long, i As Long, k As Long, j As Long
With Worksheets("sheet1") ' лист с исходными данными'
lRw = .Cells(.Rows.Count, 1).End(xlUp).Row 'последняя строка с данными в столбце А'
aData = .Range("A1:A" & lRw).Value ' тексты заносим в массив'
End With
' определяем (с запасом) размерность массива результата'
ReDim aRes(1 To lRw * 5, 1 To 1) ' 5 - макс к-во фрагментов в текстах'
For i = 2 To lRw ' цикл по текстам, начиная со стоки 2'
aSpl = Split(aData(i, 1), "#") ' расщепляем на фрагменты'
For j = 0 To UBound(aSpl)
k = k + 1: aRes(k, 1) = aSpl(j) ' записываем фрагменты в массив результата'
Next j
Next i
With Worksheets("sheet1") ' лист для выгрузки'
.Columns(3).ClearContents ' чистим столбец С'
.Range("C2").Resize(k, 1).Value = aRes ' выгружаем результат в столбец С'
End With
MsgBox "OK", 64, "" ' радуемся :)'
End Sub
Для выгрузки в исходный диапазон вместо последнего блока With/End With записать строку
Worksheets("sheet1").Range("A2").Resize(k, 1).Value = aRes ' выгружаем результат в столбец A'
Можно формулой.
-
Для одной ячейки, результат по строкам:
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ(«#»&$A$2;»#»;ПОВТОР(» «;99));СТРОКА(A1)*99;99))
-
Для диапазона ячеек, результат по столбцам:
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ(«#»&$A2;»#»;ПОВТОР(» «;99));СТОЛБЕЦ(A1)*99;99))
Хотя для разнесения по столбцам можно проще — применить инструмент
Данные-Текст_по_столбцам-С_разделителем
- Для диапазона ячеек, результат по строкам.
В доп. столбце находим количество фрагментов для подсказки основной формуле: в первой строке диапазона — 1, ниже формула
=ДЛСТР(A2)-ДЛСТР(ПОДСТАВИТЬ(A2;"#";))+1+B2
Результат:
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ("#"&ИНДЕКС($A$2:$A$20;ПОИСКПОЗ(СТРОКА(A1);$B$2:$B$20));"#";ПОВТОР(" ";99));(СТРОКА(A1)-ИНДЕКС($B$2:$B$20;ПОИСКПОЗ(СТРОКА(A1);$B$2:$B$20))+1)*99;99))
Метод 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 |
Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Range.Find method (Excel) |
vbaxl10.chm144128 |
vbaxl10.chm144128 |
excel |
Excel.Range.Find |
d9585265-8164-cb4d-a9e3-262f6e06b6b8 |
08/14/2019 |
high |
Range.Find method (Excel)
Finds specific information in a range.
[!includeAdd-ins note]
Syntax
expression.Find (What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
expression A variable that represents a Range object.
Parameters
Name | Required/Optional | Data type | Description |
---|---|---|---|
What | Required | Variant | The data to search for. Can be a string or any Microsoft Excel data type. |
After | Optional | Variant | The cell after which you want the search to begin. This corresponds to the position of the active cell when a search is done from the user interface.
Notice that After must be a single cell in the range. Remember that the search begins after this cell; the specified cell isn’t searched until the method wraps back around to this cell. If you don’t specify this argument, the search starts after the cell in the upper-left corner of the range. |
LookIn | Optional | Variant | Can be one of the following XlFindLookIn constants: xlFormulas, xlValues, xlComments, or xlCommentsThreaded. |
LookAt | Optional | Variant | Can be one of the following XlLookAt constants: xlWhole or xlPart. |
SearchOrder | Optional | Variant | Can be one of the following XlSearchOrder constants: xlByRows or xlByColumns. |
SearchDirection | Optional | Variant | Can be one of the following XlSearchDirection constants: xlNext or xlPrevious. |
MatchCase | Optional | Variant | True to make the search case-sensitive. The default value is False. |
MatchByte | Optional | Variant | Used only if you have selected or installed double-byte language support. True to have double-byte characters match only double-byte characters. False to have double-byte characters match their single-byte equivalents. |
SearchFormat | Optional | Variant | The search format. |
Return value
A Range object that represents the first cell where that information is found.
Remarks
This method returns Nothing if no match is found. The Find method does not affect the selection or the active cell.
The settings for LookIn, LookAt, SearchOrder, and MatchByte are saved each time you use this method. If you don’t specify values for these arguments the next time you call the method, the saved values are used. Setting these arguments changes the settings in the Find dialog box, and changing the settings in the Find dialog box changes the saved values that are used if you omit the arguments. To avoid problems, set these arguments explicitly each time you use this method.
Use the FindNext and FindPrevious methods to repeat the search.
When the search reaches the end of the specified search range, it wraps around to the beginning of the range. To stop a search when this wraparound occurs, save the address of the first found cell, and then test each successive found-cell address against this saved address.
To find cells that match more complicated patterns, use a For Each…Next statement with the Like operator. For example, the following code searches for all cells in the range A1:C5 that use a font whose name starts with the letters Cour. When Microsoft Excel finds a match, it changes the font to Times New Roman.
For Each c In [A1:C5] If c.Font.Name Like "Cour*" Then c.Font.Name = "Times New Roman" End If Next`
Examples
This example finds all cells in the range A1:A500 in worksheet one that contain the value 2, and changes the entire cell value to 5. That is, the values 1234 and 99299 both contain 2 and both cell values will become 5.
Sub FindValue() Dim c As Range Dim firstAddress As String With Worksheets(1).Range("A1:A500") Set c = .Find(2, lookin:=xlValues) If Not c Is Nothing Then firstAddress = c.Address Do c.Value = 5 Set c = .FindNext(c) Loop While Not c Is Nothing End If End With End Sub
This example finds all cells in the range A1:A500 on worksheet one that contain the substring «abc» and then replaces «abc» with «xyz».
Sub FindString() Dim c As Range Dim firstAddress As String With Worksheets(1).Range("A1:A500") Set c = .Find("abc", LookIn:=xlValues) If Not c Is Nothing Then firstAddress = c.Address Do c.Value = Replace(c.Value, "abc", "xyz") Set c = .FindNext(c) Loop While Not c Is Nothing End If End With End Sub
[!includeSupport and feedback]
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
1 |
||||
Поиска символов в ячейках и их замена02.02.2017, 14:48. Показов 9619. Ответов 14 Метки нет (Все метки)
Нужно найти определенное слово в ячейке и заменить без изменения остальных слов в этой ячейке.
но он не подходит, т.к. ищет значение всей ячейки а не только некоторых символов из нее.
0 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
02.02.2017, 15:53 |
2 |
|||
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
02.02.2017, 16:22 |
3 |
|||
Заменить можно без цикла и поиска
1 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
03.02.2017, 08:54 [ТС] |
4 |
|||
Заменить можно без цикла и поиска
что значит xlPart ?
0 |
CyberHelp 6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
||||||||||
03.02.2017, 10:26 |
5 |
|||||||||
1)
2)
Смотрите вложенный файл. P.S. Вложения
1 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||||||
03.02.2017, 13:19 [ТС] |
6 |
|||||||
А если у меня есть столбец 1 А мне нужно получить 2
Получаю весь столбец с 1. Т.е. мне надо чтобы если он заменил в одной ячейке 1 на 2, он переходил к другой и менял там 2 на 1, а не эту же ячейку заменял. Какое условие написать?
это неправильно, но нужно что-то типа вот такого как это сделать? Добавлено через 11 минут 1 2
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
03.02.2017, 20:23 |
7 |
|||
Сообщение было отмечено The_Fog как решение РешениеНа небольшом диапазоне можно и так :
1 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
06.02.2017, 11:33 [ТС] |
8 |
|||
а что значат эти звездочки около 1 =)
0 |
1024 / 227 / 21 Регистрация: 20.05.2016 Сообщений: 971 Записей в блоге: 19 |
|
06.02.2017, 13:19 |
9 |
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
06.02.2017, 17:03 |
10 |
The_Fog, * это символ подстановки, обозначающий любое количество символов (в т.ч. 0), впрочем, если он Вас «пугает», то замените на If InStr(x, 1) > 0 Then
0 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
07.02.2017, 15:07 [ТС] |
11 |
|||
pashulka,
Вообще ничего не меняет =(
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
07.02.2017, 18:42 |
12 |
The_Fog, А у меня меняет
1 |
0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
|
09.02.2017, 17:39 [ТС] |
13 |
pashulka, Спасибо все работает, просто у меня данные были на 3 листе =) Еще вопрос чтоб темы не плодить, а если ячейки объединенные DE и в символах есть пробелы как делать replace к какой ячейки обращаться?
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
09.02.2017, 19:04 |
14 |
The_Fog, Если об’единены ячейки столбцов D и E, то просто перебирайте ячейки столбца D
1 |
0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
|
10.02.2017, 12:04 [ТС] |
15 |
pashulka, Спасибо вам за помощь ! =)
0 |
Поиск символа в ячейке |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить | ||||||||
Ответить |