Мне нужно удалить все не буквенно-цифровые символы из строки, кроме периода и пробела в Excel. Решение, использующее VBA, а не чистые функции excel, будет просто прекрасным.
Как удалить все не буквенно-цифровые символы из строки, кроме периода и пробела в excel?
Ответ 1
Вставьте эту функцию в новый модуль в редакторе 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
Теперь вы можете использовать это как функцию определения пользователя, т.е. если ваши данные находятся в ячейке 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
Просто разместите это подразделение в том же модуле и выполните его. Имейте в виду, что это заменит любые формулы в диапазоне.
Ответ 2
Вот альтернативный метод удаления "любых символов, которые вы хотите" из строки, используя сопоставление с образцом.
-
В приведенном ниже примере удаляются все, кроме букв, цифр, пробелов и
[AZ.az 0-9]
([AZ.az 0-9]
) -
Для повышения эффективности также используется бесшовное преобразование VBA между строками и байтовыми массивами:
Функция
cleanString
: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
смотрите:- VBA: как описание оператора
- Лучшая информация в VB.NET: как описание оператора
- Подробнее о том, как байтовые массивы и строки в основном взаимозаменяемы
Ответ 3
Я написал следующий код и работает, насколько я его протестировал, он состоит из двух функций. Первая проверяет, является ли строка буквенно-цифровой, а вторая производит замену (она также удаляет пробелы).
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
И здесь идет функция удаления
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
Ответ 4
Я искал более элегантное решение, чем то, которое я придумал. Я собирался использовать приведенный выше код 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
Конечная функция
Там сюрприз за каждым углом с VBA. Я никогда бы не подумал, что это будет быстрее...
Ответ 5
Я хотел бы прокомментировать вышесказанное, но у меня пока нет 50 репутации! Я не хочу делать что-то не так, поэтому заранее извиняюсь!
Я использовал вышеупомянутую функцию буквенно-цифровой только и суб спасибо.
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 32, 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
Sub CleanAll()
Dim rng As Range
For Each rng In Sheets("Sheet2").Range("A1:b10000").Cells 'adjust sheetname and range accordingly
rng.Value = AlphaNumericOnly(rng.Value)
Next
End Sub
Для номеров больше 15 цифр (2 телефонных номера) результат отображается как 8.52104E + 15, например. Есть ли способ получить цифры для отображения в виде цифр из скрипта VBA? Большое спасибо Джульетта