2015-09-18 142 views
1

例如,在字符串VA4940--05-LAMB - ,%2--中,2是最後一個字母數字字符。它在第22個地方。我正在尋找一個將返回「22」的公式。如何使用Excel公式找到Excel字符串中最後一個字母數字字符的位置?

感謝所有回覆的人。這給了我正在尋找的答案,特別是老虎的答案。不過,所有這些都很有幫助

+0

它是不成問題編寫一個專用VBA功能和在公式中使用呢? –

+0

http://stackoverflow.com/questions/18617349/excel-last-character-string-match-in-a-string – ergonaut

+0

如果可能的話,我想避免VBA。 –

回答

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的要高,如果必要的:

=LOOKUP(2,1/(ISNUMBER(SEARCH(MID(A1&REPT(" ",99),ROW($1:$99),1),"abcdefghijklmnopqrstuvwxyz1234567890"))),ROW($1:$99)) 
+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} 

最後,拿到最後一個匹配字符采取了整個事情的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自定義函數肯定更直接。

0

要找到首先最後字符\在一個字符串類型使用的position以下Array Formula

= [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首先字符或MAX最後字符

CLL:包含字符串細胞,以搜尋

[查找數組]:數組要用於驗證基於on 字符類型找到

字符類型叔 - 分類(參見圖1)

數字:0至9

阿爾法:A到Z (低級&大寫)

阿爾法國際 :ÀÃ012 012 012 012 012 38 (lower & upper case)

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

enter image description here圖1個

查找數組要用於字符 *的每個類型 - 短陣與UPPER功能使用(見圖。2)

數字{1,1;48,2;58,1}

阿爾法{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}

其他字符:{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}

enter image description here

圖2

這些陣列可以根據需要進行組合,例如在這種情況下,問題是問到找到字符串在最後的字母數字字符,我們將結合使用數字和Alpha數組。

字符串VA4940--05-LAMB --,%2--

對於此示例此字符串位於小區C21

讓我們替換陣列式的參數:

[首先最後] = >MAX

CLL =>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)))))

基本上什麼式確實是:

  1. 創建一個垂直數組,將字符串的每個字符分配到每行中,數組的高度由字符串的長度自動定義。

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, -, -}

  • 驗證字符的大寫ASCII代碼針對查找矢量的垂直陣列的每一行中如果失敗,則分配1;如果通過了驗證,則分配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))))

    部分結果:{1,2,3,4,5,6,,,9,10,,12,13,14,15,,,,,,21,,}

  • 最後檢索MAX(如我們在尋找的最後一個字符)在值數組,表示數組中符合查找數組條件的最後一個有效行。
  • MAX({1,2,3,4,5,6,,,9,10,,12,13,14,15,,,,,,21,,})

    與另外的樣品位置21

    參見圖3。 enter image description here

    圖3

    +0

    哇。這令人印象深刻。非常感謝你的幫助。我會在星期一嘗試這個,並讓你知道它是如何發生的。 –

    相關問題