Har du nogensinde fået et Excel-regneark med navne, hvor alle de fulde navne er i én celle? Din opgave er at opdele navnene i fornavn, efternavn - en proces kendt som parsing. Du kan prøve at bruge en formel og/eller en funktion til at hjælpe, eller du kan bruge Visual Basic for Applications (VBA) kode.
En almindelig tilgang er at finde mellemrummet mellem fornavn og efternavn, og voila! – du ved, hvor fornavnet slutter, og efternavnet starter.
Medmindre du har navne, der er mere komplekse i strukturen, såsom Dr. William Healer eller Zak H. Sneezer III.
Her er en typisk VBA-rutine, der ser gennem hvert navn, tegn for tegn, indtil det finder et mellemrum. Derefter placerer den det, der er til venstre for mellemrummet i en kolonne, og det, der er til højre for mellemrummet i kolonnen efter.
Gør indtil ActiveCell = "
thename = ActiveCell.Value
For at se = 1 til Len(navnet)
If Mid(thename, looking, 1) = " " Så
ActiveCell.Offset(0, 1) = Venstre(navnet, ser - 1)
ActiveCell.Offset(0, 2) = Mid(navnet, ser + 1)
Afslut for
Afslut Hvis
Næste
ActiveCell.Offset(1, 0).Aktiver
Løkke
Denne rutine er nyttig til at parse navne med kun ét mellemrum, såsom Harvey Wallbanger eller Tom Collins. Følgende tabel viser resultatet af at køre koden på navne med mere end ét mellemrum:
Dr. William Healer |
Dr. |
William Healer |
Zak H. Sneezer III |
Zak |
H. Nyser III |
Dette er ikke et godt parsingforsøg. Det fungerede fint til at analysere Harvey Wallbanger og Tom Collins, men ikke så godt for de andre navne.
Her er en mere udviklet teknik, der giver bedre resultater. Husk på, at parsing af navne ikke er perfekt, men at gøre det på denne måde gør et bedre stykke arbejde.
Teknikken er at tælle hvor mange mellemrum der er i det fulde navn og derefter skille navnet fra hinanden på et af mellemrummene. Især, hvis der er tre eller flere mellemrum, skal du bruge mellemrummet to i fra højre som brydeplads; ellers skal du bruge pladsen længst til højre som afbrydelsesplads.
Denne proces køres i en VBA-underrutine, der kalder en funktion, mens du går gennem navnene. Antallet af mellemrum bestemmes tidligt i hovedløkken, og funktionen returnerer den position, hvor bryderummet er.
Sub parse_names()
Dæmp navnet som streng
Dæmp mellemrum som heltal
Gør indtil ActiveCell = "
thename = ActiveCell.Value
mellemrum = 0
For test = 1 til Len(navnet)
Hvis Mid(navnet, test, 1) = " " Så
mellemrum = mellemrum + 1
Afslut Hvis
Næste
Hvis mellemrum >= 3, så
break_space_position = space_position(" ", navnet, mellemrum - 1)
Andet
break_space_position = space_position(" ", navn, mellemrum)
Afslut Hvis
Hvis mellemrum > 0, så
ActiveCell.Offset(0, 1) = Venstre(navnet, pause_mellemrumsposition - 1)
ActiveCell.Offset(0, 2) = Mid(navnet, break_space_position + 1)
Andet
' dette er til, når det fulde navn kun er et enkelt navn uden mellemrum
ActiveCell.Offset(0, 1) = navnet
Afslut Hvis
ActiveCell.Offset(1, 0).Aktiver
Løkke
Slut Sub
Funktion space_position(what_to_look_for As String, what_to_look_in As String, space_count Som Integer) Som heltal
Dim loop_counter Som heltal
space_position = 0
For loop_counter = 1 Til space_count
space_position = InStr(loop_counter + space_position, what_to_look_in, what_to_look_for)
Hvis space_position = 0 Afslut for
Næste
Afslut funktion
Følgende tabel viser, hvordan resultatet ser ud nu:
Dr. William Healer |
Dr. William |
Healer |
Zak H. Sneezer III |
Zak H. |
Nyser III |
Navneparsing er lige så meget kunst som teknisk proces. I dette andet eksempel er alle for- og efternavne i de korrekte kolonner. Hvis et nyt langt navn med fem eller flere mellemrum blev introduceret, kan rutinen få parsingen forkert, og VBA-koden ville have brug for mere betinget testning i den. Men dette eksempel er nu på rette vej som en industriel styrke navneparsing rutine.