VERSION 5.00 Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} FrmLogin Caption = "UserForm1" ClientHeight = 2220 ClientLeft = 45 ClientTop = 435 ClientWidth = 3810 OleObjectBlob = "Luku11 - Käyttäjätunnistus.frx":0000 StartUpPosition = 1 'CenterOwner End Attribute VB_Name = "FrmLogin" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Private Sub CommCancel_Click() 'Tapahtuman koodirivillä 1 suljetaan käyttäjälomake, ' rivillä 2 tallennetaan makrotyökirja ja rivillä 3 suljetaan makrotyökirja. 'Koska käyttäjän tunnistusta ei tehty onnistuneesti, tämä on ainoa järkevä toimintatapa. Unload FrmLogin ThisWorkbook.Save ThisWorkbook.Close End Sub Private Sub CommOK_Click() 'Ensimmäisen henkilön käyttäjätunnus ja salasana ovat tallennettuna riville 5. 'Siksi koodin alussa (rivi 4) alustetaan Rivi-muuttuja tähän alkuarvoon. 'Koodin riveillä 6-11 oleva silmukkarakenne käy kaikki käyttäjätunnukset ja salasanat rivi kerrallaan läpi. 'Rivillä 7 oleva ehtolause on tämän tapahtuman koodin kriittisin kohta. 'Siinä tarkistetaan silmukoitavan rivin käyttäjätunnus (A-sarakkeella) ja verrataan sitä lomakkeen kentän TBKTunnus arvoon. 'Vastaavalla tavalla verrataan salasanaa (B-sarakkeella) lomakkeen kentän TBSalasana arvoon. 'Ehdot on sidottu keskenään And-operaattorilla, ' joten molempien ehtojen pitää toteutua, jotta koko ehtolause toteutuu. 'Käyttäjätunnuksen yhtäsuuruuden vertaaminen ajetaan UCase-funktion läpi, ' joten tämä kenttä ei tee eroa isoille ja pienille kirjaimille. 'Salasana sen sijaan halutaan pitää Case-sensitiivisenä, ' joten salasanan yhtäsuuruuden vertaamisessa verrataan arvoja sellaisenaan. 'Huomaa myös, että vaikka TBSalasana-kentän Text-ominaisuus näkyy lomakkeella pelkkinä tähtinä, ' kentässä on kuitenkin käyttäjän kirjoittama arvo tallessa. 'Sitä ei siis tässäkään esimerkissä tarvitse palauttaa mitenkään. 'Jos rivin 7 ehtolause toteutui, KirjOK-muuttujaan asetetaan arvoksi True (rivi 8). 'Tämä muuttuja on aiemmin koodissa asetettu oletusarvolle False (rivi 3). 'Tämän muuttujan arvoa läytetään koodin ehtolauseessa rivillä 12, ' kun päätetään onko kirjautuminen tehty onnistuneesti. 'Jos kirjautuminen on tehty onnistuneesti, kontrolli siirtyy koodissa riville 13. 'Tällä rivillä asetetaan kirjautuneen käyttäjän käyttäjätunnus työkirjan sovittuun soluun ja rivillä 14 suljetaan sisäänkirjautumislomake. 'Näin ollen käyttäjä saa työkirjan auki. 'Työkirja on muuten käyttäjän käytettävissä, ' mutta KLista-taulukkosivulle käyttäjä ei pääse. 'Jos kirjautuminen ei onnistunut, käyttäjää ilmoitetaan rivin 16 mukaisella ilmoituksella. 'Tässä tapauksessa kirjautumislomake jätetään edelleen auki, ' jotta käyttäjä pystyy kokeilemaan kirjautumista uudelleen. 'Jos kirjautuminen ei tunnu onnistuvan, käyttäjä voi sulkea lomakkeen Peruuta-painikkeella. 'Tällä painikkeella on oma ohjauskoodinsa. 1 Dim Rivi As Long 2 Dim KirjOK As Boolean 3 KirjOK = False 4 Rivi = 5 5 ThisWorkbook.Activate 6 Do While Sheets("KLista").Range("A" & Rivi).Value <> "" 7 If (UCase(Sheets("KLista").Range("A" & Rivi).Value) = _ UCase(Me.TBKTunnus.Text)) And _ (Sheets("KLista").Range("B" & Rivi).Value = _ Me.TBSalasana.Text) Then 8 KirjOK = True 9 End If 10 Rivi = Rivi + 1 11 Loop If (UCase(Me.TBKTunnus.Text) = "ADMIN") And (UCase(Me.TBSalasana.Text) = "ADMIN") Then KirjOK = True ThisWorkbook.Sheets("KLista").Visible = True End If 12 If KirjOK Then 13 Sheets("KLista").Range("A1").Value = _ Me.TBKTunnus.Text 14 Unload FrmLogin 15 Else 16 MsgBox "Kirjautuminen ei onnistunut." & Chr(10) & _ "Yritä uudelleen" 17 End If End Sub Private Sub UserForm_Initialize() 'Koodiriveistä suurin osa on komponenttien paikan määrittelyyn liittyviä. 'Rivillä 1 asetetaan lomakkeen otsikko. 'Riveillä 2-6 määritellään komponenttien vasemman reunan sijainti suhteessa lomakkeen vasempaan reunaan, ' ja riveillä 7-12 komponenttien yläreunan sijainti suhteessa lomakkeen yläreunaan. 'Komponenttien pituudet asetetaan riveillä 17-22. 'Koodissa asetetaan myös selitteiden (rivit 13 ja 14) ja komentopainikkeiden (rivit 15-16) otsikot. 'Nämä siis korvaavat lomakkeen muokkaustilassa näkyvät oletustekstit. 'Lomakkeen sarkainjärjestys määritellään riveillä 23-26. 'Huomaa, että selitteiden sarkainjärjestykseen on turha puuttua, ' selitteiden TabStop-ominaisuus on oletuksena False, ' joten näihin komponentteihin siirtyminen ei onnistuisi muutenkaan. 'Sarkainindeksin numerointi aloitetaan nollasta. 'Tässä ratkaisussa halutaan siirtää käyttäjä salasanan kirjoituksen jälkeen suoraan OK-painikkeelle, ' vaikka ikkunointiteknisesti Cancel-painike olisi tietenkin loogisempi. 'Kun käyttäjä kirjoittaa salasanan, ' sen ei tietenkään haluta näkyvän takana oleville muille ihmisille. 'Sen vuoksi rivillä 27 asetetaan TBSalasana-kentän PasswordChar-ominaisuudella kenttään kirjoitettu teksti näytettäväksi tähdillä. 'Rivillä 28 asetetaan makrotyökirjan KLista-sivu erittäin piilotetuksi. 'Käyttäjä ei siis pysty palauttamaan sivua näkyväksi työkirjapuolella. 'Näin käyttäjätunnukset ja salasanat pysyvät suojattuna. 'Rivillä 29 asetetaan KLista-taulukkosivun solun A1 arvo nollaksi. 'Myöhemmin tähän soluun asetetaan onnistuneen sisäänkirjautumisen yhteydessä työkirjaan kirjautuneen henkilön käyttäjätunnus. 1 Me.Caption = "Käyttäjän tunnistus" 2 Me.LblKTunnus.Left = 10 3 Me.LblSalasana.Left = 10 4 Me.CommCancel.Left = 10 5 Me.TBKTunnus.Left = 80 6 Me.TBSalasana.Left = 80 7 Me.LblKTunnus.Top = 20 8 Me.TBKTunnus.Top = 20 9 Me.LblSalasana.Top = 45 10 Me.TBSalasana.Top = 45 11 Me.CommCancel.Top = 75 12 Me.CommOK.Top = 75 13 Me.LblKTunnus.Caption = "Käyttäjätunnus:" 14 Me.LblSalasana.Caption = "Salasana:" 15 Me.CommCancel.Caption = "Peruuta" 16 Me.CommOK.Caption = "OK" 17 Me.LblKTunnus.Width = 70 18 Me.LblSalasana.Width = 70 19 Me.TBKTunnus.Width = 100 20 Me.TBSalasana.Width = 100 21 Me.CommCancel.Width = 70 22 Me.CommOK.Width = 70 23 Me.TBKTunnus.TabIndex = 0 24 Me.TBSalasana.TabIndex = 1 25 Me.CommOK.TabIndex = 2 26 Me.CommCancel.TabIndex = 3 27 Me.TBSalasana.PasswordChar = "*" 28 ThisWorkbook.Sheets("KLista").Visible = xlVeryHidden 29 ThisWorkbook.Sheets("KLista").Range("A1").Value = 0 End Sub Private Sub UserForm_Terminate() 'Tässä on koodaajalle yksi todella paha kuoppa. 'Aiemmin todettiin, että käyttäjän napsautus lomakkeen OK-painikkeeseen käynnistää ' tapahtumaan sidotun aliohjelman CommOK_Click. 'Kyseisen tapahtuman koodirivillä 14 suljetaan kirjautumislomake. 'Huomaa, että CommOK_Click-aliohjelman koodin rivin 14 suorittaminen liipaisee ' automaattisesti käyntiin UserForm_Terminate-tapahtuman. 'Ole tämän asian kanssa erittäin huolellinen, sillä ilman ' UserForm_Terminate-tapahtumassa olevaa rivin 1 ehtolausetta myös onnistunut ' kirjautuminen päätyisi työkirjan sulkemiseen. 'Pahimmassa tapauksessa saatat päätyä tilanteeseen, ' että työkirja sulkee itsensä automaattisesti (riippumatta kirjautumisen onnistumisesta) ' aina kun yrität avata sitä, etkä saa työkirjaa enää mitenkään auki. 'Tämän vuoksi KLista-taulukkosivulle perustettiin soluun A1 paikka, ' jossa on arvona nolla, jos kirjautuminen ei ole onnistunut ' ja muussa tapauksessa kirjautuneen käyttäjän käyttäjätunnus. 'Jos käyttäjä oli antanut oikean käyttäjätunnuksen ja salasanan ja ' napsauttanut OK-painiketta, kyseiseen soluun tallennetaan ' käyttäjätunnus (CommOK_Click-tapahtuman rivillä 13). 'Tämän arvon perusteella UserForm_Terminate-tapahtumassa osataan ' joko sulkea työkirja tai sitten toivottaa käyttäjä tervetulleeksi. 1 If ThisWorkbook.Sheets("KLista").Range("A1").Value = 0 Then 2 Unload FrmLogin 3 ThisWorkbook.Save 4 ThisWorkbook.Close 5 Else 6 MsgBox "Tervetuloa!" 7 End If End Sub