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


13

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

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

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

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

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


Есть ли конкретная причина, по которой вы выполняете эту задачу обработки текста в Excel? Даже ограничивая себя инструментами Microsoft Office, это довольно простой поиск и замена в Word. Таблица с двумя столбцами, исходным именем файла и именем обработанного файла.
mpez0

Это индексные записи от стороннего программного обеспечения. Это программное обеспечение выводит имена файлов, которые включают двоеточия, скобки, амперсанды и т. Д., Вызывая исключения в программах преобразования. Нам нужно очистить данные в стороннем программном обеспечении перед преобразованием; поставщик не предоставляет API для автоматизации этой задачи. У меня есть список имен файлов в текстовом файле. Я использую Excel для создания флага на основе наличия специальных символов в имени файла. Powershell, c # и Java возвращают неточные результаты, потому что специальные символы интерпретируются как операторы.
dwwilson66

1
Я хочу отметить, что вы, вероятно, используете не тот инструмент для этого. Например, я могу придумать несколько способов сделать это довольно быстро в Notepad ++. Вы даже можете импортировать результаты в Excel в конце и иметь столбец с 1 и 0.
датчанин

@ Дейн Полезно знать о NP ++. Я должен исследовать это. У меня установлен инструмент, но опыта работы с ним немного. Спасибо за чаевые.
dwwilson66

Ответы:


19

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

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

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

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

введите описание изображения здесь

Второй код - это пользовательская функция =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)

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

чтобы реализовать это ... это просто вопрос вырезания и вставки в новый модуль и сохранения, верно? или мне нужно сделать что-то еще? формула =RegExReplace(cell)не распознается .... и я немного заржавел при создании новых функций.
dwwilson66

@ dwwilson66 Обновлено!
13

Акцент на дефис внутри RegEx (этот знак нарушает ваш паттерн, если он находится в неправильной позиции)
Красный горошек

7

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

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


Почему вы использовали "_" как отдельный элемент Or? Он может быть включен в ту же группу []
jstuardo

@jstuardo Только для того, чтобы подчеркнуть, что подчеркивание является допустимым символом.
Студент Гари

Не следует ли обновить код, If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thenчтобы макрос предполагал, что пробелы являются допустимыми символами?
Оварираптор

@ Ovaryraptor Вы правы! Я обновлю это завтра.
Студент Гари

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.