Разделение ФИО
Рассмотрим один из случаев широко распространенной задачи разделения строки на определенные части.
В качестве примера возьмем разделение ФИО на отдельные фамилию, имя и отчество. С помощью средств VBA эта задача решается за несколько минут.
зарегистрироваться на сайте
обновите страницу по этой ссылке или кнопкой F5
Комментарии
Огромное спасибо!!!
Критерий-"пробелы". Но "сильный" ли это критерий? Вряд ли..
Стопроцентно универсального решения не существует: все зависит от ситуации. В большинстве случаев показанного в примере решения будет достаточно, но в каждом конкретном случае, разумеется, надо отталкиваться от структуры тех данных, с которыми программа будет работать.
Спасибо большое!
Спасибо!! Как всегда все четко и понятно!!!
Спасибо. Мне понравилось. Как это распространить на весь столбец, где будут другие ФИО?
Класс!
Дмитрий здравствуйте.
Урок интересный, спасибо. Есть вариант решения этой же задачки с помощью штатных Экселевских формул, возможно кому-то может пригодиться. Как и в случае с вашим примером на vba, эта формула позволяет вытянуть любое по счёту слово из текстовой строки. Символ разделителя может быть тоже любым, например "пробел", "запятая" и т.д.
Формула имеет вид :
=IF($C$1>LEN(B3)-LEN(SUBSTITUTE(B3;" ";""); RIGHT(B3;LEN(B3)-SEARCH("^^";SUBSTITUTE(B3;" ";"^^";LEN(B3)- LEN(SUBSTITUTE(B3;" ";"")))); IF($C$1=1;MID(B3;1;SEARCH("^^";SUBSTITUTE(B3;" ";"^^";1))-1);MID(B3;SEARCH("^^";SUBSTITUTE(B3;" ";"^^";$C$1-1))+1; SEARCH("^^";SUBSTITUTE(B3;" ";"^^";$C$1))- SEARCH("^^";SUBSTITUTE(B3;" ";"^^";$C$1-1))-1)))
Конечно с 1-го взгляда понять её работу сложновато, согласен Подозреваю, что по быстродействию этот вариант может быть быстрее пользовательской функции на vba, особенно при обработке большого кол-ва текстовых строк. К сожалению, не разобрался как в форуме приаттачить пример, выслал вам его на почту. Если сочтёте нужным, можно его опубликовть в обсуждаемой теме
С уважением,
Аганин Андрей
Интересно. Спасибо!
Все получилось идеально
Спасибо Дмитрий за новый урок!!! Познавательно Пригодится урок для решения задач...
Как всегда,все просто и очень интересно.Спасибо!
Формула конечно хорошо, но команду написал и забыл.))) Дмитрий вы как всегда на высоте.
Дмитрий,спасибо большое! Очень полезный урок. Обязательно попробую на практике.
Рассекречен еще один фокус! Спасибо!
Спасибо Дмитрию за проведенный коучинг. Вся информация была максимально полезна и излагалась на понятном языке. Приятно обучаться у настоящего профи.
Если честно, впечатляет!!!!!
Благодарю Вас,Дмитрий. Данный Урок очень важен при отработке именно вырезки части текста...
Интересно можно ли разделить по коду прописной буквы?
Есть ли такая возможность?
Добрый день, Герман.
Возможность есть, но решение будет несколько более сложным. Придется в цикле по очереди брать каждый символ строки и проверять его код: попадает ли он в диапазон кодов заглавных букв.
Очень много нового узнаю и вам за это спасибо
Очень доходчего. Спасибо
Очень просто, интересно и доходчево изложено! Спасибо.
VBA это конечно здорово, но почему не воспользоваться стандартной кнопкой на панели Данные - Текст по столбцам (разделитель м.б. любой)
правда предварительно лучше справа пару столбиков добавить для ИО.
За уроки ОГРОМНОЕ спасибо...
Доброе утро, Наталья.
Хороший вопрос.
Во-первых, во многих случаях использовать VBA удобнее (не надо вставлять столбцы): например, ячеек для разбиение у Вас несколько и находятся они не в одном столбце.
Во-вторых, с помощью VBA можно разбивать строки не по какому-то одному разделителю, а по нескольким (искать в строке, скажем, не только пробел, но и запятую или точку с запятой - в зависимости от того, что встретится раньше) - код, конечно, станет пообъемнее, но это тоже вполне возможно.
Хотя стандартный механизм "текст по столбцам" тоже полезен и в некоторых случаях проще использовать его. Так что разбиение на VBA - не панацея для всех случаев, а просто еще один инструмент в ваш арсенал, а там уже по ситуации выберете, что будет удобнее в конкретной задаче.
Посмотрела примеры автоматизации в Excel, скачанные с главной страницы. У меня возник вопрос по последнему примеру "Пример 8. Формирование пачки документов по шаблону.xls". Можно ли воспользоваться функцией Слияние документов Word для получения того же результата.
Большое спасибо за видео уроки. Очень помогли. Пополнила свои знания VB.
Когда мне надо из ячейки В1 извлечь фамилию, использую формулу:
=MID(B1;1;Find(" ";B1)) разделитель тоже пробел
для имени получается длиннее:
=MID(B1; Find(" ";B1)+1;LEN(B1)-FIND(" ";B1))
Отчество у нас в Латвии не используется, но и для негоможно создать формулу. Формулы можно раскопировать на любой диапазон таблицы, исодные ячейки могут быть на любом листе. Но ваш пример хорош как принцип создания программы, с постепенным усложнением параметров. Примерно так же создаются и сложные формулы. Спасибо за уроки!
Спасибо большое! Очень доходчиво, написал свой первый макрос добавил по своему пониманию автоматическое распознавание отчества Иногда мы ставим фамилию в начале иногда в конце. Макрос всегда ставит фамилию там где надо.
Sub РасстановкаФИО_Click()
фио = Cells(1, 1)
пробел1 = InStr(фио, " ")
пробел2 = InStr(пробел1 + 1, фио, " ")
фио1 = Left(фио, пробел1 - 1)
фио2 = Mid(фио, пробел1 + 1, пробел2 - пробел1 - 1)
фио3 = Mid(фио, пробел2 + 1)
If (Right(фио1, 2) = "ич") Or (Right(фио1, 3) = "вна") Or (Right(фио1, 3) = "чна") _
Then фамилия = фио1: имя = фио2: отчество = фио3
If (Right(фио2, 2) = "ич") Or (Right(фио2, 3) = "вна") Or (Right(фио2, 3) = "чна") _
Then отчество = фио2: имя = фио1: фамилия = фио3 _
Else: фамилия = фио1: имя = фио2: отчество = фио3
Cells(1, 3) = фамилия
Cells(2, 3) = имя
Cells(3, 3) = отчество
End Sub
ПС ну я исходил из того что никто не станет писать Отчество первым, это уж совсем не по русски.
Не судите строго о нужности или ненужности, это мой первый макрос.
Спасибо господину Вентилю. А я вот немного потренировался и посовершенствовал с моей точки зрения созданное Вентилем. Я просто постарался сделать, чтобы в любом месте можно было бы делать, ну и со списком циклом можно было бы работать. На первое ФИО в списке нужно встать, ну и весь список будет преобразован до первой пустой ячейки. Вот мой результат, профессионалы могу критически оценить, буду рад
У меня вроде бы отлично работает до ста позиций очень быстро разносит
Sub РазбивкаФИО_Click()
Do
If Not Selection.Value > " " Then Exit Do
ActiveCell().Select
фио = Cells(1, 1)
пробел1 = InStr(фио, " ")
пробел2 = InStr(пробел1 + 1, фио, " ")
фио1 = Left(фио, пробел1 - 1)
фио2 = Mid(фио, пробел1 + 1, пробел2 - пробел1 - 1)
фио3 = Mid(фио, пробел2 + 1)
If (Right(фио1, 2) = "ич") Or (Right(фио1, 3) = "вна") Or (Right(фио1, 3) = "чна") _
Then фамилия = фио1: имя = фио2: отчество = фио3
If (Right(фио2, 2) = "ич") Or (Right(фио2, 3) = "вна") Or (Right(фио2, 3) = "чна") _
Then отчество = фио2: имя = фио1: фамилия = фио3 _
Else: фамилия = фио1: имя = фио2: отчество = фио3
ActiveCell.Offset(0, 1) = фамилия
ActiveCell.Offset(0, 2) = имя
ActiveCell.Offset(0, 3) = отчество
ActiveCell.Offset(1, 0).Select
Loop
End Sub
исправил тут кое-что в тексте указанного выше макроса
Sub РазбивкаФИО_Click()
Do
If Not Selection.Value > " " Then Exit Do
ActiveCell().Select
фио = ActiveCell()
пробел1 = InStr(фио, " "
пробел2 = InStr(пробел1 + 1, фио, " "
фио1 = Left(фио, пробел1 - 1)
фио2 = Mid(фио, пробел1 + 1, пробел2 - пробел1 - 1)
фио3 = Mid(фио, пробел2 + 1)
If (Right(фио1, 2) = "ич" Or (Right(фио1, 3) = "вна" Or (Right(фио1, 3) = "чна" _
Then фамилия = фио1: имя = фио2: отчество = фио3
If (Right(фио2, 2) = "ич" Or (Right(фио2, 3) = "вна" Or (Right(фио2, 3) = "чна" _
Then отчество = фио2: имя = фио1: фамилия = фио3 _
Else: фамилия = фио1: имя = фио2: отчество = фио3
ActiveCell.Offset(0, 1) = фамилия
ActiveCell.Offset(0, 2) = имя
ActiveCell.Offset(0, 3) = отчество
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Очень здорово! Спасибо большое! По ходу урока добавил для выполнения макроса кнопку, сделал, чтобы у столбцов, в которые выводятся значения автоматически подбиралась ширина, и сделал так, чтобы ФИО брались из любой активной строки. В общем, стараюсь комбинировать полученные знания, очень интересно! Спасибо ещё раз!
могут только зарегистрированные пользователи.
Ваше имя и тот e-mail, который был указан при регистрации)
В любой момент времени вы можете отказаться от получения сообщений.
Полезно, наглядно, понятно, существенно расширила свои знания благодаря данным урокам - спасибо, Дмитрий)
Добрый день, Анатолий.
Подробнее о создании программы для тестирования было рассказано в специальном платном мастер-классе "Создание программы по тестированию". Приобрести его можно по этой ссылке.
Что касается счетчика времени - в мастер-классе такого функционала не было, но позднее я доработал созданную в нем программу и добавил в нее такой счетчик - при приобретении мастер-класса я вместе с ним предоставлю и доработанную версию программы.
Спасибо! Классно. Где можно списать Вашу программу для шаблона? Счетчик времени на тестирование как вставить?
Здравствуйте. Подскажите, а можно ли сделать Q-код в таблице, но чтоб там было видно наименование упаковки, вес, дата прихода, наименование контрагента и тд. И при каждом изменении данных, автоматически делался Q-код?
Добрый день, Дмитрий. Я случайно увидела ваши видео в ютубе. Посмотрела и мне стало интересно изучить макросы. Перешла по ссылке и просмотрела часть бесплатных видео и мне очень понравилась ваша манера преподавать просто без лишних слов. Скажите, пожалуйста, а как сделать выпадающий...
Здравствуйте В видео "Автоматизация заполнения бланка документа (платежного поручения)" говориться, что можно скачать файлы с макросами, о которых идет речь. Не могу найти. Подскажите, пожалуйста,где скачать Файл?
Благодарю Вас хотя у меня оффис 97 все полчается
здравствуйте, Дмитрий... подскажите пожалуйста такой момент, для того, чтобы сделать макрос с фамилиями, я сделала перечень с фамилиями и суммами.. так вот у меня слово фамилия при сортировке улетает в самый низ))) то есть оно тоже сортируется... что не так в моей таблице?
Спасибо большое.Очень полезная информация
Замечательные уроки, большое спасибо автору. Все очень доходчиво, без лишних заморочек.