例如,在字符串VA4940--05-LAMB - ,%2--中,2是最后一个字母数字字符。它位于第22位。我正在寻找一个会返回“22”的公式。
感谢所有回复的人。这给了我正在寻找的答案,特别是老虎的答案。但是,所有这些都很有帮助。
答案 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字符
用于每种字符类型的查找数组 * - 与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}
图。 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
基本上公式的作用是:
=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))
{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})
{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))))