mirror of
https://github.com/bpmbpm/doc.git
synced 2026-04-30 12:30:52 +00:00
168 lines
7.9 KiB
Markdown
168 lines
7.9 KiB
Markdown
### 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")
|
||
```
|
||
|