消除除字母字符以外的所有字符的公式
Formula to eliminate all but alpha characters
我需要擦除 Excel 中的一列姓名,以消除所有非字母字符,包括句点、逗号、空格、连字符和撇号。
示例:
将 O'Malley-Smith, Tom, Jr.
更改为 OMALLEYSMITHTOMJR
客户要求这是一个 Excel 函数,否则我会使用类似于 replaceAll("[^a-zA-Z]", "").toUpperCase()
的快速 Java 程序来简化它。我似乎找不到任何看起来像现成函数的东西来在一大堆 SUBSTITUTE
函数之外执行此操作 - 每个单元格似乎只有一个可用。
如果我需要的话,我不太擅长开发自定义宏。
确实有一堆 SUBSTITUTE,但在一个单元格内是可能的,例如:
=UPPER(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1," ",""),",",""),"'",""),".",""),"-",""))
当然可能需要 'extended' 来覆盖其他非字母字符。
前段时间我也有类似的需求,发现了一些非常有用的东西。
按 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 现在是新函数,您可以将其用作公式。
因此,在包含您要操作的字符串的单元格旁边,只需复制 =CleanCode(yourcell)
如果您想走 VBA 路线 - 您不能使用用户定义函数 (UDF) 来更改您输入函数的单元格的值 - 但您可以使用简单的宏并利用 Microsoft 的 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
另一个VBA解决方案
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 "[a-z]" Or varTemp Like "[A-Z]") Then
varStr = ""
Else
varStr = UCase(varTemp)
End If
varVal = varVal & varStr
Next i
varRange.Value = varVal
Next
End Sub
从 Excel 2016 年起,这可以通过一个公式完成。
虽然 pnuts 的解决方案列出了要删除的明确字符,但此解决方案列出了明确有效的字符。
假设你的脏数据在A列。
假设您想要 B 列中的干净数据。
在单元格 B1 中使用下面最后一个公式。要将公式输入单元格 B1,请执行以下操作:
- 单击单元格 B1
- 点击进入公式栏
- 粘贴公式
- 按 CTRL+Shift+Enter <-- 重要步骤
复制单元格 B1 并根据需要将其粘贴到 B 列下方。
首先,这里有一个简短的例子来解释发生了什么:
=TEXTJOIN("",TRUE,
IFs(
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "t", "t",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "e", "e",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "s", "s",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "T", "T",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "E", "E",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "S", "S",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "2", "2",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = " ", " ",
true, ""
)
)
在这种情况下,我指定了以下有效字符:t、e、s、T、E、S、2 和 space 字符。
显然您需要将公式扩展到完整的字母表,分别列出每个大写和小写字符。同样,如果您想保留数字,请将其扩展到包括数字。请注意,数字被编码为字符串。
这是如何工作的:
简而言之,我们将源字符串拆分为一个单独的字符数组,然后对于每个字符,检查它是否在我们的有效字符集中,如果是,则将其包含在结果中,否则将其替换为如果不是,则为空字符串。
'IFS' 函数一次处理一对参数。如果第一个参数的计算结果为真,则第二个参数为 returned。如果不是,它将继续处理下一对参数——这就是为什么您会看到字母在每一行中列出两次。 IFS 函数中的最后一对值是集合 'true' 和空字符串。这就是说,如果我们到达有效值集的末尾(即没有匹配到有效值),那么 return 空字符串。
更多关于为什么这有效的背景:
这是 ExcelJet 给出的解决方案的变体。在该解决方案中,使用 TEXTJOIN 函数(连接数组的值)与 INDIRECT 函数(将字符串拆分为数组)以及数学运算符(加号)来强制计算每个字符之间的计算在带有数值的字符串中。字符串中的数字字符将 return 数值,而其他字符将 return 错误。该解决方案使用函数 ISERR 检查错误以决定是否在最终输出中包含给定字符。那里有一篇类似的文章以相反的方式工作 - 排除数字并保留字母。
我想解决的问题是让编码人员决定哪些值有效,哪些无效。我尝试将 VLOOKUP 和 INDEX 函数与 INDIRECT 函数结合起来,但它们仅适用于字符串中的第一个字符。诀窍在于,并非所有函数都会对 INDIRECT 的输出起作用,以评估数组中的每个元素(即字符串中的每个字符)。秘诀在于 ExcelJet 使用了数学运算符。如果您检查 Microsoft 的完整 function reference,IFS 被归类为 "logic" 函数。我怀疑逻辑函数可以通过这种方式与 INDIRECT 一起使用。
(注意:我还尝试在各种组合中使用 AND 和 OR。但是,INDIRECT 评估字符串中的 all 个字符。例如,使用 CODE 函数获取每个字符的 ASCII 值并断言所有字符的值必须介于 65 - 90(大写字母)或 97 - 122(小写字母)之间,仅当字符串中的 all 字符均为大写时才有效,或者全部都是小写,但如果有混合则不是。)
我不知道这个解决方案的性能与之前使用 SUBSTITUTE 的建议相比如何。如果您只想删除几个字符,我推荐 SUBSTITUTE 解决方案。如果您想明确指定要保留的有效字符(这是最初的问题),请使用这个。
最后,这是您需要的确切答案,包括您没有在问题中注明但在您的示例中显示的大写转换。 (对于其他不想要大写转换的人,从这个例子中删除 'UPPER' 的实例,然后再次将字母表添加到列表中,小写,并确保保留 'true'/空字符串对作为列表中的最后一个条目。)
=TEXTJOIN("",TRUE,
IFs(
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "A", "A",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "B", "B",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "C", "C",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "D", "D",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "E", "E",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "F", "F",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "G", "G",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "H", "H",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "I", "I",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "J", "J",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "K", "K",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "L", "L",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "M", "M",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "N", "N",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "O", "O",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "P", "P",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "Q", "Q",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "R", "R",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "S", "S",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "T", "T",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "U", "U",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "V", "V",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "W", "W",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "X", "X",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "Y", "Y",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "Z", "Z",
true, ""
)
)
原始问题是 "eliminate all but alpha characters" - 这个答案在不需要 VBA.
的公式中就可以解决问题
无法直接回复 aurezio,因为刚加入,信誉不够。我真的很喜欢这个解决方案,发现它非常有效并且 short/simple 满足我的要求——清理文本字段以将过滤后的字符集输出到文件名和 Web 编码输出需要的列。
虽然没有直接回答问题,但此页面是我找到的最接近我需要的解决方案的页面,因此我想为其他人提供更多背景信息并扩展 aurezio 的解决方案以获得更通用的字符选择 - 以防有人感兴趣。
第7行与允许的字符数或数列有关。使用 excel 函数 CODE() 来识别字符的代码,使用 CHAR() 来 post 中的字符代码。
我的标准(如下所示)是过滤除 45(破折号)、48 到 57(数字系列)、65 到 90(字母数字大写系列)、97 到 122(字母数字小写系列)之外的所有内容。此外,不需要大写意味着可以删除 UCase()。
'based off aurezio's solution
Function CleanCode(Rng As Range)
Dim strTemp As String
Dim n As Long
For n = 1 To Len(Rng)
Select Case Asc(Mid(Rng, n, 1))
Case 45, 48 To 57, 65 To 90, 97 To 122
strTemp = strTemp & Mid(Rng, n, 1)
End Select
Next
CleanCode = strTemp
End Function
最后我想改进它,最终使它成为动态的,并允许输入所需过滤器的参数。
例如 ClearCode(Range,"45", "48-57", "65-90", "97-122")
除此之外,youcantryreachingme 上面的答案,并使用 SEQUENCE 和 LET 函数(在 Excel 的最新版本中提供)将其与 https://exceljet.net/formula/strip-numeric-characters-from-cell 的建议相结合,然后进一步试验,我已经能够将功能降低到...
=LET(character,MID(a1,SEQUENCE(LEN(a1)),1),TEXTJOIN("",TRUE,
IFS(
character=" "," ",
CODE(UPPER(character))>90,"",
CODE(UPPER(character))<65,"",
TRUE,character)
))
由于 IFS 似乎只执行第一个匹配的语句,因此在声明该范围之前,放置任何您想要包含的超出排除范围(>90、<65)的异常是很重要的。使用 'AND' 语句来组合范围限制似乎更直观,但是由于上面 youcantryreachingme 所述的原因,这不起作用。
我需要擦除 Excel 中的一列姓名,以消除所有非字母字符,包括句点、逗号、空格、连字符和撇号。
示例:
将 O'Malley-Smith, Tom, Jr.
更改为 OMALLEYSMITHTOMJR
客户要求这是一个 Excel 函数,否则我会使用类似于 replaceAll("[^a-zA-Z]", "").toUpperCase()
的快速 Java 程序来简化它。我似乎找不到任何看起来像现成函数的东西来在一大堆 SUBSTITUTE
函数之外执行此操作 - 每个单元格似乎只有一个可用。
如果我需要的话,我不太擅长开发自定义宏。
确实有一堆 SUBSTITUTE,但在一个单元格内是可能的,例如:
=UPPER(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1," ",""),",",""),"'",""),".",""),"-",""))
当然可能需要 'extended' 来覆盖其他非字母字符。
前段时间我也有类似的需求,发现了一些非常有用的东西。
按 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 现在是新函数,您可以将其用作公式。
因此,在包含您要操作的字符串的单元格旁边,只需复制 =CleanCode(yourcell)
如果您想走 VBA 路线 - 您不能使用用户定义函数 (UDF) 来更改您输入函数的单元格的值 - 但您可以使用简单的宏并利用 Microsoft 的 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
另一个VBA解决方案
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 "[a-z]" Or varTemp Like "[A-Z]") Then
varStr = ""
Else
varStr = UCase(varTemp)
End If
varVal = varVal & varStr
Next i
varRange.Value = varVal
Next
End Sub
从 Excel 2016 年起,这可以通过一个公式完成。
虽然 pnuts 的解决方案列出了要删除的明确字符,但此解决方案列出了明确有效的字符。
假设你的脏数据在A列。 假设您想要 B 列中的干净数据。
在单元格 B1 中使用下面最后一个公式。要将公式输入单元格 B1,请执行以下操作:
- 单击单元格 B1
- 点击进入公式栏
- 粘贴公式
- 按 CTRL+Shift+Enter <-- 重要步骤
复制单元格 B1 并根据需要将其粘贴到 B 列下方。
首先,这里有一个简短的例子来解释发生了什么:
=TEXTJOIN("",TRUE,
IFs(
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "t", "t",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "e", "e",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "s", "s",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "T", "T",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "E", "E",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "S", "S",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "2", "2",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = " ", " ",
true, ""
)
)
在这种情况下,我指定了以下有效字符:t、e、s、T、E、S、2 和 space 字符。
显然您需要将公式扩展到完整的字母表,分别列出每个大写和小写字符。同样,如果您想保留数字,请将其扩展到包括数字。请注意,数字被编码为字符串。
这是如何工作的:
简而言之,我们将源字符串拆分为一个单独的字符数组,然后对于每个字符,检查它是否在我们的有效字符集中,如果是,则将其包含在结果中,否则将其替换为如果不是,则为空字符串。
'IFS' 函数一次处理一对参数。如果第一个参数的计算结果为真,则第二个参数为 returned。如果不是,它将继续处理下一对参数——这就是为什么您会看到字母在每一行中列出两次。 IFS 函数中的最后一对值是集合 'true' 和空字符串。这就是说,如果我们到达有效值集的末尾(即没有匹配到有效值),那么 return 空字符串。
更多关于为什么这有效的背景:
这是 ExcelJet 给出的解决方案的变体。在该解决方案中,使用 TEXTJOIN 函数(连接数组的值)与 INDIRECT 函数(将字符串拆分为数组)以及数学运算符(加号)来强制计算每个字符之间的计算在带有数值的字符串中。字符串中的数字字符将 return 数值,而其他字符将 return 错误。该解决方案使用函数 ISERR 检查错误以决定是否在最终输出中包含给定字符。那里有一篇类似的文章以相反的方式工作 - 排除数字并保留字母。
我想解决的问题是让编码人员决定哪些值有效,哪些无效。我尝试将 VLOOKUP 和 INDEX 函数与 INDIRECT 函数结合起来,但它们仅适用于字符串中的第一个字符。诀窍在于,并非所有函数都会对 INDIRECT 的输出起作用,以评估数组中的每个元素(即字符串中的每个字符)。秘诀在于 ExcelJet 使用了数学运算符。如果您检查 Microsoft 的完整 function reference,IFS 被归类为 "logic" 函数。我怀疑逻辑函数可以通过这种方式与 INDIRECT 一起使用。
(注意:我还尝试在各种组合中使用 AND 和 OR。但是,INDIRECT 评估字符串中的 all 个字符。例如,使用 CODE 函数获取每个字符的 ASCII 值并断言所有字符的值必须介于 65 - 90(大写字母)或 97 - 122(小写字母)之间,仅当字符串中的 all 字符均为大写时才有效,或者全部都是小写,但如果有混合则不是。)
我不知道这个解决方案的性能与之前使用 SUBSTITUTE 的建议相比如何。如果您只想删除几个字符,我推荐 SUBSTITUTE 解决方案。如果您想明确指定要保留的有效字符(这是最初的问题),请使用这个。
最后,这是您需要的确切答案,包括您没有在问题中注明但在您的示例中显示的大写转换。 (对于其他不想要大写转换的人,从这个例子中删除 'UPPER' 的实例,然后再次将字母表添加到列表中,小写,并确保保留 'true'/空字符串对作为列表中的最后一个条目。)
=TEXTJOIN("",TRUE,
IFs(
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "A", "A",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "B", "B",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "C", "C",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "D", "D",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "E", "E",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "F", "F",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "G", "G",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "H", "H",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "I", "I",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "J", "J",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "K", "K",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "L", "L",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "M", "M",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "N", "N",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "O", "O",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "P", "P",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "Q", "Q",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "R", "R",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "S", "S",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "T", "T",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "U", "U",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "V", "V",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "W", "W",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "X", "X",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "Y", "Y",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "Z", "Z",
true, ""
)
)
原始问题是 "eliminate all but alpha characters" - 这个答案在不需要 VBA.
的公式中就可以解决问题无法直接回复 aurezio,因为刚加入,信誉不够。我真的很喜欢这个解决方案,发现它非常有效并且 short/simple 满足我的要求——清理文本字段以将过滤后的字符集输出到文件名和 Web 编码输出需要的列。
虽然没有直接回答问题,但此页面是我找到的最接近我需要的解决方案的页面,因此我想为其他人提供更多背景信息并扩展 aurezio 的解决方案以获得更通用的字符选择 - 以防有人感兴趣。
第7行与允许的字符数或数列有关。使用 excel 函数 CODE() 来识别字符的代码,使用 CHAR() 来 post 中的字符代码。
我的标准(如下所示)是过滤除 45(破折号)、48 到 57(数字系列)、65 到 90(字母数字大写系列)、97 到 122(字母数字小写系列)之外的所有内容。此外,不需要大写意味着可以删除 UCase()。
'based off aurezio's solution
Function CleanCode(Rng As Range)
Dim strTemp As String
Dim n As Long
For n = 1 To Len(Rng)
Select Case Asc(Mid(Rng, n, 1))
Case 45, 48 To 57, 65 To 90, 97 To 122
strTemp = strTemp & Mid(Rng, n, 1)
End Select
Next
CleanCode = strTemp
End Function
最后我想改进它,最终使它成为动态的,并允许输入所需过滤器的参数。 例如 ClearCode(Range,"45", "48-57", "65-90", "97-122")
除此之外,youcantryreachingme 上面的答案,并使用 SEQUENCE 和 LET 函数(在 Excel 的最新版本中提供)将其与 https://exceljet.net/formula/strip-numeric-characters-from-cell 的建议相结合,然后进一步试验,我已经能够将功能降低到...
=LET(character,MID(a1,SEQUENCE(LEN(a1)),1),TEXTJOIN("",TRUE,
IFS(
character=" "," ",
CODE(UPPER(character))>90,"",
CODE(UPPER(character))<65,"",
TRUE,character)
))
由于 IFS 似乎只执行第一个匹配的语句,因此在声明该范围之前,放置任何您想要包含的超出排除范围(>90、<65)的异常是很重要的。使用 'AND' 语句来组合范围限制似乎更直观,但是由于上面 youcantryreachingme 所述的原因,这不起作用。