1

Мне нужна формула, чтобы найти и вернуть первую букву в строке. Так что, если ячейка содержит:

1234(*&^%$23ADFG54

формула вернет:

A

EDIT # 1:

В настоящее время я использую следующую UDF:

Public Function FirstLetter(Sin As String) As String
    Dim i As Long, CH As String
    FirstLetter = ""
    For i = 1 To Len(Sin)
        If Mid(Sin, i, 1) Like "[A-Z]" Then
            FirstLetter = Mid(Sin, i, 1)
            Exit Function
        End If
    Next i
End Function

Но мне нужно решение не VBA.

2 ответа2

6

Это, вероятно, не самый элегантный, но он держится подальше от Ctrl+Shift+Enter.

=MIN(INDEX(ROW(INDIRECT("1:"&LEN(A1)))+((CODE(MID(UPPER(A1),ROW(INDIRECT("1:"&LEN(A1))),1))<65)+(CODE(MID(UPPER(A1),ROW(INDIRECT("1:"&LEN(A1))),1))>90))*1E+99,,))

Просто введите нормально. Заполните при необходимости. Обратите внимание, что UPPER делает его нечувствительным к регистру.

Как это устроено

  1. A - это ASCII-символ 65, а Z - 90. Эти числа могут быть получены из одного строкового символа с помощью функции CODE.
  2. Вам нужно пролистать строку, чтобы изучить символ за символом. Функция MID может отделить один символ из строки, но ей нужна начальная точка, которая будет увеличиваться на 1, пока не будет проверен каждый символ в строке.
  3. Обычно это делается с помощью функции ROW, такой как ROW(1:50) чтобы увеличивать числа от 1 до 50, если мы знали, что длина строки составляет 50 символов. Эта длина строки не гарантируется, поэтому мы должны сконструировать ссылку на строку, используя 1, и функция LEN затем превратить эту объединенную строку в пригодный для использования адрес диапазона ячеек рабочего листа с помощью функции INDIRECT.
  4. В строке была использована функция UPPER, поэтому нам нужно искать только коды символов ASCII в верхнем регистре. Если это не было сделано, критерии должны были бы быть удвоены, чтобы также сравнить их с кодами ASCII 97 (например, a) и 122 (например, z).
  5. Функция INDEX используется в форме массива, чтобы обеспечить итерацию для обхода строки символ за символом. Любой выделенный символ, который находится за пределами AZ, приводит к тому, что число, возвращаемое ROW(1:<length-of-string>) в этой позиции, умножается на 1E+99 (очень большое число, а не минимальное значение на листе). ). Если оно находится в пределах AZ, позиция или ROW(1:<length-of-string>) остается тем же значением.
  6. Таким образом, INDEX возвращает массив чисел (или позиций), некоторые из которых находятся в диапазоне 1E+99. Функция MIN принимает наименьшее из них, которое представляет первый буквенный символ в строке.
  7. Используя эту формулу в первой ячейке, заполните ее, если необходимо, чтобы оценить все строки в столбце A. Easy-peasy.

Может быть, стоит отметить, что использование ROW подобного этому, для предоставления возрастающего ряда чисел для обработки массива, как правило, отключается путем блокировки фактических чисел в виде абсолютных значений, таких как ROW($1:$50) поэтому они не изменяются при заполнении. В этом нет необходимости, так как «1:» является текстом и не изменится, когда копируется / заполняется в другое место.

3

Еще один способ определения позиции

Column B

=MIN(FIND({"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"},UPPER(A1)&"ABCDEFGHIJKLMNOPQRSTUVWXYZ"))

Это возвращает позицию первой найденной буквы. Возвращает Len(A1) + 1, если письмо не найдено.

Первый аргумент Find - это массив всех букв, которые нужно найти в строке. Второй аргумент - это действительная строка в верхнем регистре вместе со всеми буквами в конце, так что функция find всегда возвращает значение для всех букв.

Column C

=IF(LEN(A1) >= B1, RIGHT(LEFT(A1, B1),1), "")

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

Ссылка:https://exceljet.net/formula/split-text-and-numbers

Ссылка предоставляет решение для номеров. Приведенная выше формула переключается на буквы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .