web-dev-qa-db-ja.com

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

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

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

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

大文字と小文字に関係なく、行にA〜Z、0〜9、-、または_以外の文字が含まれている場合は、その行にフラグを設定します。

誰かが私のために働くかもしれないことを知っていますか?迅速で簡単なものがある場合、私はコードと大量のifステートメントをためらっています。

13
dwwilson66

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

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
_

編集する

これは、元の質問にできるだけ近づきます。

enter image description here

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)
_
19
nixda

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の詳細について

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

7
Gary's Student

これは、特殊文字でレコードにフラグを付ける条件付きフォーマットソリューションです。

以下の(非常に長い)式を使用する新しい条件付き書式ルールをデータに適用するだけで、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 SUMPRODUCTs。数式は、不正な文字の数を返します。0より大きい値を返すセルにはフラグが付けられます。

例: enter image description here

2
Excellll

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