括弧、コロン、セミコロン、コンマなどの特殊文字を削除するためにファイル名を手動でスクラブする必要がある約3500のドキュメントがあります。
Excelにダンプしたテキストファイルがあり、特殊文字が含まれている場合に、ファイル名に変更のフラグを付ける列を作成しようとしています。疑似コード式は次のようになります
=IF (cellname contains [^a-zA-z_-0-9], then "1", else "0")
大文字と小文字に関係なく、行にA〜Z、0〜9、-、または_以外の文字が含まれている場合は、その行にフラグを設定します。
誰かが私のために働くかもしれないことを知っていますか?迅速で簡単なものがある場合、私はコードと大量のif
ステートメントをためらっています。
コードなし?しかし、それはとても短くて簡単で美しくて... :(
RegExパターン_[^A-Za-z0-9_-]
_は、すべてのセルのすべての特殊文字を削除するために使用されます。
_Sub RegExReplace()
Dim RegEx As Object
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Global = True
RegEx.Pattern = "[^A-Za-z0-9_-]"
For Each objCell In ActiveSheet.UsedRange.Cells
objCell.Value = RegEx.Replace(objCell.Value, "")
Next
End Sub
_
これは、元の質問にできるだけ近づきます。
2番目のコードは、2つの引数を持つユーザー定義関数=RegExCheck(A1,"[^A-Za-z0-9_-]")
です。最初はチェックするセルです。 2つ目は、確認するRegExパターンです。パターンがセル内のいずれかの文字と一致する場合、1を返します。それ以外の場合は0を返します。
最初にVBAエディターを開いて、他の通常のExcel数式と同じように使用できます。 ALT+F11、新しいmodule(!)を挿入し、以下のコードを貼り付けます。
_Function RegExCheck(objCell As Range, strPattern As String)
Dim RegEx As Object
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Global = True
RegEx.Pattern = strPattern
If RegEx.Replace(objCell.Value, "") = objCell.Value Then
RegExCheck = 0
Else
RegExCheck = 1
End If
End Function
_
RegExを初めて使用するユーザーのために、パターンを説明します:_[^A-Za-z0-9_-]
_
_[] stands for a group of expressions
^ is a logical NOT
[^ ] Combine them to get a group of signs which should not be included
A-Z matches every character from A to Z (upper case)
a-z matches every character from a to z (lower case)
0-9 matches every digit
_ matches a _
- matches a - (This sign breaks your pattern if it's at the wrong position)
_
Nixdaのコードに似たものを使用して、セルに特殊文字がある場合に1を返すユーザー定義関数を次に示します。
Public Function IsSpecial(s As String) As Long
Dim L As Long, LL As Long
Dim sCh As String
IsSpecial = 0
For L = 1 To Len(s)
sCh = Mid(s, L, 1)
If sCh Like "[0-9a-zA-Z]" Or sCh = "_" Then
Else
IsSpecial = 1
Exit Function
End If
Next L
End Function
ユーザー定義関数(UDF)のインストールと使用は非常に簡単です。
ワークブックを保存すると、UDFも一緒に保存されます。 2003年以降のバージョンのExcelを使用している場合は、ファイルを.xlsxではなく.xlsmとして保存する必要があります。
UDFを削除するには:
ExcelからUDFを使用するには:
= IsSpecial(A1)
マクロ全般の詳細については、以下を参照してください。
http://www.mvps.org/dmcritchie/Excel/getstarted.htm
そして
http://msdn.Microsoft.com/en-us/library/ee814735(v = office.14).aspx
そして
http://www.cpearson.com/Excel/WritingFunctionsInVBA.aspx
uDFの詳細について
これを機能させるにはマクロを有効にする必要があります!
これは、特殊文字でレコードにフラグを付ける条件付きフォーマットソリューションです。
以下の(非常に長い)式を使用する新しい条件付き書式ルールをデータに適用するだけで、A1
は、ファイル名の列の最初のレコードです。
=SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<48)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>45))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>57)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>95))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122)*1)
この式は、各ファイル名の各文字をチェックし、そのASCIIコードが許容文字値の範囲外であるかどうかを判断します。残念ながら、許容文字コードはすべて連続しているわけではないため、式では合計を使用する必要がありますof SUMPRODUCT
s。数式は、不正な文字の数を返します。0より大きい値を返すセルにはフラグが付けられます。
例:
特殊文字を見つけるために別のアプローチを使用しました。許可された文字ごとに新しい列を作成し、次のような数式を使用して、各行エントリ(Z2)に許可された文字が何回あったかをカウントします。
AA2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AA$1,""))
AB2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AB$1,""))
...
次に、各行で許可される文字数を合計し、それを行エントリの全長と比較しました。
BE2=LEN(Z2)
BF2=SUM(AA2:BC2)-BE2
最後に、最後の列(BF2)で並べ替えて負の値を見つけました。これにより、修正が必要な列に移動しました。