2008/10/6 siti Vi <villager.girl@gmail.com>
BEDAH MAKRO by Siti Vi
'------dari workbook kiriman pak safri ishak-------
Option Explicit
Dim intROW As Integer
Dim intLENGTH As Integer
Dim strSTRING As String
Sub Auto_Open()
'AUTO OPEN
'START READING DATA
intROW = 3 'Data Mulai Row ke 3
Do While Trim(Cells(intROW, 2)) <> Empty
'CLEAR
strSTRING = ""
For intLENGTH = Len(Cells(intROW, 2)) To 1 Step -1
strSTRING = Mid(Cells(intROW, 2), intLENGTH, 1) & strSTRING
'BUKAN HURUF BESAR
If Mid(Cells(intROW, 2), intLENGTH, 1) < "A" _
Or Mid(Cells(intROW, 2), intLENGTH, 1) > "Z" Then
Else
'HURUF BESAR
Exit For
End If 'HURUF BESAR
Next intLENGTH
'SIMPAN HASIL
Cells(intROW, 4) = strSTRING
'NEXT DATA
intROW = intROW + 1
Loop 'START READING DATA
'END OF AUTO OPEN
End Sub
'----------------------
Ceritaknya: Ada dua looping,
loop I (loop Luar) Do - While.
Loop ini akan mengunjungi semua data Nama yg ada di kolom B mulai baris3.
Berpindahnya kunjungan diatur dengan menaikkan nilai variale intRow, nilai
Row yg bertype Integer. (jadi jika data lebih dari 32767 (2^15 dihitung dari
0) baris, makro sudah tidak mau bekerja lagi; padahal sebuah sheet bisa saja
memuat 32768 NAMA; Nama ke 32768 tentunya akan tidak akan ikut diproses.)
Loop Luar ini nantinya akan diakhiri jika kunjungannya ke-baris-baris-data
menemui baris kosong.
Di setiap kunjungan ke baris data (yg ada data NAMA nya) diadakan Loop
II (Loop Dalam) For -Next.
Looping II ini mengunjungi karakter demi karakter, dimulai dari karakter terakhir
(terkanan)
Di setiap kunjungan, karakter yg ditemui ditampung-gabung dalam variable strSTRING;
Cara penggabungannya: karakter yg ditemui berikutnya ditaruh di sebelah KIRI
hasil (strSTRING) yg telah ada sebelumnya, Jadi "AhmadSusanto" akan
menghasilkan
strSTRING berkembang dari "o" menjadi "to" lalu "nto" kemudian "anto" dst..
Selain menampung-gabung karakter yg ditemui,
Loop Dalam juga meng-evaluasi, apakah karakter temuan itu >"Z" dan <"A",
Maksud evaluasi ini jelas, yaitu ingin tahu apakah karakter = BUKAN
Huruf Capital.
Jika BENAR (bukan huruf capital) loop meneruskan pekerjaannya
tetapi jika SALAH (temuan = huruf capital) maka loop dihentikan.
Sementara itu variable strSTRING telah berisi string yg huruf-terkiri-nya =
huruf capital,
hasil dari pengambilan data NAMA dari KANAN selama LoopDalam bekerja.
Isi variable strSTRING itu kemudian dituliskan ke cell yg sejajar dengan data
nama yg dirujuk (yg sedang dikunjungi oleh Loop Luar) di kolom 4 (relatif sheet),
truzz isi strSTRING itu sendiri dikosongkan, agar proses bagi NAMA berikutnya
tidak terkontaminasi oleh NAMA sebelumnya.
Dan Loop Luar pun bekerja lagi maju satu step.
Begitulah, dua Kalang bekerja hingga berhenti, yaitu:
* dengan sopan, jika ditemui baris kosong ATAU
* dengan "ndak sopan" karena muncul ErrorMessage
OverFlow, jika nilai variable intROW sudah di luar jangkauan pencacah (variable
type ShortInteger).
Ini sungguh akan terjadi jika misalnya baris data lebih dari 32767
Algoritma dan logika makro ini bagus, dengan catatan kecil pada hal
hal sbb:
(1) intROW akan lebih aman jika dideklarasikan sbg LongInteger agar
makro mampu menangani nama yg tertulis penuh satu worksheet excel 2003
(65536 baris)
(2) Lingkup, Jangkauan dan Umur variabel dipengaruhi oleh Tempat dan
Keyword yg digunakan untuk mendeklarasikan.
Ketiga variable :intROW, intLENGTH, strSTRING, sebetulnya tidak perlu dideklarasikan
di level modul, cukup dideklarasikan di dalam prosedur (procedure level) saja
(dengan keyword Dim. Sebab tidak ada prosedur lain yg akan menggunakannya.
Dengan di-declare pada module-level seperti pada makro di atas, ketika prosedur
selesai bekerja, ketiga variable masih "hidup", ada dan membebani
memory. Ini satu hal yg kurang lazim dlm pemrograman terutama jika dilihat
dari segi "memory management".
Dalam program yg besar hal seperti ini termsuk hal yg kritis.
Walaupun dlm program sangat sederhana spt yg sedang dibahas ini, tetapi saya
kira kita ini kan sedang berlatih dari hal-hal kecil & sederhana, agar
pada saat sampai di hal besar, hal-hal sederhana sudah "terlanjur menjadi
kebiasaan".
(3) Prosedur dibuat otomatis jalan ketika workbook dibuka, dengan menamai
prosedur sub = Auto_Open
Tujuannya cukup baik, yaitu user tidak perlu bekerja selain membuat data, pekerjaan
menebak NamaTerakhir akan sudah beres dengan sendirinya KETIKA WORKBOOK DIBUKA.
Artinya jika kita menambahkan atau mengedit data di kolom NAMA, pekerjaan "menebak
Nama Terakhir" tidak akan otomatis lagi terkerjakan, kecuali kita menjalankan
makronya atau harus menutup workbook dulu lalu membukanya kembali.
Jadi yang diinginkan otomatis ternyata tidak sepenuhnya terlaksana otomatis.
Lazimnya orang akan ingin melihat hasil pekerjaannya seketika /selesai dikerjakan.
bukan nanti setelah pekerjaan disave, workbook ditutup dan kapan-kapan kita
membuka workbook LAGI, baru pekerjaan menyajikan hasil.
Barangkali akan lebih oce lagi kalau
ditulis sebagai prosedur biasa yg dibuat "mudah jalan",
misalnya disediakan tombol ataupun Menu pemanggilnya.
Melihat jenis keperluannya, saya kira paling Oce kalau prosedurnya
ditulis sebagai Function Prosedur, bukan Sub Prosedur, apalagi Sub Prosedur
KHUSUS seperti Prosedur AutoOpen. Function Prosedur akan jalan dengan
sendirinya, ketika Nama Fungsi dituliskan di cell Sheet, sebagai formula.
Prosedur Auto_Open, setara dengan (prosedur event Workbook_Open), biasanya
dimaksudkan untuk hal yg diinginkan terjadi ketika workbook dibuka saja,
atau untuk mengotomatiskan hal-hal yg perlu dipersiapkan bagi prosedur-prosedur
lain;
Kedudukannya hampir seperti prosedur Event Form_Initialized pada makro yg menggunakan
UserForm, yaitu menjalankan hal-hal yg harus sudah siap ketika Form dimunculkan.
Begitulah kira-kira, mohon maaf jika maksud "menerangkan" ini justeru
malah menjadi "menggelapkan" (kayak pln saja yah..)
CMIIW
~ctv~ 4 okt 2008