Membuat rumus penilaian dinamis
Setahun yang lalu, sewaktu saya masih aktif mengembangkan aplikasi sekolah
di beberapa kabupaten di Riau, masalah yang sering saya hadapi
adalah tidak adanya standarisasi rumus dalam menentukan nilai akhir siswa
(rapor akhir), tetapi untung saja variabel nilainya masih sama (rata2
tugas, rata2 ulangan, uts dan uas).
Pada awalnya saya hanya menyediakan input prosentasi untuk masing-masing
nilai tersebut, dan tentu saja cara ini tidak memberikan solusi yang
terbaik mengingat masing-masing guru terkadang mempunyai rumus penilaian
yang berbeda.
Jadi alternatif solusi lain yang saya tawarkan adalah dengan memberikan
keleluasaan untuk menginputkan sendiri rumus dan untuk melakukan ini kita
harus mendefinisikan konstanta untuk mewakili nilai-nilai diatas sebagai
berikut :
Contoh untuk mendapatkan nilai akhir dengan rumus :
Nilai Akhir = ((Rata2 tugas + Rata2 ulangan + UTS) / 3 x 0.6) + (UAS x 0.4)
Maka rumus yang harus diinputkan adalah sebagai berikut :
Gimana sampe disini konsepnya sudah jelas bukan, klo iya kita bahas kodenya
satu per satu dan untuk menyederhanakan program, nilai dari
rata2x
tugas,
rata2x ulangan,
uts dan
uas
langsung diinputkan via textbox.
Pertama kita desain dulu tampilannya seperti berikut :
kemudian tambahkan fungsi berikut untuk memvalidasi inputan nilai hanya
boleh angka.
01
|
Private Function
validAngka(KeyAscii As Integer) As Integer
|
02
|
Dim
strValid As String
|
04
|
On
Error GoTo errHandle
|
06
|
strValid
= "0123456789."
|
08
|
If
InStr(strValid, Chr(KeyAscii)) = 0 And Not (KeyAscii = vbKeyBack) Then
|
kemudian tinggal panggil dimasing-masing event keypress inputan nilai
01
|
Private Sub
txtRata2Tugas_KeyPress(KeyAscii As Integer)
|
02
|
KeyAscii
= validAngka(KeyAscii)
|
05
|
Private Sub
txtRata2Ulangan_KeyPress(KeyAscii As Integer)
|
06
|
KeyAscii
= validAngka(KeyAscii)
|
09
|
Private Sub
txtUAS_KeyPress(KeyAscii As Integer)
|
10
|
KeyAscii
= validAngka(KeyAscii)
|
13
|
Private Sub
txtUTS_KeyPress(KeyAscii As Integer)
|
14
|
KeyAscii
= validAngka(KeyAscii)
|
selain memvalidasi inputan nilai kita juga harus memvalidasi inputan
rumus
penilaian, berikut fungsinya.
01
|
Private Function
validKarakterRumus(KeyAscii As Integer) As Integer
|
02
|
Dim
strValid As String
|
04
|
On
Error GoTo errHandle
|
06
|
strValid
= "0123456789aArRtTuUsS()<>+*/-. "
|
08
|
If
InStr(strValid, Chr(KeyAscii)) = 0 And Not (KeyAscii = vbKeyBack) Then
|
09
|
validKarakterRumus
= 0
|
11
|
validKarakterRumus
= KeyAscii
|
16
|
validKarakterRumus
= 0
|
sama seperti sebelumnya tinggal panggil di event keypress inputan rumus
1
|
Private Sub
txtRumus_KeyPress(KeyAscii As Integer)
|
2
|
KeyAscii
= Asc(UCase(Chr(KeyAscii))) 'otomatis huruf besar
|
3
|
KeyAscii
= validKarakterRumus(KeyAscii)
|
terakhir untuk tombol Proses akan melakukan pengecekan terhadap rumus yang
diinputkan jika oke akan langsung menampilkan hasil nya :
001
|
Private Function
isValidConst(ByVal value As String) As Boolean
|
003
|
Dim
strNotValid As String
|
005
|
On
Error GoTo errHandle
|
007
|
strNotValid
= "aArRtTuUsS" 'karakter
konstanta RT, RU, UTS dan UAS
|
010
|
For
i = 1 To Len(value)
|
011
|
If
InStr(1, strNotValid, Mid(value, i, 1)) > 0 Then
|
022
|
Private Function
isValidRumusPenilaian(ByVal rumus As String) As Boolean
|
026
|
Dim
strParsing1 As String
|
027
|
Dim
strParsing2 As String
|
028
|
Dim
strFinalParsing As String
|
030
|
On
Error GoTo errHandle
|
032
|
strParsing1
= Replace(rumus, " ",
"") ' menghapus spasi
|
034
|
strParsing2
= Replace(strParsing1,
"<RT>", 0)
|
035
|
strParsing2
= Replace(strParsing2,
"<RU>", 0)
|
036
|
strParsing2
= Replace(strParsing2,
"<UTS>", 0)
|
037
|
strParsing2
= Replace(strParsing2,
"<UAS>", 0)
|
039
|
strFinalParsing
= Replace(strParsing2, "<", "")
|
041
|
strFinalParsing
= Replace(strFinalParsing, ">", "")
|
042
|
If
Not (Len(strFinalParsing) > 0) Then strFinalParsing = "0"
|
044
|
'cek
klo ada rumus yg tidak sesuai dg konstanta yg sudah didefinisikan, ex :
<RT> ditulis <TR>
|
045
|
If
Not isValidConst(strFinalParsing) Then
|
046
|
isValidRumusPenilaian
= False
|
049
|
Set
script = CreateObject("ScriptControl")
|
050
|
script.Language
= "VBScript"
|
051
|
result
= script.Eval(strFinalParsing)
|
054
|
isValidRumusPenilaian
= True
|
060
|
isValidRumusPenilaian
= False
|
063
|
Private Function
execFormula(ByVal rumus As String) As Single
|
066
|
On
Error GoTo errHandle
|
068
|
Set
script = CreateObject("ScriptControl")
|
069
|
script.Language
= "VBScript"
|
070
|
execFormula
= script.Eval(rumus)
|
078
|
Private Function
getNilaiAkhirByRumus(ByVal rumus As String, ByVal nilaiRT As Single, ByVal
nilaiRU As Single, _
|
079
|
ByVal
nilaiUTS As Single, ByVal nilaiUAS As Single) As Single
|
081
|
Dim
strParsing1 As String
|
082
|
Dim
strParsing2 As String
|
083
|
Dim
strFinalParsing As String
|
085
|
On
Error GoTo errHandle
|
087
|
strParsing1
= Replace(rumus, " ",
"") ' menghapus spasi
|
088
|
strParsing2
= Replace(strParsing1,
"<RT>", nilaiRT) ' mengganti const <RT> ke nilai nilaiRT
|
089
|
strParsing2
= Replace(strParsing2,
"<RU>", nilaiRU) ' mengganti const <RU> ke nilai
nilaiRU
|
090
|
strParsing2
= Replace(strParsing2,
"<UTS>", nilaiUTS) ' mengganti const <UTS> ke
nilaiUTS
|
091
|
strParsing2
= Replace(strParsing2, "<UAS>",
nilaiUAS) ' mengganti const <UAS> ke nilaiUAS
|
093
|
strFinalParsing
= Replace(strParsing2, "<", "")
|
094
|
strFinalParsing
= Replace(strFinalParsing, ">", "")
|
096
|
If
Not (Len(strFinalParsing) > 0) Then strFinalParsing = "0"
|
098
|
getNilaiAkhirByRumus
= FormatNumber(execFormula(strFinalParsing), 0)
|
103
|
getNilaiAkhirByRumus
= 0
|
106
|
Private Sub
cmdProses_Click()
|
107
|
If
isValidRumusPenilaian(txtRumus.Text) Then
|
108
|
txtNilaiAkhir.Text
= getNilaiAkhirByRumus(txtRumus.Text, Val(txtRata2Tugas.Text),
Val(txtRata2Ulangan.Text), Val(txtUTS.Text), Val(txtUAS.Text))
|
111
|
MsgBox
"Rumus yang Anda inputkan tidak valid", vbExclamation,
"Peringatan"
|
Selamat
MENCOBA
Tidak ada komentar:
Posting Komentar