Assalaamu’alaikum.
Buka
Excel kemudian tekan Alt+F11 untuk berpindah ke lingkungan VBA. Buat sebuah
userform yang berisi sebuah caption, TextBox, dan CommandButton seperti ini.
Name
|
Caption
|
ShowModal
|
|
UserForm1
|
FrmRata
|
Rata-rata Acak
|
False
|
Label1
|
Banyak data yang diinginkan
|
||
TextBox1
|
TxtData
|
||
CommandButton1
|
CmdRata
|
Rata
|
Masuk
ke mode ‘View Code’ dengan mengeklik ikon atau menekan tombol shortcut F7. Kita masukkan
sebuah fungsi Acak. Nantinya fungsi ini kita gunakan untuk mengacak suatu
bilangan dengan range tertentu. Tuliskan script ini.
Function Acak(BilMin, BilMax)
Acak = Round(Rnd() * (BilMax - BilMin)) +
BilMin
End Function
Kita
beralih ke mode ‘View Object’ dengan mengeklik ikon atau menekan tombol shortcut shift+F7. Kita
dobel klik CmdRata, kemudian mulai deh sekarang nyekrip.
Kita
bagi menjadi dua kasus. Jika datanya genap kita perlakukan sendiri, jika banyak
data itu ganjil maka kita perlakukan berbeda lagi. Sekarang kita masuk ke data
yang banyaknya genap. Berarti kita siapkan if. Tapi sebelumnya kita nyatakan
dulu TxtData ke dalam variabel Data. Untuk itu, kita butuhkan variabel ‘Data’.
Dim Data As Integer.
Data = Val (TxtData)
If Data Mod
2 = 0 Then
Untuk
jaga-jaga, paling bawah sendiri kita tutup if tadi dengan End If. Kemudian kita
siapkan sebuah rata-rata yang sudah pasti. Berarti kita butuhkan variabel
‘Rata’. Tambahkan ke atas ke sisi variabel data. Jadi sekarang paling atas
menjadi seperti ini.
Dim Data, Rata As Integer
Rata =
Acak(5, 9)
Ilustrasi
Misalkan
rata-rata kita adalah 5. Kita bayangkan datanya semuanya 5. Kemudian kita ambil
sebuah bilangan acak ‘a’ yang kurang dari 5. a ini menjadi pengurang/penambah 5
tadi. Misalkan a=2 berarti Bilangan pertama bernilai 5-2=3 dan bilangan ke dua
bernilai 5+2=7. Jelas dong rata-ratanya pasti 7. Kita luping-kan.
Misalkan ternyata pada putaran ke dua ‘a’nya bernilai 1. Berarti bilangan ke
tiga adalah 5-1=4 dan bilangan ke empat adalah 5+1=6. Kemudian jika pada luping
ke tiga a=3, berarti bilangan ke lima=2, bilangan ke enam=8. Terus seperti itu
sampai datanya berjumlah sama dengan variabel ‘Data’ tadi. Karena setiap kali luping
ada 2 data, berarti kita batasi lup kita hanya sebatas Data/2.
Ilustrasinya seperti ini.
Kita
ke script.
Berarti
sekarang kita butuh variabel baru lagi, yaitu a dan sebuah variabel array Bil(100),
kita batasi seratus saja. Tidak banyak-banyak. Jadi sekarang di bagian atas
sendiri menjadi seperti ini.
Dim Data,
Rata, a, Bil(100) As Integer
Script
lanjutannya adalah
For i = 1 To Data / 2
a =
Acak(1, Int(Rata / 2))
Bil(2
* i - 1) = Rata – a
Bil(2 * i) = Rata + a
Kita
tampilkan bilangan satu dan bilangan dua ke sel A1 dan B1 dengan script ini.
Cells(1, 2 * i - 1) = Bil(2 * i - 1)
Cells(1, 2 * i) = Bil(2 * i)
Next
Terakhir,
kita tutup dengan next seperti di atas ini. Mengapa? Itu karena pasangan for adalah next.
Kalau
program itu dijalankan, keluarannya misalnya seperti ini.
3,
7, 4, 6, 2, 8, 1, 9.
Algoritma
mengacak data yang sudah ada
Kalau
hanya seperti itu saja, akan sangat mudah ditebak, hasilnya pasti berurutan.
Misalkan saja kita membuat soal yang agak banyak, pasti yang menjawab akan
sangat mudah menemukan polanya, yaitu tinggal menambahkan bil 1 dan bil 2,
kemudian hasilnya dibagi dua. Langsung ketemu. Makanya kita harus mengacak
bilangan-bilangan itu dengan sebuah langkah (algoritma) lagi. Langkah-langkah
ini saya peroleh dari seorang teman, yaitu pakizul, Zulkaida Akbar. Dia sangat
canggih! Scriptnya seperti ini.
j = 1
For i = Data To 1 Step -1
x =
Acak(1, i)
Cells(2, j) = Bil(x)
j = j
+ 1
Bil(x) = Bil(i)
Next
Ada
variabel-variabel baru kan? Berarti pada bagian Dim kita tambahi lagi
variabelnya, yaitu x. Seperti ini.
Dim Data,
Rata, a, x, Bil(100) As Integer
Iterasi
pertama, i=8. Kita acak sebuah bilangan x. Yang kita acak dari 1 sampai 8,
misalkan ternyata yang kepilih adalah 4, berarti x=4. Kita tulis di excel pada
sel(2,1)=bil(4). Untuk itu kita tuliskan j=1 sebelum for.
Bilangan ke empat pada contoh adalah 6. Jadi sel(2,1)=6. j nya kita tambah
satu, biar berjalan, kemudian bilangan ke i(bilangan terakhir) kita masukkan ke
bilangan x, yang tadi sudah kita tulis. Ilustrasinya.
3
|
7
|
4
|
6
|
2
|
8
|
1
|
9
|
\_____________/
6
kita tulis. Sekarang urutannya menjadi
3
|
7
|
4
|
9
|
2
|
8
|
1
|
9
|
Pada
iterasi yang ke dua, sekarang i nya menjadi 7 saja, karena stepnya -1 itu
artinya dari 8 sampai 1 berjalan mundur. Berarti i yang tadinya 8 sekarang
berkurang satu menjadi 7. Jadi data ke delapan tidak terpakai lagi. Konsentrasi
kita sekarang ke data 1 sampai 7 saja. Jadi urutannya adalah seperti ini.
3
|
7
|
4
|
9
|
2
|
8
|
1
|
Output:
6
Kita
acak sebuah bilangan dari 1 sampai 7 kemudian hasilnya dimasukkan ke dalam
variabel x. Misalkan saja yang terpilih adalah 6. x=6. Berarti sekarang yang
ditulis adalah bilangan ke enam, yaitu 8. Sel(2,2)=8. Benar kan? Karena
tadi j nya sudah kita tambahkan 1 sekarang j=2. Kemudian data terakhir
menggeser data yang terpilih tadi. Jadi sekarang bilangan ke enam=1. Datanya
menjadi begini.
3
|
7
|
4
|
9
|
2
|
8
|
1
|
\___/
Menjadi
3
|
7
|
4
|
9
|
2
|
1
|
1
|
Bilangan
terakhir kita buang menjadi
3
|
7
|
4
|
9
|
2
|
1
|
Output:
6, 8
Iterasi
ke tiga, dipilih bilangan acak dari 1 sampai 6. Misalkan x=2. Bilangan ke dua
kita tulis di output, yaitu sel (2,3), kemudian bilangan terakhir kita gantikan
ke dalam bilangan ke dua.
3
|
7
|
4
|
9
|
2
|
1
|
\_____________/
Menjadi
seperti ini.
3
|
1
|
4
|
9
|
2
|
1
|
Setelah
kita buang bilangan terakhir menjadi seperti ini.
3
|
1
|
4
|
9
|
2
|
Output:
6,
8, 7
Iterasi
ke empat, misalkan x=2 lagi. Berarti bilangan ke dua kita tuliskan di output,
bilangan ke lima kita masukkan ke bilangan ke dua, dan bilangan ke lima kita
abaikan.
3
|
1
|
4
|
9
|
2
|
\_________/
3
|
2
|
4
|
9
|
2
|
Bilangan
terakhir diabaikan.
3
|
2
|
4
|
9
|
Output:
6,
8, 7, 1
Iterasi
ke lima, misalkan x=3, berarti bilangan ke tiga, yaitu 4 dituliskan di output.
9 masuk ke bilangan ke tiga, dan bilangan ke empat diabaikan.
3
|
2
|
4
|
9
|
\__/
3
|
2
|
9
|
Output:
6,
8, 7, 1, 4
Komputer
akan melakukan luping terus sampai i
nya = 1, sampai habis. Misalkan perolehan outputnya seperti ini.
6,
8, 7, 1, 4, 2, 3, 9.
Sekarang
sudah tidak urut lagi kan?
Closing
Script
kita sampai saat ini adalah seperti ini.
Private Sub CmdRata_Click()
Dim Data, Rata, a, x, Bil(100) As Integer
Data = Val(TxtData)
If Data Mod 2 = 0 Then
Rata
= Acak(5, 9)
For i
= 1 To Data / 2
a
= Acak(1, Int(Rata / 2))
Bil(2 * i - 1) = Rata + a
Bil(2 * i) = Rata - a
Cells(1, 2 * i - 1) = Bil(2 * i - 1)
Cells(1, 2 * i) = Bil(2 * i)
Next
j = 1
For i
= Data To 1 Step -1
x
= Acak(1, i)
Cells(2, j) = Bil(x)
j
= j + 1
Bil(x) = Bil(i)
Next
End If
End Sub
Function Acak(BilMin, BilMax)
Acak = Round(Rnd() * (BilMax - BilMin)) +
BilMin
End Function
Ini belum berakhir ya.. tapi semoga
bermanfaat.
Wassalaamu’alaikum.
link download pdfnya bisa diunduh di google drive ini:
https://docs.google.com/file/d/0B-WmUMQtTTUYdzk1S01PWGpFX2M/edit?usp=sharing
link download programnya di google drive ini:
https://docs.google.com/file/d/0B-WmUMQtTTUYeUR4NkVpb0JkN1E/edit?usp=sharing
Tidak ada komentar:
Posting Komentar