13

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

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

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

помечать строку, если она содержит любые символы, кроме AZ, 0-9, - или _, независимо от регистра.

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

4 ответа4

16

Нет кода? Но это так коротко, легко и красиво и ... :(

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

редактировать

Это как можно ближе к вашему первоначальному вопросу.

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

Вы можете использовать его как любую другую обычную формулу Excel, если вы сначала откроете редактор VBA с помощью 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)
5

Используя что-то похожее на код 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:

= IsSpecial(А1)

Чтобы узнать больше о макросах в целом, смотрите:

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

для уточнения на UDFs

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .