Gibt es eine Excel-Formel zur Identifizierung von Sonderzeichen in einer Zelle?

13

Wir haben ungefähr 3500 Dokumente, deren Dateinamen manuell gelöscht werden müssen, um Sonderzeichen wie Klammern, Doppelpunkte, Semikolons, Kommas usw. zu entfernen.

Ich habe eine Textdatei, die ich in Excel gespeichert habe, und ich versuche, eine Spalte zu erstellen, die den Dateinamen zur Änderung kennzeichnet, wenn dieser Sonderzeichen enthält. Die Pseudocode-Formel wäre

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

um die Zeile zu kennzeichnen, wenn sie andere Zeichen als AZ, 0-9, - oder _ enthält, unabhängig von der Groß- und Kleinschreibung.

Kennt jemand etwas, das für mich funktionieren könnte? Ich zögere, Code und massive ifAussagen zu machen, wenn es etwas schnell und einfach gibt.

dwwilson66
quelle
Gibt es einen bestimmten Grund, warum Sie diese Textverarbeitungsaufgabe in Excel ausführen? Selbst wenn Sie sich auf Microsoft Office-Tools beschränken, ist das Suchen und Ersetzen in Word relativ einfach. Tabelle mit zwei Spalten, ursprünglichem Dateinamen und verarbeitetem Dateinamen.
mpez0
Dies sind Indexeinträge von einer Drittanbieter-Software. Diese Software gibt Dateinamen aus, die Doppelpunkte, Klammern, Et-Zeichen usw. enthalten und Ausnahmen in Konvertierungsprogrammen verursachen. Wir müssen die Daten vor der Konvertierung in der Software eines Drittanbieters bereinigen. Der Anbieter stellt keine API zur Automatisierung dieser Aufgabe zur Verfügung. Ich habe eine Liste von Dateinamen in einer Textdatei. Ich verwende Excel, um ein Flag zu erstellen, das auf dem Vorhandensein von Sonderzeichen in einem Dateinamen basiert. Powershell, c # und Java geben ungenaue Ergebnisse zurück, da die Sonderzeichen als Operatoren interpretiert werden.
Dwwilson66
1
Ich möchte darauf hinweisen, dass Sie wahrscheinlich das falsche Werkzeug dafür verwenden. Ich kann mir zum Beispiel ein paar Möglichkeiten vorstellen, wie das in Notepad ++ ziemlich schnell geht. Sie könnten sogar die Ergebnisse am Ende in Excel importieren und eine Spalte mit 1 und 0 haben.
Däne
@Dane Gut zu wissen über NP ++. Ich werde das erforschen müssen. Ich habe das Tool installiert, aber nicht viel Erfahrung damit. Danke für den Tipp.
Dwwilson66

Antworten:

19

Kein Code? Aber es ist so kurz und einfach und wunderschön und ... :(

Ihr RegEx-Muster [^A-Za-z0-9_-]wird verwendet, um alle Sonderzeichen in allen Zellen zu entfernen.

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

Bearbeiten

Dies ist so nah wie möglich an Ihrer ursprünglichen Frage.

Bildbeschreibung hier eingeben

Der zweite Code ist eine benutzerdefinierte Funktion =RegExCheck(A1,"[^A-Za-z0-9_-]")mit 2 Argumenten. Die erste ist die zu überprüfende Zelle. Das zweite ist das zu überprüfende RegEx-Muster. Wenn das Muster mit einem der Zeichen in Ihrer Zelle übereinstimmt, wird 1 zurückgegeben, andernfalls 0.

Sie können es wie jede andere normale Excel-Formel verwenden, wenn Sie zuerst den VBA-Editor mit ALT+ öffnen F11, ein neues Modul (!) Einfügen und den folgenden Code einfügen.

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

Für Benutzer, die noch nicht mit RegEx vertraut sind, erkläre ich Ihr Muster: [^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
quelle
Das Problem ist, dass ich die Zeichen nicht ERSETZEN möchte. Markiere sie einfach in der Liste, damit ich sie an eine andere Person weitergeben kann. Die Dateinamen werden von Software von Drittanbietern erstellt und müssen in diesem Programm manuell geändert werden ... Ich muss nur Ja oder Nein markieren. Abgesehen davon denke ich, dass ich Ihren Ersetzungscode ändern kann, um stattdessen die Spalte zu kennzeichnen. :)
Dwwilson66
um dies zu implementieren ... es ist nur eine Frage des Ausschneidens und Einfügens in ein neues Modul und des Speicherns, richtig? oder muss ich noch etwas tun die formel =RegExReplace(cell)wird nicht erkannt .... und ich bin etwas verrostet beim erstellen neuer funktionen.
Dwwilson66
@ dwwilson66 Aktualisiert!
Nixda
Betonung des Bindestrichs in RegEx (Dieses Zeichen bricht Ihr Muster, wenn es an der falschen Position ist)
Die rote Erbse
7

Hier ist eine benutzerdefinierte Funktion, die mit etwas ähnlichem wie nixdas Code 1 zurückgibt, wenn die Zelle Sonderzeichen enthält.

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

Benutzerdefinierte Funktionen (UDFs) sind sehr einfach zu installieren und zu verwenden:

  1. ALT-F11 öffnet das VBE-Fenster
  2. ALT-I ALT-M öffnet ein neues Modul
  3. Fügen Sie das Material ein und schließen Sie das VBE-Fenster

Wenn Sie die Arbeitsmappe speichern, wird die UDF mit dieser gespeichert. Wenn Sie eine Excel-Version später als 2003 verwenden, müssen Sie die Datei als .xlsm und nicht als .xlsx speichern

So entfernen Sie die UDF:

  1. Rufen Sie das VBE-Fenster wie oben beschrieben auf
  2. Löschen Sie den Code
  3. Schließen Sie das VBE-Fenster

So verwenden Sie die UDF aus Excel:

= IsSpecial (A1)

Weitere Informationen zu Makros im Allgemeinen finden Sie unter:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

und

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

und

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

für Einzelheiten zu UDFs

Makros müssen aktiviert sein, damit dies funktioniert !

Garys Schüler
quelle
Warum haben Sie "_" als separates Oder-Element verwendet? Es kann in die gleiche [] Gruppe aufgenommen werden
jstuardo
@jstuardo Nur um zu verdeutlichen, dass der Unterstrich ein gültiges Zeichen ist.
Garys Schüler
Sollte der Code nicht so aktualisiert werden, If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thendass das Makro davon ausgeht, dass Leerzeichen gültige Zeichen sind?
Ovaryraptor
@Ovaryraptor Sie sind richtig! Ich werde dies morgen aktualisieren.
Garys Schüler
2

Hier ist eine bedingte Formatierungslösung, die die Datensätze mit Sonderzeichen kennzeichnet.

Wenden Sie einfach eine neue bedingte Formatierungsregel auf Ihre Daten an, die die unten stehende (extrem lange) Formel verwendet A1 sich der erste Datensatz in der Spalte mit den Dateinamen befindet:

=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)

Diese Formel überprüft jedes Zeichen jedes Dateinamens und bestimmt, ob sein ASCII-Code außerhalb der zulässigen Zeichenwerte liegt. Leider sind die zulässigen Zeichencodes nicht alle zusammenhängend, weshalb in der Formel Summen von SUMPRODUCTs verwendet werden müssen. Die Formel gibt die Anzahl der fehlerhaften Zeichen zurück. Alle Zellen, die einen Wert größer als 0 zurückgeben, werden markiert.

Beispiel: Bildbeschreibung hier eingeben

Hervorragend
quelle
1

Ich habe einen anderen Ansatz gewählt, um Sonderzeichen zu finden. Ich habe für jedes der zulässigen Zeichen neue Spalten erstellt und dann mit einer Formel wie der folgenden gezählt, wie oft dieses zulässige Zeichen in jedem Zeileneintrag enthalten war (Z2):

AA2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AA$1,""))
AB2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AB$1,""))
...

Dann summierte ich die Anzahl der zulässigen Zeichen in jeder Zeile und verglich sie mit der Gesamtlänge des Zeileneintrags.

BE2=LEN(Z2)
BF2=SUM(AA2:BC2)-BE2

Und schließlich sortierte ich nach der letzten Spalte (BF2), um negative Werte zu finden. Dies führte mich zu den Spalten, die korrigiert werden mussten.

Lampe am InfoSec Institut
quelle