Поиск символа в ячейке excel vba

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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример 1

Sub primer1()

Dim myPhrase As Variant, myCell As Range

myPhrase = «стакан»

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

If Not myCell Is Nothing Then

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

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

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

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

Else

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

End If

End Sub

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

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

Пример 2

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

Sub primer2()

Dim myPhrase As Variant, myCell As Range

myPhrase = 526.15

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

If Not myCell Is Nothing Then

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

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

End If

End Sub

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

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

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

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

Пример 3

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

Sub primer3()

Dim myPhrase As Variant, myCell As Range

myPhrase = «01.02.2019»

myPhrase = CDate(myPhrase)

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

If Not myCell Is Nothing Then

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

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

End If

End Sub

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

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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim x As Range: Application.ScreenUpdating = False
 Dim flag As Integer
 
    For Each x In Range("E2:E150")
    flag = 0
  
    If x.Value = "11" And flag = 0 Then
       x.Replace "11", "22"
       flag = 1
       End If
       
    If x.Value = "22" And flag = 0 Then
       x.Replace "22", "11"
    End If
    
     
    Next
    
    Application.ScreenUpdating = True

но он не подходит, т.к. ищет значение всей ячейки а не только некоторых символов из нее.
Может быть Find использовать, но как реализовать?



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

02.02.2017, 15:53

2

Visual Basic
1
X = Replace(X, "11", "22")



0



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

02.02.2017, 16:22

3

Заменить можно без цикла и поиска

Visual Basic
1
Range("E2:E150").Replace "11", "22", xlPart



1



The_Fog

0 / 0 / 2

Регистрация: 24.02.2016

Сообщений: 75

03.02.2017, 08:54

 [ТС]

4

Заменить можно без цикла и поиска

Visual Basic
1
Range("E2:E150").Replace "11", "22", xlPart

что значит xlPart ?



0



CyberHelp

6 / 6 / 1

Регистрация: 29.01.2017

Сообщений: 29

03.02.2017, 10:26

5

1)

Visual Basic
1
2
3
4
5
6
7
8
Public Sub NaitiNaVsemListe()
 
'proveryaet na liste vse ya4eiki i menyaet 22 na 11
 
    Cells.Replace What:="22", Replacement:="11", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
 
End Sub

2)

Visual Basic
1
2
3
4
5
6
7
8
9
Public Sub NaitiVDiapazone()
 
'nahodit i menyat 22 na 11 v fiksirovannom diapazone "A2:A4"
 
    Range("A2:A4").Select
    Selection.Replace What:="22", Replacement:="11", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub

Смотрите вложенный файл.

P.S.
xlPart это атрибут, указывающий искать в ячейке частично, а не всю ячейку целиком обрабатывать, по-английски part = «часть».

Вложения

Тип файла: rar Find.rar (16.1 Кб, 11 просмотров)



1



The_Fog

0 / 0 / 2

Регистрация: 24.02.2016

Сообщений: 75

03.02.2017, 13:19

 [ТС]

6

А если у меня есть столбец 1 А мне нужно получить 2
2 1
1 2
1 2
Я создаю цикл

Visual Basic
1
2
3
4
5
6
7
8
9
Sub Макрос1()
 
 Dim x As Range
    For Each x In Range("E2:E10")
    flag = 0
   x.Replace "1", "2", xlPart
   x.Replace "2", "1", xlPart
Next
End Sub

Получаю весь столбец с 1. Т.е. мне надо чтобы если он заменил в одной ячейке 1 на 2, он переходил к другой и менял там 2 на 1, а не эту же ячейку заменял. Какое условие написать?

Visual Basic
1
if (x.Replace "1", "2", xlPart)=False Then

это неправильно, но нужно что-то типа вот такого как это сделать?

Добавлено через 11 минут
Прошу прощения один столбец нужно заменить другим

1 2
2 1
1 2
1 2



0



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

03.02.2017, 20:23

7

Лучший ответ Сообщение было отмечено The_Fog как решение

Решение

На небольшом диапазоне можно и так :

Visual Basic
1
2
3
4
5
6
7
8
Dim x As Range
For Each x In Range("E2:E10")
    If x Like "*1*" Then
       x.Replace "1", "2", xlPart
    Else
       x.Replace "2", "1", xlPart
    End If
Next



1



The_Fog

0 / 0 / 2

Регистрация: 24.02.2016

Сообщений: 75

06.02.2017, 11:33

 [ТС]

8

Visual Basic
1
If x Like "*1*" Then

а что значат эти звездочки около 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,

Visual Basic
1
2
3
4
5
6
7
8
Dim x As Range
For Each x In Range("E2:E10")
    If x Like "*1*" Then
       x.Replace "1", "2", xlPart
    Else
       x.Replace "2", "1", xlPart
    End If
Next

Вообще ничего не меняет =(



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



Поиск символа в ячейке

agh1511

Дата: Четверг, 13.08.2020, 13:57 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
0% ±


Excel 2019

Добрый день!

Требуется помощь.
Есть столбец с данными (строк около 10000)
В столбце «O» есть числовые и текст типа 8568,88 и 8868.88
Необходимо выделить цветом все ячейки, где вместо запятой стоит точка именно в конкретном столбце «O»

Спасибо

 

Ответить

Nic70y

Дата: Четверг, 13.08.2020, 14:07 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 8136


Репутация:

1999

±

Замечаний:
0% ±


Excel 2010

[vba]

Код

u = InStr(ячейка, «.») ‘поиск точки
If u > 0 Тhen ‘если нашли

[/vba]можно попробовать формулу в Условном форматировании

АпДэйт
а вообще зачем оно Вам надо?
выделили столбец,
нажали ctrl+h
найти: .
заменить на: ,
заменить все
и все — нет больше точек.


ЮMoney 41001841029809

Сообщение отредактировал Nic70yЧетверг, 13.08.2020, 16:25

 

Ответить

agh1511

Дата: Пятница, 14.08.2020, 09:19 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
0% ±


Excel 2019

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

 

Ответить

Ответить

agh1511

Дата: Пятница, 14.08.2020, 09:28 |
Сообщение № 5

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
0% ±


Excel 2019

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

 

Ответить

Like this post? Please share to your friends:
  • Поиск символа в слове excel
  • Поиск символа в массиве excel
  • Поиск свободной ячейки в excel
  • Поиск с разных таблиц excel
  • Поиск с помощью vba excel