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

Существует ли формула Excel для идентификации специальных символов в ячейке?

У нас есть около 3500 документов, чьи имена файлов необходимо вручную очистить, чтобы удалить специальные символы, такие как скобки, двоеточия, точки с запятой, запятые и др.

У меня есть текстовый файл, который я выложил в excel, и я пытаюсь создать столбец, в котором помечено имя файла для изменения, если в нем есть специальные символы. Формула псевдокода будет

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

для пометки строки, если она содержит любые символы, кроме A-Z, 0-9, - или _, независимо от регистра.

Кто-нибудь знает что-то, что может работать на меня? Я колеблюсь с кодом и массивным утверждением if, если есть что-то быстрое и простое.

Ответы (4)

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

Нет кода? Но он такой короткий, простой и красивый и… :(

Ваш шаблон 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

Редактируйте

Это настолько близко, насколько я могу добраться до вашего исходного вопроса.

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

Второй код - пользовательская функция =RegExCheck(A1,"[^A-Za-z0-9_-]") с 2 аргументами. Первый - ячейка для проверки. Второй - шаблон RegEx для проверки. Если шаблон совпадает с любым из символов в вашей ячейке, он вернет 1, в противном случае 0.

Вы можете использовать его как любую другую обычную формулу Excel, если сначала откроете редактор VBA с ALT+F11, вставите новый модуль (!) и вставьте код, приведенный ниже.

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

Для пользователей, только что перешедших в RegEx, я объясню ваш шаблон: [^A-Za-z0-9_-]

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

Используя нечто похожее на код 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 будет сохранен вместе с ней. Если вы используете версию Excel позже 2003 года, вы должны сохранить файл как .xlsm, а не как .xlsx

Чтобы удалить UDF:

  1. откройте окно VBE как выше
  2. очистите код от
  3. закройте окно VBE

Чтобы использовать UDF из Excel:

=ISpecial(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

Макросы должны быть включены, чтобы это работало!

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

Вот решение условного форматирования, которое помечает записи специальными символами.

Просто применить новое правило условного форматирования к вашим данным, которое использует (крайне длинную) формулу, приведенную ниже, где A1 - это первая запись в столбце имен файлов:

Эта формула проверяет каждый символ имени каждого файла и определяет, не выходит ли его ASCII-код за пределы допустимых значений символов. К сожалению, допустимые символьные коды не все совпадают, поэтому формула должна использовать суммы SUMPRODUCTs. Формула возвращает количество плохих символов. Любые ячейки, возвращающие значение больше 0, помечаются флажками.

Пример: =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)

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

Я использовал другой подход, чтобы найти специальных персонажей. Я создал новые столбцы для каждого из разрешенных символов, а затем использовал такую формулу, как эта, чтобы подсчитать, сколько раз разрешенный символ был в каждой строке (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), чтобы найти отрицательные значения, что привело меня к столбцам, которые нуждались в коррекции.

Похожие вопросы

6
13
9
10
3