Есть ли эффективный способ определить последнее совпадение символа / строки в строке, используя базовые функции? Т.е. не последний символ / строка из строки, но положение последнего вхождения символа / струны в строке. Search
и find
оба работают слева направо, поэтому я не могу думать, как применить без длинного рекурсивного алгоритма. И это решение сейчас кажется устаревшим.
excel-formula
geotheory
источник
источник
search
и для содержимогоfind
строки запроса , «match» - это стандартный термин, плюс связанный пример.Ответы:
С новыми версиями Excel приходят новые функции и, следовательно, новые методы. Хотя он может быть воспроизведен в более старых версиях (но я не видел его раньше), когда у вас есть Excel O365, он может использовать:
Это также может быть использовано для получения последней позиции (перекрывающихся) подстрок:
Хотя это позволяет нам больше не использовать произвольный символ замены и позволяет перекрывать шаблоны, «недостатком» является использование массива.
Примечание. Вы можете принудительно применить то же поведение в более старых версиях Excel, либо
Введено через CtrlShiftEnterили с помощью inline,
INDEX
чтобы избавиться от неявного пересечения:источник
Я думаю, я понимаю, что вы имеете в виду. Допустим, например, что вы хотите самый правый \ в следующей строке (которая хранится в ячейке A1):
Диск: \ Папка \ подпапка \ FileName.Ext
Чтобы получить позицию последнего \, вы должны использовать эту формулу:
Это говорит нам о том, что самый правый \ находится в 24-м символе. Он делает это путем поиска «@» и замены самого последнего «\» на «@». Он определяет последний с помощью
В этом сценарии подстрока просто "\", которая имеет длину 1, так что вы можете оставить разделение в конце и просто использовать:
Теперь мы можем использовать это, чтобы получить путь к папке:
Вот путь к папке без завершающего \
И чтобы получить только имя файла:
Тем не менее, здесь есть альтернативная версия получения всего справа от последнего экземпляра определенного символа. Таким образом, используя наш тот же пример, это также вернет имя файла:
источник
SUBSTITUTE
все (3) экземпляры\
с пустыми значениями (сокращение длины строки 3) -> что\
(3-е) является последним; замените это чем-то уникальным иFIND
положением этого уникального персонажа ... потрясающе ... спасибо!=ISNUMBER(SEARCH("@",A1))
, как предложено @ gwin003 .99
? Вы только предполагаете, что длина этих различных строк меньше 99? Смотрите этот ответ и этот ответ, который не делает такого предположения.Как насчет создания пользовательской функции и ее использования в формуле? VBA имеет встроенную функцию,
InStrRev
которая делает именно то, что вы ищете.Поместите это в новый модуль:
И ваша функция будет выглядеть так (при условии, что исходная строка находится в B1):
источник
tigeravatar и Жан-Франсуа Корбетт предложили использовать эту формулу для генерации строки справа от последнего вхождения символа "\"
Если символ, используемый в качестве разделителя, является пробелом "", то формула должна быть изменена на:
Не нужно упоминать, что символ "{" можно заменить любым символом, который "нормально" не встречается в тексте для обработки.
источник
Просто придумали это решение, VBA не нужна;
Найдите последнее вхождение "_" в моем примере;
Объяснил наизнанку;
Надеюсь, это было полезно.
источник
Вы можете использовать эту функцию, которую я создал, чтобы найти последний экземпляр строки в строке.
Конечно, принятая формула Excel работает, но ее слишком сложно читать и использовать. В какой-то момент вы должны разбиться на более мелкие куски, чтобы это можно было обслуживать. Моя функция ниже читабельна, но это не имеет значения, потому что вы вызываете ее в формуле, используя именованные параметры. Это делает использование этого простым.
Я использую это так:
источник
Принимая во внимание часть комментария, сделанного @SSilk, моей конечной целью действительно было получить все правее того последнего случая , альтернативный подход с очень простой формулой - скопировать столбец (скажем
A
) строк и в копию (скажем, Колонка B) применить поиск и замену. Например, взять пример:Drive:\Folder\SubFolder\Filename.ext
Это возвращает то, что остается (здесь
Filename.ext
) после последнего экземпляра любого выбранного символа (здесь\
), что иногда в любом случае является целью, и облегчает поиск позиции последнего такого символа с помощью короткой формулы, такой как:источник
Я немного опоздал на вечеринку, но, возможно, это могло бы помочь. Ссылка в вопросе имела похожую формулу, но моя использует оператор IF (), чтобы избавиться от ошибок.
Если вы не боитесь Ctrl + Shift + Enter, вы можете справиться с формулой массива.
Строка (в ячейке A1): "one.two.three.four"
Формула:
Результат: 14
Первый,
возвращает массив целых чисел от 1 до 99:
{1,2,3,4,...,98,99}
.Следующий,
возвращает массив строк длиной 1, найденных в целевой строке, а затем возвращает пустые строки после достижения длины целевой строки:
{"o","n","e",".",..."u","r","","",""...}
Следующий,
сравнивает каждый элемент в массиве со строкой "." и возвращает либо индекс символа в строке, либо FALSE:
{FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}
Последний,
возвращает максимальное значение массива:
14
Преимущества этой формулы в том, что она короткая, относительно простая для понимания и не требует каких-либо уникальных символов.
Недостатками являются обязательное использование Ctrl + Shift + Enter и ограничение длины строки. Это можно обойти с помощью варианта, показанного ниже, но этот вариант использует функцию OFFSET (), которая является изменчивой (читай: медленной) функцией.
Не уверен, что скорость этой формулы против других.
Варианты:
источник
В более новых версиях Excel (2013 и выше) флэш-заливка может быть простым и быстрым решением, см. Использование Flash Fill в Excel .
источник
Простой способ сделать это в VBA:
источник
Очень поздно для вечеринки, но простое решение - использовать VBA для создания пользовательской функции.
Добавьте функцию в VBA в WorkBook, Worksheet или VBA Module.
Тогда формула клетки
в ячейке, и строка, которую нужно искать в ячейке B1, заполнит ячейку текстом, заканчивающимся последним знаком "/" из ячейки B1. Нет ограничений по длине, нет неясных формул. Единственным недостатком, который я могу себе представить, является необходимость создания книги с поддержкой макросов.
Любая пользовательская функция VBA может быть вызвана таким образом, чтобы вернуть значение в формулу ячейки, в том числе в качестве параметра встроенной функции Excel.
Если вы собираетесь интенсивно использовать функцию, вам нужно проверить, нет ли символа в строке, строка пуста и т. Д.
источник
клетка
A1 = find/the/position/of/the last slash
Простой способ сделать это - перевернуть текст, а затем найти первый слэш как обычно. Теперь вы можете получить длину полного текста минус это число.
Вот так:
=LEN(A1)-FIND("/",REVERSETEXT(A1),1)+1
Это возвращает 21, позиция последнего /
источник
REVERSETEXT
не стандартная формула Excel