公式消除所有,但字母字符
我需要在Excel中清理一列名称,以消除所有非Alpha字符,包括句点,逗号,空格,连字符和撇号。
示例:将O'Malley-Smith, Tom, Jr.
更改为OMALLEYSMITHTOMJR
客户端要求这是一个Excel函数,否则我会用类似于replaceAll("[^a-zA-Z]", "").toUpperCase()
的快速Java程序来replaceAll("[^a-zA-Z]", "").toUpperCase()
。 我似乎无法find任何看起来像是一个现成的function,在整个一堆SUBSTITUTE
function之外做这件事 – 这似乎是每个单元一个。
如果这是我所需要的,我并不是非常stream利地开发自定义的macros。
我前段时间有类似的需求,发现一些很好的东西。
按Alt + F11打开Visual Basic编辑器。 插入一个新的模块并粘贴下面的代码。
Function CleanCode(Rng As Range) Dim strTemp As String Dim n As Long For n = 1 To Len(Rng) Select Case Asc(Mid(UCase(Rng), n, 1)) Case 48 To 57, 65 To 90 strTemp = strTemp & Mid(UCase(Rng), n, 1) End Select Next CleanCode = strTemp End Function
CleanCode现在是新function,您可以将其用作公式。
所以你要操作的string旁边的单元格复制=CleanCode(yourcell)
如果你想要走下VBA路线 – 你不能使用用户自定义函数(UDF)来改变你进入函数的单元格的值,但是你可以使用一个简单的macros,并利用微软的VBScript RegEx引擎:
Sub SO() Dim searchRange As Excel.Range Dim cell As Variant Dim RegEx As Object Set RegEx = CreateObject("VBScript.RegExp") With RegEx .Pattern = "[^a-zA-Z]" .Global = True .MultiLine = True End With Set searchRange = ActiveSheet.Range("A1:D5") '// Change as required For Each cell In searchRange.Cells If RegEx.test(cell) Then cell.Value = RegEx.Replace(cell.Value, vbNullString) cell.Value = UCase(cell.Value) Next cell Set searchRange = Nothing Set RegEx = Nothing End Sub
事实上,在一个单一的单元格内,可能出现一系列的替代品,例如:
=UPPER(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1," ",""),",",""),"'",""),".",""),"-",""))
当然可能需要“扩展”来覆盖其他非alpha字符。
另一个VBA解决scheme
Sub RemoveCrap() Dim varRange As Range Dim varWorkRange As Range Set varWorkRange = Range("A1:A10") For Each varRange In varWorkRange varVal = "" For i = 1 To Len(varRange.Value) varTemp = Mid(varRange.Value, i, 1) If Not (varTemp Like "[az]" Or varTemp Like "[AZ]") Then varStr = "" Else varStr = UCase(varTemp) End If varVal = varVal & varStr Next i varRange.Value = varVal Next End Sub