查找字符串中的第一个字母

Gar*_*ent 2 microsoft-excel

我需要一个公式来查找并返回字符串中的第一个字母。所以如果一个单元格包含:

1234(*&^%$23ADFG54
Run Code Online (Sandbox Code Playgroud)

该公式将返回:

A
Run Code Online (Sandbox Code Playgroud)

编辑#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
Run Code Online (Sandbox Code Playgroud)

但我需要一个非 VBA 解决方案。

小智 7

这可能不是最优雅,但它保持远离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,,))

只是Enter正常。根据需要填写。请注意,这UPPER使其不区分大小写。

这个怎么运作

  1. 是ASCII字符65和ž是90。这些数字可从使用一个字符串的字符来导出CODE功能
  2. 您需要逐个字符地爬行要检查的字符串。该MID功能可以从字符串中剥出的单个字符,但它需要一个起始点直到字符串中的每个字符已审查这将增加1。
  3. 通常,这是通过ROW 函数完成的,例如ROW(1:50),如果我们知道字符串长度为 50 个字符,则将数字从 1 递增到 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 列中的所有字符串。简单易行。

值得指出的是,使用ROW这样的方法来为数组处理提供递增的数字系列通常是通过将实际数字锁定为绝对值来关闭的,ROW($1:$50)这样它们在填充时就不会改变。这在这里是不必要的,因为“1:”是文本,当复制/填充到另一个位置时不会改变。