如何使用Excel公式在Excel字符串中找到最后一个字母数字字符的位置?

时间:2015-09-18 18:45:56

标签: excel-formula

例如,在字符串VA4940--05-LAMB - ,%2--中,2是最后一个字母数字字符。它位于第22位。我正在寻找一个会返回“22”的公式。

感谢所有回复的人。这给了我正在寻找的答案,特别是老虎的答案。但是,所有这些都很有帮助。

3 个答案:

答案 0 :(得分:0)

如果您想要专用的VBA功能,这是一种方法。从:

开始
=ROW(OFFSET(F1,0,0,LEN(MyStr),1))
{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23}

作为数组公式输入(CTRL-SHIFT-ENTER --- 此答案中的所有公式都是数组公式)。如图所示,这将生成一系列整数1,2,... LEN(MyStr),其中MyStr是您的目标字符串,F1可以是第1行中的任何单元格。

将其嵌入MID函数中以在MyStr中生成单个字符数组:

=MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1)
{"V";"A";"4";"9";"4";"0";"-";"-";"0";"5";"-";"L";"A";"M";"B";" ";"-";"-";",";"%";"2";"-";"-"}

UPPER函数用作方便,因此无需测试小写字母字符。

将其嵌入CODE函数中以生成ASCII代码数组:

=CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))
{86;65;52;57;52;48;45;45;48;53;45;76;65;77;66;32;45;45;44;37;50;45;45}

现在确定哪些是(大写)字母。 IF函数会针对条件>=CODE("A")测试这些代码。如果该测试通过,我们将针对条件<=CODE("Z")执行另一项测试。如果两个测试都通过,我们知道它是一个字母,所以返回字符位置。否则返回零。

=IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))>=CODE("A"),IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))<=CODE("Z"),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),0),0)
{1;2;0;0;0;0;0;0;0;0;0;12;13;14;15;0;0;0;0;0;0;0;0}

到目前为止,我们只测试了alpha字符。现在,如果第一次测试失败,则不要返回0,而是用类似的测试代替数字:

=IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))>=CODE("A"),IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))<=CODE("Z"),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),0),IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))>=CODE("0"),IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))<=CODE("9"),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),0),0))
{1;2;3;4;5;6;0;0;9;10;0;12;13;14;15;0;0;0;0;0;21;0;0}

最后,要获取最后一个匹配的char,请获取整个事件的MAX

=MAX(IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))>=CODE("A"),IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))<=CODE("Z"),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),0),IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))>=CODE("0"),IF(CODE(MID(UPPER(A1),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),1))<=CODE("9"),ROW(OFFSET(F1,0,0,LEN(MyStr),1)),0),0)))

返回21(不是22 --- 22错了)。

VBA自定义功能肯定更直接。

答案 1 :(得分:0)

替代常规公式(无需数组输入)解决方案:

=LOOKUP(2,1/(ISNUMBER(SEARCH(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),"abcdefghijklmnopqrstuvwxyz1234567890"))),ROW(INDIRECT("1:"&LEN(A1))))

另外,根据您提供的示例字符串VA4940--05-LAMB --,%2--,最后一个字母数字字符(2)位于第21位,而不是22位。

相同的公式,但没有使用INDIRECT(它是一个易变的函数,通常应该避免)。该公式还假设任何给定字符串的最大长度为99或更小。如有必要,将99&#39调整为更高:

=LOOKUP(2,1/(ISNUMBER(SEARCH(MID(A1&REPT(" ",99),ROW($1:$99),1),"abcdefghijklmnopqrstuvwxyz1234567890"))),ROW($1:$99))

答案 2 :(得分:0)

要在字符串中找到第一最后 字符\类型position,请使用以下{{1} }:

Array Formula

其中:

[首先上次]:对{strong>第一个字符使用= [First or Last] ( CHOOSE( LOOKUP( CODE( UPPER( MID( Cll , ROW( $A$1 : INDEX( $A:$A , LEN( Cll ) , 0 )), 1))), [Lookup Array] ), "" , ROW( $A$1 : INDEX( $A:$A , LEN( Cll ))))) 最后使用MIN 字符

Cll :包含要搜索的字符串的单元格

[查找数组]:基于字符类型进行验证的数组

字符类型 - 分类 (参见图1)

数字:0到9

Alpha :A到Z (小写和大写)

阿尔法国际:ŠŽÀ¢Ã¢ÃÇÈÉËç¢ÏÏ¢ÌÕÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ情况下)

其他字符:任何其他ASCII字符

enter image description here 图。 1

用于每种字符类型的查找数组 * - 与MAX函数一起使用的短数组(参见图2)

数字UPPER

Alpha {1,1;48,2;58,1}

Alpha International {1,1;65,2;91,1}

其他字符: {1,1;138,2;139,1;142,2;143,1;159,2;160,1;192,2; 198,1;199,2;208,1;209,2;215,1;217,2;222,1}

enter image description here

图。 2

可以根据需要组合这些数组,例如在这种情况下,问题要求在字符串中找到最后的字母数字字符,因为我们将使用数字和Alpha数组合。< / p>

字符串{1,2;48,1;58,2;65,1;91,2;97,1;123,2;131,1;132,2;138,1; 139,2;142,1;143,2;154,1;155,2;156,1;157,2;158,1;160,2;192,1; 198,2;199,1;208,2;209,1;215,2;217,1;222,2;224,1;247,2;248,1}

对于此示例,此字符串位于单元格VA4940--05-LAMB --,%2--

让我们替换数组公式的参数:

[首先最后] =&gt; C21

Cll =&gt; MAX

[查找数组] =&gt; C21 - 字母数字

在单元格'{1,1;48,2;58,1;65,2;91,1}中输入以下数组公式:

G24

基本上公式的作用是:

  1. 创建一个垂直数组,将每个字符串分配到每一行中,数组的高度由字符串的长度自动定义。
  2. =MAX(CHOOSE(LOOKUP( CODE(UPPER(MID($C21,ROW($A$1:INDEX($A:$A,LEN($C21),0)),1))), {1,1;48,2;58,1;65,2;91,1}),"", ROW($A$1:INDEX($A:$A,LEN($C21)))))

    部分结果: MID($C21,ROW($A$1:INDEX($A:$A,LEN($C21),0)),1))

    1. 根据查找向量验证垂直数组每行中字符的大写ASCII代码如果失败则分配1,如果通过验证则分配2。
    2. {V, A, 4, 9, 4, 0, -, -, 0, 5, -, L, A, M, B, , -, -, ,, %, 2, -, -}

      部分结果: LOOKUP(CODE(UPPER( {V, A, 4, 9, 4, 0, -, -, 0, 5, -, L, A, M, B, , -, -, ,, %, 2, -, -}), {1,1;48,2;58,1;65,2;91,1})

      1. 根据先前的验证填充数组,将数组(或位置)中的行号分配给通过验证的人,并将失败的记录留空。
      2. {2,2,2,2,2,2,1,1,2,2,1,2,2,2,2,1,1,1,1,1,2,1,1}

        部分结果: CHOOSE({2,2,2,2,2,2,1,1,2,2,1,2,2,2,2,1,1,1,1,1,2,1,1},"", ROW($A$1:INDEX($A:$A,LEN($C21))))

        1. 最后检索数组中的{1,2,3,4,5,6,,,9,10,,12,13,14,15,,,,,,21,,} (因为我们正在查找最后一个字符)值,表示符合查找数组条件的数组中的最后一个有效行。 / LI>

          MAX

          排名 MAX({1,2,3,4,5,6,,,9,10,,12,13,14,15,,,,,,21,,})

          参见图3,附加样品。 enter image description here

          图。 3