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