2013-10-16 13:34:39 +0000 2013-10-16 13:34:39 +0000
13
13

Czy istnieje formuła Excela pozwalająca zidentyfikować znaki specjalne w komórce?

Mamy około 3500 dokumentów, których nazwy plików muszą być ręcznie oczyszczone w celu usunięcia znaków specjalnych, takich jak nawiasy, dwukropki, średniki, przecinki itp.

Mam plik tekstowy, który wrzuciłem do Excela i próbuję utworzyć kolumnę, która oznaczy nazwę pliku do modyfikacji, jeśli zawiera ona znaki specjalne. Pseudokod formuły byłby

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

aby oflagować wiersz, jeśli zawiera on jakiekolwiek znaki inne niż A-Z, 0-9, - lub \u0026apos; niezależnie od wielkości liter.

Czy ktoś wie o czymś, co może dla mnie pracować? Jestem niezdecydowany, aby zakodować i masywne oświadczenie if, jeśli jest coś szybkiego i łatwego.

Odpowiedzi (4)

19
19
19
2013-10-16 14:26:04 +0000

Nie ma kodu? Ale to jest takie krótkie, łatwe i piękne i… :(

Twój RegEx pattern [^A-Za-z0-9_-] jest używany do usuwania wszystkich znaków specjalnych we wszystkich komórkach.

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

Edytuj

To jest tak blisko, jak tylko mogę dostać się do twojego oryginalnego pytania.

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

Drugi kod to zdefiniowana przez użytkownika funkcja =RegExCheck(A1,"[^A-Za-z0-9_-]") z 2 argumentami. Pierwszy z nich to komórka do sprawdzenia. Drugim argumentem jest wzorzec RegEx do sprawdzenia. Jeśli wzorzec pasuje do któregoś ze znaków w komórce, zwróci 1, w przeciwnym razie 0.

Możesz użyć tej funkcji jak każdej innej normalnej formuły w Excelu, jeśli najpierw otworzysz edytor VBA za pomocą ALT+F11, wstawisz nowy moduł (!) i wkleisz poniższy kod.

[] 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)

Dla użytkowników nieobeznanych z RegEx wyjaśnię Twój wzór: [^A-Za-z0-9_-]

7
7
7
2013-10-16 15:31:19 +0000

Używając czegoś podobnego do kodu nixda, oto funkcja zdefiniowana przez użytkownika, która zwróci 1, jeśli komórka ma znaki specjalne.

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

Funkcje zdefiniowane przez użytkownika (UDF) są bardzo łatwe w instalacji i użyciu:

  1. ALT-F11 wywołuje okno VBE
  2. ALT-I ALT-M otwiera świeży moduł
  3. Wklej rzeczy i zamknij okno VBE

Jeśli zapiszesz skoroszyt, UDF zostanie zapisany razem z nim. Jeśli używasz wersji Excela późniejszej niż 2003, musisz zapisać plik jako .xlsm, a nie .xlsx

Aby usunąć UDF:

  1. przywołaj okno VBE jak wyżej
  2. wyczyść kod
  3. zamknij okno VBE

Aby użyć UDF z Excela:

=IsSpecial(A1)

Aby dowiedzieć się więcej o makrach w ogóle, zobacz: http://www.mvps.org/dmcritchie/excel/getstarted.htm

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

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

w celu uzyskania szczegółowych informacji o UDF-ach

Makra muszą być włączone, aby to działało!

2
2
2
2013-10-16 21:05:57 +0000

Oto rozwiązanie formatowania warunkowego, które będzie oznaczać rekordy ze znakami specjalnymi.

Po prostu zastosuj nową regułę formatowania warunkowego do swoich danych, która używa poniższej (bardzo długiej) formuły, gdzie A1 jest pierwszym rekordem w kolumnie nazw plików:

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

Formuła ta sprawdza każdy znak każdej nazwy pliku i określa, czy jego kod ASCII jest poza dopuszczalnymi wartościami znaków. Niestety, nie wszystkie dopuszczalne kody znaków są sąsiadujące, dlatego formuła musi używać sum SUMPRODUCT. Formuła zwraca liczbę nieprawidłowych znaków. Wszystkie komórki, które zwracają wartość większą niż 0, są oflagowane.

Przykład:

1
1
1
2016-06-20 21:36:00 +0000

Użyłem innego podejścia, aby znaleźć znaki specjalne. Stworzyłem nowe kolumny dla każdego z dozwolonych znaków, a następnie użyłem następującej formuły, aby policzyć, ile razy dany dozwolony znak znalazł się w każdym wpisie w wierszu (Z2):

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

Następnie zsumowałem liczbę dozwolonych znaków w każdym wierszu, a następnie porównałem ją z całkowitą długością wpisu w wierszu.

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

I na koniec posortowałem ostatnią kolumnę (BF2), aby znaleźć wartości ujemne, co doprowadziło mnie do kolumn, które wymagały korekty.