Да ли сте икада добили Екцел радни лист са именима, у коме су сва имена у једној ћелији? Ваш задатак је да разбијете имена на име, презиме - процес познат као рашчлањивање. Можете покушати да користите формулу и/или функцију као помоћ, или можете користити Висуал Басиц за апликације (ВБА) код.
Уобичајени приступ је проналажење размака између имена и презимена, и воила! – знате где се завршава име и где почиње презиме.
Осим ако немате имена која су сложенија по структури, као што су др Вилијам Хеалер или Зак Х. Снизер ИИИ.
Ево типичне ВБА рутине која прегледа свако име, знак по знак, док не пронађе размак. Затим ставља све што је лево од размака у једну колону и оно што је десно од простора у колони после.
Уради док АцтивеЦелл = "
тхенаме = АцтивеЦелл.Валуе
За тражење = 1 до Лен(име)
Ако је Мид(тхенаме, лоокинг, 1) = " " Онда
АцтивеЦелл.Оффсет(0, 1) = Лево (име, изгледа - 1)
АцтивеЦелл.Оффсет(0, 2) = Средина (име, изгледа + 1)
Изађи за
Крај Ако
Следећи
АцтивеЦелл.Оффсет(1, 0).Активирај
Лооп
Ова рутина је корисна за рашчлањивање имена са само једним размаком, као што су Харвеи Валлбангер или Том Цоллинс. Следећа табела приказује резултат покретања кода на именима са више од једног размака:
др Виллиам Хеалер |
др. |
Виллиам Хеалер |
Зак Х. Снеезер ИИИ |
Зак |
Х. Снеезер ИИИ |
Ово није добар покушај рашчлањивања. Било је добро за рашчлањивање Харвија Волбанџера и Тома Колинса, али не тако добро за друга имена.
Ево развијеније технике која даје боље резултате. Имајте на уму да рашчлањивање имена није савршено, али овај начин ради боље.
Техника је да се изброји колико је размака у пуном називу, а затим раздвоји име на једном од размака. Конкретно, ако постоје три или више размака, користите размак два у десно као размак; у супротном, користите крајњи десни размак као размак.
Овај процес се покреће у ВБА потпрограму који позива функцију док се креће кроз имена. Број размака се одређује рано у главној петљи, а функција враћа позицију на којој се налази размак.
Суб парсе_намес()
Затамните име Ас Стринг
Дим спацес Ас Интегер
Уради док АцтивеЦелл = "
тхенаме = АцтивеЦелл.Валуе
размаци = 0
За тест = 1 То Лен(име)
Ако је средина(име, тест, 1) = " " Онда
размаци = размаци + 1
Крај Ако
Следећи
Ако је размака >= 3 Онда
бреак_спаце_поситион = спаце_поситион(" ", тхенаме, спацес - 1)
Иначе
бреак_спаце_поситион = спаце_поситион(" ", име, размаци)
Крај Ако
Ако су размаци > 0 Онда
АцтивеЦелл.Оффсет(0, 1) = Лево(име, позиција_размака - 1)
АцтивеЦелл.Оффсет(0, 2) = Мид(тхенаме, бреак_спаце_поситион + 1)
Иначе
' ово је за случај када је пуно име само једно име без размака
АцтивеЦелл.Оффсет(0, 1) = име
Крај Ако
АцтивеЦелл.Оффсет(1, 0).Активирај
Лооп
Енд Суб
Функција спаце_поситион(вхат_то_лоок_фор Ас Стринг, вхат_то_лоок_ин Ас Стринг, спаце_цоунт Ас Интегер) Као цео број
Дим лооп_цоунтер као цео број
спаце_поситион = 0
Фор лооп_цоунтер = 1 То спаце_цоунт
спаце_поситион = ИнСтр(лооп_цоунтер + спаце_поситион, вхат_то_лоок_ин, вхат_то_траск)
Ако је спаце_поситион = 0, онда Екит Фор
Следећи
Енд Фунцтион
Следећа табела показује како сада изгледа резултат:
др Виллиам Хеалер |
др Вилијам |
Исцелитељ |
Зак Х. Снеезер ИИИ |
Зак Х. |
Снеезер ИИИ |
Рашчлањивање имена је исто толико уметност колико и технички процес. У овом другом примеру, сва имена и презимена су у тачним колонама. Ако се уведе ново дуго име са пет или више размака, рутина би могла погрешно анализирати и ВБА код би захтевао више условног тестирања. Али овај пример је сада на добром путу као рутина рашчлањивања имена индустријске снаге.