Excel: Įvedamų duomenų kontrolė

Į mūsų įmonę atėjo naujas skyriaus vadovas. Rimtas toks, iš karto griebė jautį už ragų, tai tuo tarpu ir man užduočių pažėrė. Kažkada jau rašiau apie makro laikroduką, kuris naudojamas darbo laiko stebėjimo bylose. Tai vat, šis naujas vadovas, sumanė padaryti taip, kad jeigu darbuotojai nenurodys visų reikalingų duomenų, tai nebūtų galima paspausti „Stop“ mygtuko. Taigi, apie tai ir papasakosiu.

Darbo laiko apskaitos bylose, nusprendžiau nenaudoti to timer’io, apie kurį rašiau. Toks laikrodžio variantas man netiko, nes einantis laikas sustodavo kiekvieną kartą redaguojant kitą celę, net ir dirbant kitoje darbaknygėje. Todėl padariau paprastesnį laiko paskaičiavimo variantą: du mygtukai – abu įrašo esamą laiką ir pasiskaičiuoja skirtumas tarp pabaigos laiko ir pradžios. Taigi „Stop“ mygtuką ir turėjau „paturbinti“. Failas atrodo maždaug šitaip:

„Start“ mygtukas esamą tikslų laiką įrašo į „Pradžia“ stulpelį, o į „Data“ – datą. Tuo tarpu „Stop“ įrašo tik pabaigos laiką.

Makrokomandos nėra stipriausioji mano pusė. Taip yra dėl to, nes darbe nepasitaiko progų jas dažnai naudoti. Ir šios bylos su makrolaikrodžiu buvo antras darbelis kuriame jas naudojau. Rezultatas gavosi gan primityvokas ir gan nepatogus – pradžios laiką įrašyti buvo galima tik stovint „Pradžia“ stulpelyje, pabaigos – „Pabaiga“ stulpelyje.

Šiame pavyzdyje pateikiu makrokomandas, kurias pritaikiau pačioje tobulinimo pradžioje, galutiniame variante, pridėjau daugiau įvairių apsaugų, nuo neteisingų duomenų įvedimo, na ir žinoma, nebereikia stovėti „Pradžia“ ir „Pabaiga“ stulpelyje, kad būtų galima įrašyti laiką.

Private Sub CommandButton1_Click()
Sheet1.Unprotect Password:="pass"
If ActiveCell.Column = 10 Then
ActiveCell.Value = Time()
Cells(ActiveCell.Row, ActiveCell.Column - 7) = Date
ActiveCell.NumberFormat = "hh:mm:ss"
Else
MsgBox "Pradžios laiką galima įrašyti tik 'Pradžia' stulpelyje", vbCritical, "Error"
End If
Sheet1.Protect Password:="pass"
ActiveWorkbook.Save
End Sub

Private Sub CommandButton2_Click()
If Range("D" & (ActiveCell.Row)).Value = 0 Then
MsgBox "Nepasirinktas užsakovas", vbCritical, "Error"
Exit Sub
ElseIf Range("G" & (ActiveCell.Row)).Value = 0 Then
MsgBox "Nepasirinkta funkcija", vbCritical, "Error"
Exit Sub
ElseIf Range("H" & (ActiveCell.Row)).Text = "" Then
MsgBox "Nenurodytas kiekis", vbCritical, "Error"
Exit Sub
ElseIf Range("G" & (ActiveCell.Row)).Text = "Kita (su komentarais)" And Range("O" & (ActiveCell.Row)).Text = "" Then
MsgBox "Būtina nurodyti komentarą", vbCritical, "Error"
Exit Sub
Else
Sheet1.Unprotect Password:="pass"
If ActiveCell.Column = 11 Then
ActiveCell.Value = Time()
ActiveCell.NumberFormat = "hh:mm:ss"
Else
MsgBox "Pabaigos laiką galima įrašyti tik 'Pabaiga' stulpelyje", vbCritical, "Error"
End If
Sheet1.Protect Password:="pass"
ActiveWorkbook.Save
End If
End Sub

Ar galima tokią duomenų įvedimo kontrolę padaryti be mygtukų? Galima, tačiau kiek googlinau, tai visi atsakymai apie duomenų kontrolę atvesdavo prie formų pildymo (User Form). Apie jas gal kada papasakosiu, kai daugiau sužinosiu.