Получавали ли сте някога работен лист на Excel с имена, в който пълните имена са всички в една клетка? Вашата задача е да разбиете имената на собствено и фамилно име - процес, известен като синтактичен анализ. Можете да опитате да използвате формула и/или функция, за да помогнете, или можете да използвате кода на Visual Basic за приложения (VBA).
Често срещан подход е да се намери интервал между собственото и фамилното име и воала! – знаете къде свършва първото и фамилното име.
Освен ако нямате имена, които са по-сложни по структура, като д-р Уилям Лечител или Зак Х. Снейзър III.
Ето една типична VBA рутина, която преглежда всяко име, знак по знак, докато не намери интервал. След това поставя всичко, което е вляво от пространството в една колона и каквото е вдясно от пространството в колоната след него.
Правете до ActiveCell = "
името = ActiveCell.Value
За търсене = 1 до Лен(името)
Ако Mid(thename, search, 1) = " " Тогава
ActiveCell.Offset(0, 1) = Отляво(името, гледам - 1)
ActiveCell.Offset(0, 2) = Mid(името, изглежда + 1)
Изход за
Край, ако
Следващия
ActiveCell.Offset(1, 0).Активиране
Примка
Тази рутина е полезна при анализиране на имена само с едно интервал, като Харви Уолбангър или Том Колинс. Следната таблица показва резултата от изпълнение на кода върху имена с повече от един интервал:
д-р Уилям Лечител |
д-р |
Уилям Лечител |
Зак Х. Кихане III |
Зак |
Х. Кихане III |
Това не е добър опит за синтактичен анализ. Получи се добре за анализирането на Харви Уолбангър и Том Колинс, но не толкова добре за другите имена.
Ето една по-развита техника, която дава по-добри резултати. Имайте предвид, че синтактичният анализ на имената не е перфектен, но това върши по-добра работа.
Техниката е да се преброи колко интервала има в пълното име и след това да се раздели името на едно от интервалите. По-специално, ако има три или повече интервала, използвайте интервала два вдясно като прекъсващо пространство; в противен случай използвайте най-дясното пространство като прекъсващо пространство.
Този процес се изпълнява в подпрограма на VBA, която извиква функция, докато преглежда имената. Броят на интервалите се определя рано в главния цикъл и функцията връща позицията, където е прекъсващото пространство.
Sub parse_name()
Затъмнете името като низ
Затъмнени интервали като цяло число
Правете до ActiveCell = "
името = ActiveCell.Value
интервали = 0
За тест = 1 до Len(името)
Ако Mid(името, тест, 1) = " " Тогава
интервали = интервали + 1
Край, ако
Следващия
Ако интервалите >= 3 Тогава
break_space_position = space_position(" ", името, интервали - 1)
иначе
break_space_position = space_position(" ", името, интервали)
Край, ако
Ако интервалите > 0 Тогава
ActiveCell.Offset(0, 1) = Ляво(името, позиция_разкъсване - 1)
ActiveCell.Offset(0, 2) = Mid(името, break_space_position + 1)
иначе
' това е за случаите, когато пълното име е само едно име без интервали
ActiveCell.Offset(0, 1) = името
Край, ако
ActiveCell.Offset(1, 0).Активиране
Примка
Край под
Функция space_position(what_to_look_for като низ, what_to_look_in като низ, space_count като цяло число) Като цяло число
Dim loop_counter Като цяло число
space_position = 0
For loop_counter = 1 To space_count
space_position = InStr(loop_counter + space_position, what_to_look_in, what_to_search)
Ако space_position = 0, тогава Exit For
Следващия
Крайна функция
Следната таблица показва как изглежда резултатът сега:
д-р Уилям Лечител |
д-р Уилям |
лечител |
Зак Х. Кихане III |
Зак Х. |
Кихане III |
Разборът на имена е също толкова изкуство, колкото и технически процес. В този втори пример всички собствени и фамилни имена са в правилните колони. Ако бъде въведено ново дълго име с пет или повече интервала, рутината може да обърка синтактичния анализ и VBA кодът ще се нуждае от повече условно тестване, поставено в него. Но този пример сега е на прав път като рутина за анализ на имена с индустриална сила.