mirror of
https://github.com/bpmbpm/doc.git
synced 2026-05-01 21:10:37 +00:00
Create search-str.md
This commit is contained in:
parent
ff4d41aba5
commit
96e8014a09
1 changed files with 168 additions and 0 deletions
168
IT/programming/Excel/search-str.md
Normal file
168
IT/programming/Excel/search-str.md
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
### search String
|
||||
#### 1 ПОДСТАВИТЬ
|
||||
Нужна формула excel. Из ячейки берется строка и в ней ищет например, пятое вхождение символа х.
|
||||
Далее ищет в строке шестой символ х и возвращает всю подстроку между ними (между пятом по счету и шестым найденным символом х).
|
||||
|
||||
Для решения этой задачи в Excel потребуется **комбинированная формула** с использованием нескольких функций. Ниже — пошаговое объяснение и итоговая формула.
|
||||
|
||||
### Логика решения
|
||||
|
||||
1. **Найти позицию 5‑го вхождения символа «x»**
|
||||
Используем `ПОДСТАВИТЬ` + `НАЙТИ`, заменяя 5‑е вхождение на уникальный маркер (например, `@@@`), затем ищем позицию этого маркера.
|
||||
|
||||
2. **Найти позицию 6‑го вхождения символа «x»**
|
||||
Аналогично, заменяем 6‑е вхождение на маркер и находим его позицию.
|
||||
|
||||
3. **Выделить подстроку между 5‑м и 6‑м «x»**
|
||||
Используем `ПСТР`, задавая начальную позицию (после 5‑го «x») и длину (разница позиций 6‑го и 5‑го «x» минус 1).
|
||||
|
||||
---
|
||||
|
||||
### Итоговая формула
|
||||
|
||||
Пусть исходная строка находится в ячейке **A1**, а искомый символ — **«x»**.
|
||||
|
||||
```excel
|
||||
=ПСТР(A1;
|
||||
НАЙТИ("@@@"; ПОДСТАВИТЬ(A1; "x"; "@@@"; 5)) + 1;
|
||||
НАЙТИ("###"; ПОДСТАВИТЬ(A1; "x"; "###"; 6)) - НАЙТИ("@@@"; ПОДСТАВИТЬ(A1; "x"; "@@@"; 5)) - 1
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Пояснение к формуле
|
||||
|
||||
1. **`ПОДСТАВИТЬ(A1; "x"; "@@@"; 5)`**
|
||||
Заменяет **5‑е** вхождение «x» на `@@@`.
|
||||
|
||||
2. **`НАЙТИ("@@@"; ...)`**
|
||||
Находит позицию `@@@` (т. е. позицию 5‑го «x»).
|
||||
|
||||
3. **`ПОДСТАВИТЬ(A1; "x"; "###"; 6)`**
|
||||
Заменяет **6‑е** вхождение «x» на `###`.
|
||||
|
||||
4. **`НАЙТИ("###"; ...)`**
|
||||
Находит позицию `###` (т. е. позицию 6‑го «x»).
|
||||
|
||||
5. **`ПСТР(A1; начало; длина)`**
|
||||
- **начало** = позиция 5‑го «x» + 1 (чтобы не включать сам «x»);
|
||||
- **длина** = позиция 6‑го «x» − позиция 5‑го «x» − 1 (чтобы не включать 6‑й «x»).
|
||||
|
||||
---
|
||||
|
||||
### Пример работы
|
||||
|
||||
**Входные данные (A1):**
|
||||
`abcxdefxghixjklxmnoxpqr`
|
||||
|
||||
**Результат:**
|
||||
`jkl`
|
||||
*(подстрока между 5‑м и 6‑м «x»: `x**jkl**x`)*
|
||||
|
||||
---
|
||||
|
||||
### Важные замечания
|
||||
|
||||
- Если в строке **меньше 6 вхождений «x»**, формула вернёт ошибку `#ЗНАЧ!`.
|
||||
Чтобы избежать этого, добавьте проверку:
|
||||
```excel
|
||||
=ЕСЛИ(ДЛСТР(ПОДСТАВИТЬ(A1;"x";""))=ДЛСТР(A1)-6;
|
||||
ПСТР(A1; НАЙТИ("@@@"; ПОДСТАВИТЬ(A1;"x";"@@@";5))+1; НАЙТИ("###"; ПОДСТАВИТЬ(A1;"x";"###";6))-НАЙТИ("@@@"; ПОДСТАВИТЬ(A1;"x";"@@@";5))-1);
|
||||
"Недостаточно x")
|
||||
```
|
||||
|
||||
- Маркеры (`@@@`, `###`) должны быть **уникальными** (не встречаться в исходной строке). Если есть риск, замените их на другие комбинации (например, `___5___`, `___6___`).
|
||||
|
||||
- Формула работает для **одного символа** («x»). Для подстроки логика усложняется.
|
||||
|
||||
### 2 Без ПОДСТАВИТЬ
|
||||
Можно обойтись **без функции `ПОДСТАВИТЬ`** — через последовательное нахождение позиций вхождений с помощью `НАЙТИ` с заданным стартовым смещением.
|
||||
|
||||
## Принцип работы
|
||||
|
||||
Идея: каждый следующий вызов `НАЙТИ` стартует **после позиции предыдущего найденного символа**.
|
||||
|
||||
1. Находим 1‑е вхождение «x».
|
||||
2. Находим 2‑е — начиная с позиции (1‑е + 1).
|
||||
3. Повторяем до 5‑го и 6‑го вхождений.
|
||||
4. Выделяем подстроку между 5‑м и 6‑м «x».
|
||||
|
||||
## Итоговая формула (для ячейки A1, символ «x»)
|
||||
|
||||
```excel
|
||||
=ПСТР(
|
||||
A1;
|
||||
НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1) + 1) + 1) + 1) + 1) + 1;
|
||||
НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1) + 1) + 1) + 1) + 1) + 1) -
|
||||
НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1; НАЙТИ("x"; A1) + 1) + 1) + 1) + 1) - 1
|
||||
)
|
||||
```
|
||||
|
||||
## Пояснение
|
||||
|
||||
- **Нахождение 5‑го «x»**:
|
||||
Вложенные вызовы `НАЙТИ` с нарастающим смещением:
|
||||
```excel
|
||||
НАЙТИ("x"; A1; [позиция_4го] + 1)
|
||||
```
|
||||
Где `[позиция_4го]` — результат аналогичного вложенного поиска.
|
||||
|
||||
- **Нахождение 6‑го «x»**:
|
||||
Аналогично, но на один уровень глубже.
|
||||
|
||||
- **Извлечение подстроки**:
|
||||
- **Начало**: позиция 5‑го «x» + 1 (чтобы не включать сам «x»).
|
||||
- **Длина**: позиция 6‑го «x» − позиция 5‑го «x» − 1 (чтобы не включать 6‑й «x»).
|
||||
|
||||
## Пример
|
||||
|
||||
**Входные данные (A1)**:
|
||||
`abcxdefxghixjklxmnoxpqr`
|
||||
|
||||
**Результат**:
|
||||
`jkl`
|
||||
*(подстрока между 5‑м и 6‑м «x»: `x**jkl**x`)*
|
||||
|
||||
## Важные замечания
|
||||
|
||||
1. **Ограничения длины формулы**
|
||||
В Excel есть лимит на глубину вложенности функций. Для поиска 5–6‑го вхождения формула работает, но для бóльших номеров может превысить лимит.
|
||||
|
||||
2. **Обработка ошибок**
|
||||
Если в строке меньше 6 вхождений «x», формула вернёт `#ЗНАЧ!`. Добавьте проверку:
|
||||
```excel
|
||||
=ЕСЛИ(ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(A1;"x";""))>=6;
|
||||
[основная_формула];
|
||||
"Недостаточно x"
|
||||
)
|
||||
```
|
||||
*Проверка: число «x» в строке ≥ 6.*
|
||||
|
||||
3. **Читаемость**
|
||||
Формула громоздкая и трудно редактируется. Для сложных случаев лучше использовать:
|
||||
- **Power Query** (визуальный редактор);
|
||||
- **VBA** (пользовательская функция);
|
||||
- **Office Scripts** (для веб‑версии).
|
||||
|
||||
## Альтернатива: пользовательская функция (VBA)
|
||||
|
||||
Если допустима VBA, создайте функцию `GetSubstringBetweenX`:
|
||||
|
||||
```vba
|
||||
Function GetSubstringBetweenX(text As String, n1 As Integer, n2 As Integer, delimiter As String) As String
|
||||
Dim parts() As String
|
||||
parts = Split(text, delimiter)
|
||||
If UBound(parts) >= n2 Then
|
||||
GetSubstringBetweenX = parts(n1)
|
||||
Else
|
||||
GetSubstringBetweenX = "Недостаточно разделителей"
|
||||
End If
|
||||
End Function
|
||||
```
|
||||
|
||||
**Использование в Excel**:
|
||||
```excel
|
||||
=GetSubstringBetweenX(A1; 5; 6; "x")
|
||||
```
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue