Jumat, 15 Februari 2013

acakrata, macro excel pembuat data acak dengan rata-rata bulat



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