21

Excel でピリオドとスペースを除くすべての英数字以外の文字を文字列から削除する必要があります。純粋な Excel 関数ではなく VBA を使用したソリューションで問題ありません。

4

4 に答える 4

43

この関数を 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

これをユーザー定義関数として使用できます。つまり、データが cellにある場合はA1、この数式を空の cell に配置し=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

このサブルーチンを同じモジュールに配置して実行するだけです。ただし、これにより範囲内の数式が置き換えられることに注意してください。

于 2013-03-30T21:39:09.617 に答える
9

パターン マッチングを使用して文字列から「任意の文字」を削除する別の方法を次に示します。

  • 以下の例では、文字、数字、スペース、およびピリオド ( ) を除くすべてを削除します。[A-Z.a-z 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

詳しくは:

于 2018-11-06T13:24:25.970 に答える
9

私が思いついたものよりもエレガントなソリューションを探していました。上記の 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

VBA の隅々に驚きがあります。これがもっと速いとは思いもしませんでした...

于 2019-04-23T12:36:14.933 に答える