[英]excel formula help to split complex names
我被要求进行一些字符串操作,今天一定是我头疼的日子,因为事实证明这比我预期的要困难得多。
我必须从第一,第二和第三列中提取第一,第二和第三名称的缩写以及所有姓氏
另外,我们需要保留标题。
这是现在的长名称示例:
C Crysostomou先生和N N Chrysostomou先生及A Chrysostomou夫人
M Karseras女士&P Hadjisoteriou女士&E Athanasiou女士
西奥多鲁夫人(Ms A Theodorou)和亚里士多德(Aristotelou)夫人,纳兹里(G Naziri)夫人和卡米欧(Karmiou)M女士
Braithwaite和太太Helen West太太L Vazanias和太太G Braithwaite和太太
海伦·韦斯特(Helen West)女士奥林匹亚·皮里杜(Olympia Pieridou)女士和T&mr女士M和C先生&K女士
Michaelides小姐JA Santamas女士和MT Santama女士-Solomonides女士和Lida女士
桑塔玛JA Santamas小姐和MT桑塔玛夫人-Solomonides&Lida夫人
Santama Mr Polydoros Polydorou和Maro Themistocleous夫人&Sylvia夫人
Polydorou先生Themis和Androulla夫人&Nicholas先生&Vasso Gina夫人
Demetriou SK Makkofaides夫人,Z Koullas夫人,Y Koullas夫人和R夫人
Kleopa先生G Zorzy女士和H Louca Zorzy女士&S Stavropoulos先生&Y女士
Stavropoulos女士Franceschina女士&C Eugeniou女士&OL Toumazides女士
T / a戴维先生和艾琳·尼克松夫人(Dhnixon&Co.)三杯蛋糕-办公室帐户
如您所见,这些可以被视为2人甚至3人之间的联合银行帐户。 我们必须保持礼节,可能是先生,小姐,女士,博士,医生或先生,以及名字的首字母缩写和全名,总数应少于35个字符!
所以,这是我在网上搜索后一直在尝试的方法:
=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),"")
得到首字母缩写,但只有前2个
=RIGHT(J:J,LEN(J:J)-FIND(" ",J:J)+1)
获得姓氏,但工作不正常。
我是在想这个,还是在想呢?
我最好的数据处理方法是什么?
谢谢菲利普
这应该使您入门。
可以说您的数据如下所示
将此代码粘贴到模块中。 (注意:此代码尚未经过广泛测试,但可以传达信息)
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(屏幕截图)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.