Excel的公式有助于分裂复杂的名称
我被委托进行一些string操作,今天一定是我头脑不好的一天,因为它比我想象的要困难得多。
第一列,第二列,第三列的第一,二,三个名字的首字母都要加上姓
另外我们需要保留标题。
这是一个现在的长名字的例子:
C Chrysostomou先生和Chrysostomou先生和A Chrysostomou女士
M Karseras女士和P Hadjisoteriou女士和E Athanasiou女士
A Theodorou女士和A Aristotelou先生和Naziri女士和Karmiou女士L Vazanias女士和G女士
Braithwaite&Mrs Helen West Mrs Vazanias&Mrs G Braithwaite&Mrs
Helen West奥林匹亚女士夫人&夫人T&mr女士&先生C&夫人K
Michaelides小姐JA圣诞老人和夫人MT圣诞老人Solomonides&夫人Lida
Santama小姐JA圣诞老人和夫人MT圣诞老人Solomonides&夫人Lida
圣诞老人Polydoros Polydorou先生和马洛夫人Themistocleous和西尔维亚太太
Polydorou先生Themis And Mrs Androulla先生和Nicholas先生和Vasso Gina女士
Demetriou SK Makkofaides夫人和Z Koullas先生和夫人Y Koullas&夫人R
Kleopa G Zorzy先生和H Louca Zorzy先生和S Stavropoulos先生和Mrs
Stavropoulos M Franceschina女士和C Eugeniou女士和OL Toumazides女士
T / a三杯蛋糕David先生和Eileen Nixon Dhnixon女士 – 办公室帐户
正如你所看到的,这些可以被认为是2人甚至3人之间的联合银行账户。 我们将不得不保留这个名字,可以是先生,小姐,女士,博士,或者是先生们的名字和姓氏的首字母,总数不能超过35个字符!
所以,这是我一直在网上search后一直在尝试的东西:
=IF(LEN(TRIM(E:E))-LEN(SUBSTITUTE(TRIM(E:E)," ",""))>=1,MID(TRIM(E:E),FIND(" ",TRIM(E:E))+1,1),"")& " " &IF(LEN(TRIM(E:E))-LEN(SUBSTITUTE(TRIM(E:E)," ",""))>=2,MID(SUBSTITUTE(TRIM(E:E)," ","",1),FIND(" ",SUBSTITUTE(TRIM(E:E)," ","",1))+1,1),"")
得到首字母缩写,但只有前两个
=RIGHT(J:J,LEN(J:J)-FIND(" ",J:J)+1)
得到姓,但不能正常工作。
我是在想这个还是在想这个?
我最好的方法是什么?
感谢Philip
这应该让你开始。
可以说你的数据看起来像这样
将此代码粘贴到模块中。 (注:此代码没有广泛的testing,但传达的信息)
Option Explicit Sub Sample() Dim MyAr As Variant Dim FinalAr() As String, TmpAr() As String Dim ws As Worksheet Dim lrow As Long, i As Long, n As Long, j As Long '~~> Set this to the relevant sheet Set ws = ThisWorkbook.Sheets("Sheet1") With ws '~~> get last row of col A lrow = .Range("A" & .Rows.Count).End(xlUp).Row '~~> Store the values in an array MyAr = .Range("A1:A" & lrow) '~~> Loop through the array and split it on "&" and store it in another array For i = LBound(MyAr) To UBound(MyAr) If InStr(1, MyAr(i, 1), "&") Then TmpAr = Split(MyAr(i, 1), "&") For j = LBound(TmpAr) To UBound(TmpAr) n = n + 1 ReDim Preserve FinalAr(n) FinalAr(n) = Trim(TmpAr(j)) Next j Else n = n + 1 ReDim Preserve FinalAr(n) FinalAr(n) = Trim(MyAr(i, 1)) End If Next i '~~> Past the outcome in Col B .Range("B1").Resize(UBound(FinalAr) + 1, 1).Value = Application.Transpose(FinalAr) '~~> Replace all mrs/mr etc .Columns(2).Replace What:="MRS", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False .Columns(2).Replace What:="MR", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False .Columns(2).Replace What:="MISS", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False '~~> Find Last Row of Col B lrow = .Range("B" & .Rows.Count).End(xlUp).Row '~~> Loop through col B and split the names For i = 2 To lrow If InStr(1, .Range("B" & i), " ") Then TmpAr = Split(Trim(.Range("B" & i)), " ") n = 1 For j = LBound(TmpAr) To UBound(TmpAr) .Range("B" & i).Offset(, n).Value = TmpAr(j) n = n + 1 Next Else .Range("C" & i).Value = .Range("B" & i).Value End If Next i End With End Sub
OutCome(截图)