I need to remove all non alphanumeric characters from a string except period and space in Excel. A solution using VBA rather than pure excel functions be just fine.
4 Answers
Insert this function into a new module in the Visual Basic Editor:
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
Now you can use this as a User Define Function, i.e. if your data is in cell A1, place this formula in an empty cell =AlphaNumericOnly(A1).
If you want to convert a large range directly, i.e. replace all the non-alphanumeric characters without leaving the source, you can do this with another VBA routine:
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
Simply place this sub in the same module and execute it. Be aware though, that this will replace any formulas in the range.
- 16,492
- 4
- 62
- 86
-
Albert, that was fast, thank you. I will try it tomorrow. As I said I know little about excel could you explain how to use the function I need to run it across my entire excel sheet. This will usually have 11 columns and about 1500 rows but this can very. Thank you this is much appreciated – xyz Mar 30 '13 at 21:43
-
5For anyone who wants to add or subtract Characters from the above to tool it to there needs here is a reference sheet: http://office.microsoft.com/en-us/excel-help/ascii-character-chart-HA001133136.aspx – xyz Mar 31 '13 at 14:58
-
2+1 Good point! Alternatively, I simply used `? Asc("A")` in the debug console to get the ASCII code... – Peter Albert Mar 31 '13 at 21:37
-
3The link Tim provided is no longer functional. Here's a new one: [link](http://www.asciitable.com/) – Josh Fierro Oct 05 '15 at 17:39
Here' an alternate method of removing "whatever characters you want" from a string using pattern matching.
The example below removes everything except letters, numbers, spaces and periods (
[A-Z.a-z 0-9])For improved efficiency it also utilizes VBA's seamless conversion between Strings and Byte Arrays:
cleanStringFunction: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
More Information:
- For more about creating patterns for the
Likeoperator, see:- VBA: Like Operator description
- better info in the VB.NET: Like Operator description
- More about how Byte Arrays and Strings are basically interchangeable
- 18,752
- 7
- 68
- 96
-
1Nice ! This is the most elegant and probably the fastest one. If speed is an issue, I would try `For i =...` vs `For each...` – iDevlop Jan 04 '19 at 13:11
-
Would using a for loop vs foreach really be reasonably different in performance? – Craig_VG Dec 22 '21 at 20:18
I was looking for a more elegant solution than the one I came up with. I was going to use ashleedawg's code above as it certainly is neater than my code. Ironically, mine ran 30% quicker. If speed is important (say you have a few million to do), try this:
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
There's a surprise around every corner with VBA. I'd never imagine this would be quicker...
- 6,480
- 2
- 25
- 41
- 143
- 1
- 7
I have written the following code and it works as far as I tested it, it consists of two functions. The first checks whether a string is alphanumeric and the second makes the replacement (it also removes spaces)
Public Function Isalphanumeric(cadena As String) As Boolean
Select Case Asc(UCase(cadena))
Case 65 To 90 'letras
Isalphanumeric = True
Case 48 To 57 'numeros
Isalphanumeric = True
Case Else
Isalphanumeric = False
End Select
End Function
And here goes the remove function
Function RemoveSymbols_Enhanced(InputString As String) As String
Dim InputString As String
Dim CharactersArray()
Dim i, arrayindex, longitud As Integer
Dim item As Variant
i = 1
arrayindex = 0
longitud = Len(InputString)
'We create an array with non alphanumeric characters
For i = 1 To longitud
If Isalphanumeric(Mid(InputString, i, 1)) = False Then
ReDim Preserve CharactersArray(arrayindex)
CharactersArray(arrayindex) = Mid(InputString, i, 1)
arrayindex = arrayindex + 1
End If
Next
'For each non alphanumeric character we do a replace
For Each item In CharactersArray
item = CStr(item)
InputString = Replace(InputString, item, "")
Next
End Function
- 25
- 4