2641 0

Excel: проверяем текст по маске

21.01.13
В почту нашей редакции периодически поступают вопросы по работе с текстом в программе Excel. Чтобы не перефразировать проблему своими словами, просто приведу цитату из одного такого письма: «Уважаемые сотрудники «Б & K»! В большинстве офисных приложений есть удобная функция для проверки текста на соответствие шаблону. При работе с документом в программе Word такая функция позволяет найти слова, которые содержат определенную комбинацию символов. В программе Excel при обработке баз данных инструментом «Автофильтр» использование шаблонов позволяет отобрать записи по признаку «Содержит». Но все эти функции вызываются через меню. А хотелось бы иметь возможность анализировать текст по шаблону при помощи формул. К сожалению, среди встроенных функций работы с текстом в MS Excel я подходящего варианта не нашел. Подскажите, как можно решить эту проблему?». Что ж, как говорится, задача поставлена, остается самая малость — найти ее решение. Чем мы сейчас и займемся.


 

Работа с шаблонами (или так называемыми масками) — одна из самых полезных функций, когда речь идет о работе с большими базами данных, а критерий поиска информации точно не известен. На практике такая ситуация встречается сплошь и рядом. Элементарный пример. У меня есть реестр выданных (или полученных) налоговых накладных. Реестр большой, несколько тысяч записей. И задача состоит в том, чтобы найти в этом реестре все документы по определенной фирме. Точное название фирмы (как она фигурирует в реестре) я не помню: может это «ООО "Фора"» или «ТОВ "Фора"», как-то так. Но тот факт, что в названии есть слово «Фора», я знаю наверняка. А это означает, что для поиска информации о фирме «Фора» мне нужно использовать не точное название предприятия, а некоторый шаблон. В данном случае он может выглядеть так: «*Фора*». В этом шаблоне на месте символа «*» может стоять любая строка произвольной длины. А сам шаблон описывает названия фирм, где вначале идет любой текст, затем есть слово «Фора», а за ним — снова произвольный текст. Под такой шаблон попадают, например, такие названия: «ТОВ "Фора"», «ООО "Фора"», «Фирма "Фора"», «"Фора", ltd» и т. д. Иными словами, шаблон «*Фора*» задает не точное, а приблизительное название предприятия для поиска его в реестре. А это именно то, что нам нужно. Остается реализовать такой поиск на практике.

Здесь ситуация такова. В программе Excel (а речь идет именно о ней!) есть разные способы решения этой задачи. Например, поиск и выбор данных можно организовать при помощи автофильтра. В этом случае шаблон для поиска нужно ввести в настройках фильтра, и такая возможность в программе Excel предусмотрена. Другое дело, когда нужно не просто выбрать данные, а еще и обработать их. Для примера, обратимся к базе данных, фрагмент которой показан на рис. 1. Предположим, мы хотим написать формулу, которая просуммирует все значения из колонки «Сумма с НДС» для контрагента «ТОВ "Фора"». Нам известно, что название этого контрагента в базе может отличаться (например, в названии может быть лишний пробел). Но слово «Фора» в нем есть всегда, и оно является ключевым для организации поиска.

В принципе справиться с задачей мы могли бы при помощи сводных таблиц. Но проблема заключается в том, что в них нельзя использовать шаблоны для анализа текстовых строк. Второй вариант — воспользоваться формулами. Но и здесь проблема остается, так как из 24 встроенных текстовых функций MS Excel ни одна не работает с шаблонами. Причем эта ситуация характерна для всех версий программы — начиная от Excel 95 и вплоть до последней редакции Excel 2010.

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

Создать функцию для сравнения строк совсем несложно, если воспользоваться возможностями языка Visual Basic for Application (VBA) программы MS Excel. Все, что нам придется сделать, — это открыть редактор Visual Basic и написать в нем буквально десяток строк. А в результате мы сможем существенно расширить свои возможности по обработке данных и заодно закрыть довольно-таки большой пробел в работе с текстом, который есть в стандартных средствах MS Excel.

 


Создаем функцию проверки текста по шаблону

Итак, мы решили, что для создания функции сравнения строк нам нужно написать небольшую программу на языке Visual Basic, который входит в состав MS Excel. Разумеется, программирование на VBA не является профильной задачей бухгалтера. Поэтому мы не будем углубляться в тонкости работы программы. Нам достаточно в общих чертах знать, как она выглядит и как вставить ее в документ MS Excel. Кроме того, полный текст функции мы выложим на сайте редакции, где вы сможете скачать его без каких-либо ограничений. Приступим.

Если вы работаете с Excel 2010, то первое, что нужно сделать для работы с VBA, — это включить вкладку «Разработчик» (по умолчанию эта возможность отключена). Для этого делаем так.

1. Открываем программу Excel. Загружаем файл с базой данных, как на рис. 1. В нашем примере она называется «РеестрНН.xls».

2. Вызываем меню «Файл → Параметры» и выбираем раздел «Настройка ленты». Откроется окно, изображенное на рис. 2.

3. В группе параметров «Настройка ленты:» включаем флажок слева от строки «Разработчик» (рис. 2).

4. В окне настроек нажимаем «ОК». В составе основного меню Excel 2010 появится пункт «Разработчик» (рис. 3).

5. Щелкаем левой кнопкой на разделе «Разработчик» главного меню. Лента примет вид, как на рис. 3.

6. В группе «Код» щелкаем на иконке «Visual Basic» (рис. 3). Откроется окно, изображенное на рис. 4. Это и есть редактор Visual Basic.

В левой части окна показана структура проекта для текущей рабочей книги. В этот проект нам и нужно добавить текст своей функции.

Важно! В Excel 2003 для вызова Visual Basic войдите в меню «Сервис → Макрос → Редактор Visual Basic». На экране появится окно, изображенное на рис. 4.

Теперь наша задача — вставить в документ «РеестрНН.xls» текст функции для сравнения строк. Делаем так.

1. Заходим на сайт по адресу http://www.bk.factor.ua/ru/publications/14/8/1106.html, скачиваем файл с текстом программы.

2. Сохраняем результат на жесткий диск.

3. Открываем скачанный файл в любом текстовом редакторе. Можно воспользоваться программой «Блокнот» или процессором MS Word. Перед вами должен появиться такой текст:

′ Функция для сравнения текстовых строк по маске

Function MskCmp(Tekct As String, Maska As String, Reg As Boolean)

If Not Reg Then

Tekct = UCase(Tekct)

Maska = UCase(Maska)

End If

If Tekct Like Maska Then

MskCmp = True

Else

MskCmp = False

End If

End Function 

4. Нажимаем «Ctrl+A» (выделить все).

5. Комбинацией «Ctrl+C» копируем текст в буфер обмена.

6. Переходим в окно Visual Basic (рис. 4).

7. Вызываем меню «Insert → Module». Откроется окно для добавления текста программы.

8. Нажимаем «Ctrl+V» (вставляем текст из буфера обмена).

9. Нажимаем кнопку «Сохранить» и закрываем редактор Visual Basic. Функция добавлена.

Прежде чем идти дальше посмотрим, что мы получили на самом деле. В результате работы с Visual Basic у нас появится дополнительная функция с именем «MskCmp()». У нее три параметра: текст (или ячейка с текстом), который мы будем проверять на соответствие шаблону, второй параметр — это сам шаблон. И, наконец, последний, третий параметр — это признак контроля регистра символов «Reg». Если этот параметр равен «0», то регистр функция контролировать не будет. Если параметр равен «1», то поиск будет выполняться с учетом регистра. То есть синтаксис нашей функции выглядит так: «=MaskCompare(Tekct; Maska; Reg), где «Tekct» — анализируемый текст, «Maska» — шаблон, «Reg» — признак контроля регистра символов. Главным и единственным критерием для поиска данных у функции «MskCmp()» является шаблон «Maska». Он может состоять из любых символов и специальных знаков (или так называемых символов подстановки). К таким символам относятся:

«*» — означает, что на месте этого знака может находиться произвольное количество любых символов;

«?» — на месте этого знака может стоять один символ;

«#» — на месте этого символа может находиться любая цифра (от «0» до «9»);

«[Список_символов]» — такая запись в шаблоне заменяет любой символ из указанного списка;

«[!Список_символов]» — означает, что в строке могут находиться любые символы, кроме перечисленных в списке.

Вот примеры нескольких шаблонов, которые можно использовать в функции «MskCmp()»:

«###» — числа от 0 до 999;

«?????» — слова из 5 букв;

«м*н» — слова, которые начинаются на «м» и заканчиваются на «н»;

«*[аостр]*» — все слова, содержащие хотя бы одну из букв «а», «о», «с», «т», «р»;

«*[abcdefghijklmnopqrstuvwxyz]*» — все слова, в которых есть английские буквы.

 


Применяем функцию MskCmp() для обработки базы данных

Функция для проверки текста у нас есть. Можно использовать ее для решения нашей задачи. Напомню, что мы хотим в базе данных на рис. 1 посчитать итоговые значения для контрагентов, в названии которых есть слово «Фора». Делаем так.

1. Открываем документ с базой «РеестрНН.xls» (рис. 1).

2. Перед началом базы данных добавляем рабочую строку. Она будет первой на рабочем листе.

3. Заполняем ячейки рабочей строки, а именно: в «B1» вводим текст «Фирма:». В ячейку «C1» вводим название контрагента, для которого нужно посчитать итоговые значения в базе данных. В нашем примере — это фирма «Фора».

4. Становимся на ячейку «J2», вводим название заголовка «Пр». В этой колонке мы напишем признак суммирования.

5. Становимся на ячейку «J4», щелкаем на значке «fx». Откроется окно «Мастер функций», изображенное на рис. 5.

6. В этом окне щелкаем на списке «Категория:», выбираем значение «Определенные пользователем». В списке «Выберите функцию:» появится список доступных функций пользователя для текущего документа.

7. В этом списке выбираем вариант «MskCmp» и нажимаем «ОК». Откроется окно «Аргументы функции», изображенное на рис. 6.

8. В нем заполняем параметры, как показано на рисунке. Здесь адрес «E4» — это ссылка на ячейку с наименованием предприятия. Формула «"*"&$C$1&"*"» формирует маску для поиска, используя название контрагента из ячейки «C1». Сейчас в «C1» записано значение «Фора». Поэтому формула «"*"&$C$1&"*"» сформирует маску «*Фора*», которая выберет все предприятия, в названии которых встречается текст «Фора». Регистр при поиске мы не проверяем, поэтому параметр «Reg» вводим равным «0».

9. В окне «Аргументы функции» нажимаем «ОК». В ячейке «J4» появится формула «=MskCmp(E4;"*"&$C$1&"*";0)», а ее значение в ячейке «J4» будет «Истина». Все верно: в «E4» записано название «ТОВ "Фора"» и функция «MskCmp()» это правильно определила.

10. Копируем формулу вниз по колонке «J» на всю высоту базы данных.

Все, что нам остается, — добавить формулы суммирования с учетом значений в колонке «J». Сделать это можно при помощи функции «Сумм если()». Делаем так.

1. Становимся на ячейку «G1».

2. Вводим формулу выборочного суммирования: «=Суммесли($J4:$J10000;ИСТИНА;G4:G10000)». Эта формула просматривает значения блока «$J4:$J1000» (считаем, что в базе будет не более 1000 записей). Если в какой-то ячейке блока она находит значение «Истина», формула берет содержимое из соответствующей ячейки блока «G4:G10000» и добавляет его к общей сумме. В результате эта формула посчитает сумму значений из колонки «G», которые отмечены в столбце «J» как «Истина». Для примера на рис. 7 мы таким образом получим итоги по контрагенту «Фора».

3. Копируем содержимое «G1» в буфер обмена и вставляем содержимое из буфера в ячейки «H1» и «I1». Результат нашей работы показан на рис. 7.

Что мы получили на самом деле? В ячейке «C1» нашей таблицы записано приблизительное название контрагента. Мы использовали это название для формирования маски. В колонке «Пр» записана функция «MskCmp()», которая сверяет названия предприятий из колонки «E» с маской для поиска. Если текст из «C1» содержится в названии предприятия, в соответствующей ячейке колонки «Пр» появится значение «ИСТИНА». В противном случае там будет «ЛОЖЬ». Теперь, имея такой признак, получить итоги уже не составит труда.

Функцию «MskCmp()» можно с успехом использовать для анализа и проверки правильности данных. Такая задача очень актуальна при работе с большими таблицами, к которым планируется применить инструменты обработки данных и подведения итогов. Вот всего пара ситуаций, которые часто встречаются в практической работе.

Пример 1. В реестре, изображенном на рис. 7, нужно проверить правильность наименований в колонке «E». Мы хотим убедиться, что все названия предприятий набраны русскими буквами. Дело в том, что визуально текст «ТОВ "Фора"» и «ТОВ "Фopа"» выглядит одинаково. Но во втором случае буквы «o» и «p» введены в латинице. И, разумеется, при подведении итогов, при сортировке или другой обработке данных эти отличия компьютер «увидит». И при обработке базы будет получен неверный результат. Решить проблему можно так.

1. Находим свободный столбец. Пусть это будет колонка «К». Озаглавим ее как «Контроль».

2. В ячейку «K2» вводим формулу «=MaskCompare(E4;"*[A-z]*";0)» и копируем ее на всю высоту таблицы. Теперь все как на ладони. Все строки, помеченные в колонке «K» значением «Истина», содержат в названии предприятия латинские символы.

Пример 2. В базе данных на рис. 2 нужно проверить, чтобы все коды ИНН содержали только числа. Сделать такую проверку для содержимого ячейки «F4» поможет формула «=MaskCompare(F4;"*[0123456789]";0)». Далее копируем ее на всю высоту таблицы — и задача решена. Все строки, которые будут отмечены значением «ЛОЖЬ», содержат ошибку в коде ИНН.

Пример 3. Лишние пробелы в названиях и других ключевых полях базы данных всегда являются источником ошибок. Чтобы проверить наличие двух пробелов в колонке «Наименование» реестра налоговых накладных, можно воспользоваться формулой «=MaskCompare(E4;"* *";0)». В этой формуле маска «"* *"» — это символ «*», затем идут два пробела, а после них опять символ «*». Заполняем этой формулой рабочую колонку и смотрим на результат. Строки, где в рабочей колонке появятся значения «Истина», содержат в названии предприятия лишний пробел.

Как видите, использование масок и шаблонов со специальными символами открывает широчайшие возможности по обработке данных в программе Excel. Все зависит от фантазии и творческого подхода к решению проблемы.

 

А у меня на сегодня все. Успешной работы! Жду ваших писем, предложений и замечаний на bk@id.factor.ua, nictomkar@rambler.ru или на форуме редакции.



Помітили помилку? Виділіть її та натисніть Ctrl+Enter, щоб повідомити нас про це
загрузка...
Коментарі (0)