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(截图)

在这里输入图像说明

Interesting Posts