Чи існує формула 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.
— Дат

@Dane Приємно знати про 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 Оновлено!
— nixda

Наголос на дефісі всередині 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:

= Спеціальний (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

для конкретики щодо АДС

Макроси повинні бути включені, щоб це працювало !


Чому ви використовували "_" як окремий елемент 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.