我需要一个公式来查找并返回字符串中的第一个字母。因此,如果单元格包含:
1234(*&^%$23ADFG54
该公式将返回:
A
编辑#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 解决方案。
答案1
这可能不是最优雅的,但它远离了Ctrl++ 。ShiftEnter
=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
不区分大小写。
怎么运行的
- 一个A是 ASCII 字符 65 和是是 90。这些数字可以从单个字符串字符中使用CODE 函数。
- 您需要逐个字符地浏览要检查的字符串。MID 函数可以从字符串中剥离出一个字符,但它需要一个起点,该起点将增加 1,直到检查完字符串中的每个字符。
- 通常,这是通过ROW 函数如果我们知道字符串的长度为 50 个字符,则喜欢
ROW(1:50)
将数字从 1 递增到 50。无法保证该字符串的长度,因此我们必须使用 1 和LEN 函数然后将该连接的字符串转换为可用的工作表单元格范围地址INDIRECT 函数。 - 这UPPER 函数在字符串中使用了 ,这样我们只需查找大写 ASCII 字符代码。如果没有,则必须将标准加倍才能与 ASCII 代码 97 进行比较(例如A)和 122(例如是)。
- 这INDEX 函数用于其数组形式提供迭代以逐个字符地遍历字符串。任何被剥离的不在 AZ 内的字符都会导致
ROW(1:<length-of-string>)
该位置返回的数字乘以 1E+99(一个非常大的数字,而不是工作表上任何数字的最小值)。如果它是在 AZ 内,位置或ROW(1:<length-of-string>)
保持相同的值。 - 返回
INDEX
一个数字数组(又名职位),其中一些在 1E+99 范围内。MIN 函数取其中最小的一个,代表字符串中的第一个字母。 - 在第一个单元格中使用该公式,向下填充根据需要评估 A 列中的所有字符串。非常简单。
值得指出的是,使用ROW
这种方法为数组处理提供一系列递增的数字通常是通过将实际数字锁定为绝对值来实现的,这样ROW($1:$50)
它们在填充时就不会改变。这里没有必要这样做,因为“1:”是文本,复制/填充到另一个位置时不会改变。
答案2
确定位置的另一种方法
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
链接提供了数字的解决方案。上面的公式已切换为字母。