Har du noen gang fått et Excel-regneark med navn, der alle de fulle navnene er i én celle? Din oppgave er å dele navnene inn i fornavn, etternavn - en prosess kjent som parsing. Du kan prøve å bruke en formel og/eller funksjon for å hjelpe, eller du kan bruke Visual Basic for Applications (VBA)-kode.
En vanlig tilnærming er å finne mellomrommet mellom fornavn og etternavn, og vips! – du vet hvor fornavnet slutter og etternavnet begynner.
Med mindre du har navn som er mer komplekse i strukturen, for eksempel Dr. William Healer eller Zak H. Sneezer III.
Her er en typisk VBA-rutine som ser gjennom hvert navn, tegn for tegn, til det finner et mellomrom. Deretter plasserer den det som er til venstre for rommet i en kolonne og det som er til høyre for rommet i kolonnen etter.
Gjør til ActiveCell = "
thename = ActiveCell.Value
For å se = 1 til Len(navnet)
Hvis Mid(navnet, ser, 1) = " " Da
ActiveCell.Offset(0, 1) = Venstre(navnet, ser - 1)
ActiveCell.Offset(0, 2) = Midt(navnet, ser + 1)
Avslutt for
Slutt om
Neste
ActiveCell.Offset(1, 0).Aktiver
Løkke
Denne rutinen er nyttig for å analysere navn med bare ett mellomrom, for eksempel Harvey Wallbanger eller Tom Collins. Følgende tabell viser resultatet av å kjøre koden på navn med mer enn ett mellomrom:
Dr. William Healer |
Dr. |
William Healer |
Zak H. Sneezer III |
Zak |
H. Nyser III |
Dette er ikke et godt parseforsøk. Det fungerte bra for å analysere Harvey Wallbanger og Tom Collins, men ikke så bra for de andre navnene.
Her er en mer utviklet teknikk som gir bedre resultater. Husk at å analysere navn ikke er perfekt, men å gjøre det på denne måten gjør en bedre jobb.
Teknikken er å telle hvor mange mellomrom som er i det fulle navnet og deretter bryte navnet på et av mellomrommene. Spesielt, hvis det er tre eller flere mellomrom, bruk mellomrom to inn fra høyre som bryterom; ellers, bruk plassen lengst til høyre som bruddplass.
Denne prosessen kjøres i en VBA-subrutine som kaller en funksjon mens du går gjennom navnene. Antall mellomrom bestemmes tidlig i hovedsløyfen, og funksjonen returnerer posisjonen der bryteplassen er.
Sub parse_names()
Demp navnet som streng
Demp mellomrom som heltall
Gjør til ActiveCell = "
thename = ActiveCell.Value
mellomrom = 0
For test = 1 til Len(navnet)
Hvis Mid(navnet, test, 1) = " " Da
mellomrom = mellomrom + 1
Slutt om
Neste
Hvis mellomrom >= 3 Da
break_space_position = space_position(" ", navnet, mellomrom - 1)
Ellers
break_space_position = space_position(" ", navn, mellomrom)
Slutt om
Hvis mellomrom > 0 Da
ActiveCell.Offset(0, 1) = Venstre(navnet, pause_mellomromsposisjon - 1)
ActiveCell.Offset(0, 2) = Midt(navnet, pause_mellomromsposisjon + 1)
Ellers
' dette er for når det fulle navnet bare er et enkelt navn uten mellomrom
ActiveCell.Offset(0, 1) = navnet
Slutt om
ActiveCell.Offset(1, 0).Aktiver
Løkke
End Sub
Funksjon space_position(what_to_look_for As String, what_to_look_in As String, space_count As Integer) Som heltall
Dim loop_counter Som heltall
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 Avslutt for
Neste
Avslutt funksjon
Følgende tabell viser hvordan resultatet ser ut nå:
Dr. William Healer |
Dr. William |
Helbreder |
Zak H. Sneezer III |
Zak H. |
Nyser III |
Navneparsing er like mye kunst som teknisk prosess. I dette andre eksemplet er alle for- og etternavn i de riktige kolonnene. Hvis et nytt langt navn med fem eller flere mellomrom ble introdusert, kan rutinen få parsingen feil, og VBA-koden vil trenge mer betinget testing i den. Men dette eksemplet er nå på rett spor som en rutine for industri-styrke navneparsing.