Attribute VB_Name = "Module1" Private Function ViimeinenValilyonti(ByVal N As String) As Long 'Funktio ViimeinenValilyonti saa parametrina N käsiteltävän nimen. 'Parametrin oletetaan olevan henkilön koko nimi, muodossa "Etunimi Sukunimi". 'Funktio palauttaa viimeisen välilyönnin position merkkijonosta. 'Jos parametrina N välitetään esimerkiksi nimi "Anna Malli", funktion halutaan palauttavan arvo 5. 'Toisaalta, jos nimessä käytetään esimerkiksi keskimmäisen nimen kirjainta, tai jos etunimi on kaksiosainen, funktion halutaan palauttavan löydetyistä sanaväleistä viimeinen. 'Toisin sanoen, kun parametrina N välitetään nimi "Anna Kaisa Malli", funktion halutaan palauttavan arvon 11. Dim LoydPos As Long Dim TarkPos As Long LoydPos = 1 TarkPos = 0 Do TarkPos = InStr(TarkPos + 1, N, " ") If TarkPos > 0 Then LoydPos = TarkPos Loop Until TarkPos = 0 ViimeinenValilyonti = LoydPos End Function Private Sub TestaaValilyonti() 'Testauksen voi suorittaa myös siten, että kirjoittaa erilaisia nimiä Excelin soluihin ja suorittaa koodin silmukassa kaikille riveille. 'Tällöin vastauksen voi ensin ottaa vaikka viereiseen soluun, jotta koodi ei päällekirjoita testattavia arvoja. 'Tällöin testauksen tuloksen näkee helposti vertaamalla vierekkäisissä soluissa olevia merkkijonoja. 'Jos koodi ei toiminut oikein, testattavat nimet ovat käytettävissä uutta yritystä varten. MsgBox ViimeinenValilyonti("Anna Kaisa Malli") End Sub Sub KaannaNimet() Attribute KaannaNimet.VB_ProcData.VB_Invoke_Func = " \n14" 'Esimerkissä on tehty nimien käännön pala kerrallaan, samalla saadaan koodiin useampia tuttuja merkkijonofunktioita. 'Silmukkaa (rivit 2-17) kierretään niin kauan kunnes A-sarakkeella tulee vastaan ensimmäinen tyhjä solu. 'Silmukan ensimmäisellä rivillä otetaan A-sarakkeen solussa oleva teksti talteen VanhaNimi-muuttujaan (rivi 3). 'Tämän merkkijonon pituus otetaan talteen NimenPituus-muuttujaan (rivi 4). 'Sitten selvitetään välilyönnin paikka tässä nimessä kutsumalla ViimeinenValilyonti-funktiota ja asettamalla funktion tuottama vastaus ValiLyonti-muuttujaan (rivi 5). 'Välilyönnin paikan perusteella voidaan määritellä ensin etunimen (rivi 6) ja sukunimen (rivi 8 tai 10) pituudet ja sitten ottaa tiedot talteen omiin muuttujiinsa. 'Lopuksi UusiNimi-muuttujaan talletetaan nimi käännettynä (rivit 13-14) ja tämä tieto talletetaan B-sarakkeelle (rivi 15). 'Jos vastauksilla haluttaisiin korvata alkuperäinen nimilista, vastauksen voisi palauttaa suoraan A-sarakkeelle muuttamalla sarakeviittausta rivillä 15. 'Testaukset kannattaa tietenkin tehdä B-sarakkeelle. ' 'Vasta kun tietää, että koodi toimii oikein, kannattaa vaihtaa vastauksen tallettaminen A-sarakkeelle. Dim Rivi As Long Dim VanhaNimi As String Dim EtuNimi As String Dim SukuNimi As String Dim UusiNimi As String Dim EtunimenPituus As Long Dim SukunimenPituus As Long Dim NimenPituus As Long Dim ValiLyonti As Long Rivi = 5 Do While Range("A" & Rivi) <> "" VanhaNimi = Range("A" & Rivi).Value NimenPituus = Len(VanhaNimi) ValiLyonti = ViimeinenValilyonti(VanhaNimi) EtunimenPituus = ValiLyonti - 1 If EtunimenPituus = 0 Then SukunimenPituus = NimenPituus Else SukunimenPituus = NimenPituus - EtunimenPituus - 1 End If EtuNimi = Left(VanhaNimi, EtunimenPituus) SukuNimi = Right(VanhaNimi, SukunimenPituus) UusiNimi = SukuNimi & " " & EtuNimi Range("B" & Rivi).Value = UusiNimi Rivi = Rivi + 1 Loop End Sub Sub KaannaNimetTiivis() Attribute KaannaNimetTiivis.VB_ProcData.VB_Invoke_Func = " \n14" 'Ja sama asia aika paljon tiiviimmin Dim Rivi As Long Rivi = 5 Do While Range("A" & Rivi) <> "" If ViimeinenValilyonti(Range("A" & Rivi).Value) > 0 Then Range("B" & Rivi).Value = Mid(Range("A" & Rivi).Value, ViimeinenValilyonti(Range("A" & Rivi).Value) + 1) & " " & _ Mid(Range("A" & Rivi).Value, 1, ViimeinenValilyonti(Range("A" & Rivi).Value) - 1) Else Range("B" & Rivi).Value = Range("A" & Rivi).Value End If Rivi = Rivi + 1 Loop End Sub