xyz*_*xyz 16 excel vba excel-vba
我需要从Excel中除了句点和空格之外的字符串中删除所有非字母数字字符.使用VBA而不是纯excel函数的解决方案就好了.
Pet*_*ert 38
将此函数插入Visual Basic编辑器中的新模块:
Function AlphaNumericOnly(strSource As String) As String
Dim i As Integer
Dim strResult As String
For i = 1 To Len(strSource)
Select Case Asc(Mid(strSource, i, 1))
Case 48 To 57, 65 To 90, 97 To 122: 'include 32 if you want to include space
strResult = strResult & Mid(strSource, i, 1)
End Select
Next
AlphaNumericOnly = strResult
End Function
Run Code Online (Sandbox Code Playgroud)
现在您可以将其用作用户定义函数,即如果您的数据位于单元格中A1
,请将此公式放在空单元格中=AlphaNumericOnly(A1)
.
如果要直接转换大范围,即替换所有非字母数字字符而不离开源,可以使用另一个VBA例程执行此操作:
Sub CleanAll()
Dim rng As Range
For Each rng In Sheets("Sheet1").Range("A1:K1500").Cells 'adjust sheetname and range accordingly
rng.Value = AlphaNumericOnly(rng.Value)
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
只需将此子放在同一模块中并执行即可.但请注意,这将取代范围内的所有公式.
这是使用模式匹配从字符串中删除“您想要的任何字符”的另一种方法。
下面的示例删除除字母、数字、空格和句点 ( [A-Z.a-z 0-9]
) 之外的所有内容
为了提高效率,它还利用了 VBA在字符串和字节数组之间的无缝转换:
cleanString
功能:Run Code Online (Sandbox Code Playgroud)Function cleanString(str As String) As String Dim ch, bytes() As Byte: bytes = str For Each ch In bytes If Chr(ch) Like "[A-Z.a-z 0-9]" Then cleanString = cleanString & Chr(ch) Next ch End Function
Like
运算符创建模式的更多信息,请参阅:
我正在寻找一种比我想出的更优雅的解决方案。我打算使用上面 ashleedawg 的代码,因为它肯定比我的代码更简洁。具有讽刺意味的是,我的运行速度快了 30%。如果速度很重要(假设你有几百万要做),试试这个:
Public Function AlphaNumeric(str As String) As String
Dim i As Integer
For i = 1 To Len(str)
If InStr(1, "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. ", Mid(str, i, 1)) Then AlphaNumeric = AlphaNumeric & Mid(str, i, 1)
Next
End Function
Run Code Online (Sandbox Code Playgroud)
VBA 的每个角落都有惊喜。我从来没有想过这会更快......