Excel でピリオドとスペースを除くすべての英数字以外の文字を文字列から削除する必要があります。純粋な Excel 関数ではなく VBA を使用したソリューションで問題ありません。
4 に答える
この関数を 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
このサブルーチンを同じモジュールに配置して実行するだけです。ただし、これにより範囲内の数式が置き換えられることに注意してください。
パターン マッチングを使用して文字列から「任意の文字」を削除する別の方法を次に示します。
以下の例では、文字、数字、スペース、およびピリオド ( ) を除くすべてを削除します。
[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
詳しくは:
Like
オペレーター のパターン作成の詳細については、以下を参照してください。- VBA:同様の演算子の説明
- VB.NETのより良い情報: Like Operatorの説明
- バイト配列と文字列が基本的に交換可能である方法の詳細
私が思いついたものよりもエレガントなソリューションを探していました。上記の 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 の隅々に驚きがあります。これがもっと速いとは思いもしませんでした...