セル内の特殊文字を識別するExcel式はありますか?


13

ブラケット、コロン、セミコロン、コンマなどの特殊文字を削除するには、ファイル名を手動でスクラブする必要がある約3500のドキュメントがあります。

Excelにダンプしたテキストファイルがあり、特殊文字が含まれている場合に変更のためにファイル名にフラグを立てる列を作成しようとしています。擬似コード式は

=IF (cellname contains [^a-zA-z_-0-9], then "1", else "0")

大文字小文字に関係なく、AZ、0-9、-、または_以外の文字が含まれている場合、行にフラグを立てます。

誰かが私のために働くかもしれない何かを知っていますか?ifすばやく簡単に何かがあれば、私はコーディングと大量のステートメントをためらいます。


Excelでこのテキスト処理タスクを実行している特別な理由はありますか?Microsoft Officeツールに限定しても、Wordでの検索と置換は非常に簡単です。元のファイル名と処理されたファイル名の2つの列を持つテーブル。
mpez0

これらは、サードパーティソフトウェアのインデックスエントリです。このソフトウェアは、コロン、角かっこ、アンパサンドなどを含むファイル名を出力するため、変換プログラムで例外が発生します。変換する前に、サードパーティソフトウェアのデータをスクラブする必要があります。ベンダーは、そのタスクを自動化するためのAPIを提供していません。テキストファイルにファイル名のリストがあります。Excelを使用して、ファイル名に特殊文字が含まれていることに基づいてフラグを作成しています。Powershell、c#、およびJavaは、特殊文字が演算子として解釈されるため、不正確な結果を返します。
dwwilson66

1
このためにおそらく間違ったツールを使用していることを指摘したいと思います。たとえば、Notepad ++でこれをすばやく実行するいくつかの方法を考えることができます。最後に結果をExcelにインポートし、1と0の列を持つこともできます。
デーン

@Dane NP ++について知っておくと良い。私はそれを探求する必要があります。ツールをインストールしましたが、あまり経験がありません。ヒントをありがとう。
dwwilson66

回答:


19

コードなし?しかし、それはとても短くて簡単で美しいです... :(

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番目のコードは、=RegExCheck(A1,"[^A-Za-z0-9_-]")2つの引数を持つユーザー定義関数です。最初のものはチェックするセルです。2つ目は、チェックするRegExパターンです。パターンがセル内のいずれかの文字と一致する場合、1を返します。それ以外の場合は0を返します。

最初にVBAエディターを開くと、他の通常のExcel数式と同じように使用できます ALT + F11で、新しいモジュール(!)を挿入して、以下のコードを貼り付けると、ます。

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)

問題は、文字を置き換えたくないので、リストにフラグを立てて、他の人に渡すことができるようにすることです。ファイル名はサードパーティのソフトウェアによって作成され、そのプログラム内で手動で変更する必要があります...はいまたはいいえのフラグを立てるだけです。そうは言っても、代わりに列にフラグを付けるために置換コードを変更できると思います。:)
dwwilson66

これを実装するには...新しいモジュールに切り貼りして保存するだけですよね?または私は何か他のことをする必要がありますか?数式=RegExReplace(cell)は認識されません。...そして、新しい関数を作成するのに少しさびています。
dwwilson66

@ dwwilson66更新されました!
nixda

正規表現内のハイフンを重視(それは間違った位置にいた場合、この記号は、あなたのパターンを破る)
赤エンドウ

7

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)は、インストールと使用が非常に簡単です。

  1. ALT-F11はVBEウィンドウを表示します
  2. ALT-I ALT-Mは新しいモジュールを開きます
  3. ものを貼り付けて、VBEウィンドウを閉じます

ブックを保存すると、UDFも一緒に保存されます。2003以降のバージョンのExcelを使用している場合、ファイルを.xlsxではなく.xlsmとして保存する必要があります。

UDFを削除するには:

  1. 上記のようにVBEウィンドウを表示します
  2. コードをクリアする
  3. VBEウィンドウを閉じます

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の詳細

これを機能させるにはマクロを有効にする必要があります


「_」を別のOrアイテムとして使用したのはなぜですか?同じ[]グループに含めることができます
jstuardo

@jstuardo アンダースコアが有効な文字であることを明確にするためだけに。
ゲイリーの学生

If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thenマクロはスペースが有効な文字であると想定するようにコードを更新すべきではありませんか?
卵巣ラプトル

@Ovaryraptorあなたは正しいです!明日更新します。
ゲイリーの学生

2

以下は、レコードに特殊文字でフラグを立てる条件付き書式設定ソリューションです。

以下の(非常に長い)数式を使用する新しい条件付き書式ルールをデータに適用します。ここ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コードが許容文字値の外にあるかどうかを判断します。残念ながら、許容される文字コードはすべて連続しているわけではないため、式では次の合計を使用する必要があります。SUMPRODUCT sのます。数式は、存在する不良文字の数を返します。0より大きい値を返すセルにはフラグが付けられます。

例: ここに画像の説明を入力してください


1

別のアプローチを使用して特殊文字を見つけました。許可された文字ごとに新しい列を作成し、次のような式を使用して、許可された文字が各行エントリ(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)で並べ替えて負の値を見つけたため、修正が必要な列に移動しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.