Как удалить все не буквенно-цифровые символы из строки, кроме периода и пробела в excel?

Мне нужно удалить все не буквенно-цифровые символы из строки, кроме периода и пробела в Excel. Решение, использующее VBA, а не чистые функции 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

Дополнительная информация:

Ответ 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? Большое спасибо Джульетта