Excel中的字符串函数

Excel中的字符串函数,excel,string,formula,Excel,String,Formula,以下是示例文本: 输入: 1. AbST/1234342 2. Y_sRR/666 3. B.RE/1234 输出: 1. AST 2. YRR 3. BRE 基本上,我需要一个公式来获得斜杠前的前三个大写字母,而不考虑小写字母和符号。我不知道没有VBA如何实现这一点,但有了VBA,这就足够简单了: Function ExtractUppers(s As String, k As Long) As String 'Extracts the first k upper case let

以下是示例文本:

输入:

1. AbST/1234342
2. Y_sRR/666
3. B.RE/1234
输出:

1. AST
2. YRR
3. BRE

基本上,我需要一个公式来获得斜杠前的前三个大写字母,而不考虑小写字母和符号。

我不知道没有VBA如何实现这一点,但有了VBA,这就足够简单了:

Function ExtractUppers(s As String, k As Long) As String
    'Extracts the first k upper case letters from
    's, returning the result as a string
    'if there are fewer than k, the function returns
    'those that are found

    Dim letters As Variant
    Dim i As Long, j As Long
    Dim c As String
    ReDim letters(0 To k - 1) As String
    For i = 1 To Len(s)
        c = Mid(s, i, 1)
        If "A" <= c And c <= "Z" Then
            letters(j) = c
            j = j + 1
            If j = k Then Exit For
        End If
    Next i
    ExtractUppers = Join(letters, "")
End Function
函数将大写字母(s为字符串,k为长)提取为字符串
'从中提取前k个大写字母
,将结果作为字符串返回
'如果少于k,则函数返回
"被发现的,
作为变体的模糊字母
我和我一样长,我和我一样长
作为字符串的Dim c
将字母(0到k-1)重新输入为字符串
对于i=1到Len(s)
c=中部(s,i,1)

如果“A”如果您的Office 365/Excel 2016+具有
TEXTJOIN
功能,则可以使用数组公式:

=IFERROR(LEFT(TEXTJOIN("",TRUE,IF((CODE(MID(A1,ROW(INDIRECT("1:"&FIND("/",A1)-1)),1))>=65)*(CODE(MID(A1,ROW(INDIRECT("1:"&FIND("/",A1)-1)),1))<=90),MID(A1,ROW(INDIRECT("1:"&FIND("/",A1)-1)),1),"")),3),"")
要输入/确认数组公式,请在按住ctrl+shift键的同时按enter键。如果操作正确,Excel将在公式栏中看到的公式周围放置大括号
{…}

如果没有
TEXTJOIN
函数,可以使用用VBA编写的用户定义函数

下面是一个使用正则表达式的示例:

Option Explicit
Function upper3(S As String) As String
    Dim RE As Object, MC As Object
    Dim I As Long, sTemp As String

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .ignorecase = False
    .Pattern = "[A-Z](?=.*/)"
    Set MC = .Execute(S)
    If MC.Count >= 3 Then
        For I = 0 To 2
            sTemp = sTemp & MC(I)
        Next I
        upper3 = sTemp
    End If
End With
End Function
其中一个给出以下结果:


但是,公式将返回
/
前面的1-3个大写字母;只有在
/
前面至少有3个大写字母时,UDF才会返回结果。根据您的要求,可以将其中一个更改为另一个。

如果您有权访问该函数,这里是另一个公式选项。查看链接以了解更多信息


B1
中的公式:

=CONCAT(IF(CODE(MID(A1,ROW($A$1:INDEX(A:A,LEN(A1))),1))=TRANSPOSE(ROW($A$65:$A$90)),MID(A1,ROW($A$1:INDEX(A:A,LEN(A1))),1),""))
注意:这是一个数组公式,需要通过Ctrl+Shift+enter输入


我没有考虑到
“/”
,好像在您的示例数据中,后面不会有大写字母。如果存在,则必须将上述公式替换为:

=CONCAT(IF(CODE(MID(LEFT(A1,SEARCH("/",A1)),ROW($A$1:INDEX(A:A,SEARCH("/",A1))),1))=TRANSPOSE(ROW($A$65:$A$90)),MID(LEFT(A1,SEARCH("/",A1)),ROW($A$1:INDEX(A:A,SEARCH("/",A1))),1),""))

VBA几乎是微不足道的。没有它几乎是不可能的。无论如何,你都试过什么?你被困在哪里了?很好,Ron,如果用户确实有权访问
TEXTJOIN
,他也应该有权访问
CONCAT
,这可能会少一些麻烦。@JvdV谢谢。我已经忘记了那个功能。我要加上creditNice,我不知道这样的字符之间的比较!
=CONCAT(IF(CODE(MID(LEFT(A1,SEARCH("/",A1)),ROW($A$1:INDEX(A:A,SEARCH("/",A1))),1))=TRANSPOSE(ROW($A$65:$A$90)),MID(LEFT(A1,SEARCH("/",A1)),ROW($A$1:INDEX(A:A,SEARCH("/",A1))),1),""))