Terima kasih Mr Kid, di atas pencerahannya. Saya belum sempat mencoba lagi, mudah2an akan bermanfaat juga buat member yang lain.
Semoga Allah memberi keberkatan di atas bantuan anda. Amin. -Mansor 2013/3/27 Mr. Kid <mr.nm...@gmail.com> > ** > > > Hai Mansor, > > Moga-moga file terlampir bisa digunakan dulu sembari menunggu proses yang > lebih simpel dari BeExceller. > > ------------------ > File terlampir juga bisa diunduh di : > https://www.box.com/s/39t9w4t4467ahr2dty54 > Untuk saat ini, file terlampir mungkin tidak bisa dicoba secara langsung > di semua komputer. Tetapi bisa diatur untuk mencoba menulis ke sebuah > textbox tertentu di suatu window tertentu (di aplikasi apa saja selama > window nya punya caption), kemudian menekan tombol tertentu juga. > File terlampir berisi 2 buah file, yaitu : > 1. re-Makro untuk mencetak dengan printer yang ada password.xlsm > >> berisi contoh penggunaan file pengirim perintah ke window lain (milik > aplikasi apa saja) > > 2. vba_with_api_sendmessage.xlsm > >> berisi runtime untuk mengirim perintah ke window tertentu (milik > aplikasi apa saja). Pada komputer yang security macro bukan Enable harus > memastikan bahwa workbook ini ketika dibuka segera di beri ijin (di-enable) > untuk memanfaatkan VBA. > > Syarat dan ketentuan berlaku. > ------------------ > > >> selayang kasus > Pada kasus ini, ada sebuah printer (LAN Printer) yang dibatasi aksesnya > (melalui tab Security si printer oleh Admin [misalnya]). > User dari departemen lain tidak bisa menggunakan printer tersebut sebelum > mengisi suatu kode tertentu. > Setiap ada proses yang ingin menggunakan printer tersebut dan komputer > user bukan dari departemen tersebut, maka akan muncul sebuah window untuk > mengisi kode tertentu tersebut. > > >> informasi dari gambar di file nomor 1 > Window yang muncul ini memiliki caption berbunyi Invalid Department Code. > Caption ini akan menjadi titik awal proses nantinya. > Pada window tersebut, terdapat banyak control, seperti control untuk icon > beserta teksnya, control TextBox untuk penulisan kode, control > CommandButton untuk konfirmasi tindakan oleh user. > Textbox tidak memiliki caption, dan untungnya hanya ada 1 textbox dalam > window. > CommandButton ada 2 bijik. Yang pokok adalah yang memiliki caption > berbunyi Continue (setidaknya ada penggalan kata Continue disana). > > >> proses mengisi password ke textbox disertai menekan tombol Continue > Langkahnya kira-kira : > 1. mendapatkan window dengan caption berbunyi Invalid Department Code > 2. loop semua control yang ada dalam window yang ditemukan di nomor 1 > 3. dapatkan caption setiap control > 4. jika bertemu control yang tidak punya caption, maka dicobalah mengirim > teks password. Kalau sukses ya sukur, kalau gagal ya dicoba cari control > lain. > 5. jika bertemu control yang punya caption ada penggalan tulisan berbunyi > Continue, maka control ini disimpan untuk ditekan nanti ketika proses loop > selesai. > 6. setelah proses loop selesai, maka cek keberadaan si control ber-caption > Continue tadi. Kalau ada, maka kirim perintah untuk menekannya. > > Seluruh object dalam windows memiliki ID yang unique. ID ini sering > disebut window handler yang divariabelkan secara umum dengan hWnd. > Proses nomor 1. > diperlukan proses pencarian window berdasar nama captionnya. Fungsi API > yang bisa digunakan salah satunya adalah FindWindow > Deklarasinya berbunyi : > Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal > lpClassName As String, ByVal lpWindowName As String) As Long > > Proses nomor 2. > diperlukan fungsi loop setiap window. Fungsi API yang bisa digunakan > adalah EnumChildWindows. > Deklarasinya berbunyi : > Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As > Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long > > Penggunaan fungsi Enum membutuhkan rujukan pointer (Address of). Untuk > ini, dibuatlah sebuah fungsi yang bisa menjadi penyimpan informasi selama > proses. > Fungsi ini sering disebut wndproc. Pada file diatas, wndproc dibuat dengan > nama fungsi LoopSetiapControl yang deklarasinya berupa : > Function LoopSetiapControl(ByVal hwnd As Long, lParam As Long) As Long > > Proses nomor 3. > diperlukan fungsi untuk mendapatkan jumlah karakter caption > (GetWindowTextLength) dan bunyi caption (GetWindowText). > Deklarasinya : > Declare Function GetWindowTextLength Lib "user32.dll" Alias > "GetWindowTextLengthA" (ByVal hwnd As Long) As Long > Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" > (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long > > Proses nomor 4. > untuk mengirim perintah menulis sesuatu berdasar suatu string menggunakan > fungsi SendMessageByString > Deklarasinya : > Declare Function SendMessageByString Lib "user32" Alias "SendMessageA" ( _ > ByVal hwnd As Long, ByVal wMsg As Long, > ByVal wParam As Long, ByVal lParam As String) As Long > > Proses nomor 6. > untuk mengirim perintah menekan suatu tombol bisa dengan fungsi SendMessage > deklarasinya : > Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _ > ByVal hwnd As Long, ByVal wMsg As Long, > ByVal wParam As Long, lParam As Any) As Long > > > >> Kenapa diletakkan pada file terpisah ? > Pada kasus ini, kebutuhan penggunaan proses nomor 1 sampai 6 adalah saat > melakukan proses print. Artinya, ketika ada kegiatan print barulah si > window Invalid bla tersebut muncul dan bisa diproses. Pada kegiatan print > (printout), proses akan terhenti sampai user melakukan sesuatu. Untuk > menghindari hal ini, maka proses nomor 1 sampai 6 diletakkan pada workbook > terpisah di instansi Excel yang terpisah pula. > > Karena proses nomor 1 sampai 6 tergantung pada ditemukannya sebuah window, > maka perlu menjalankan proses nomor 1 sampai 6 secara berkala. Untuk > kebutuhan ini, maka digunakan methods OnTime milik Excel dengan mengatur > waktu antar proses adalah setiap 1 detik. Kegiatan dengan OnTime dilakukan > sejak > > >> Bagaimana mengaktifkan proses nomor 1 sampai 6 tersebut > Pada workbook kerja, sesaat sebelum proses utama dilakukan (proses utama > kasus ini adalah printing dengan methods PrintOut) harus didahului dengan > pembentukan instansi Excel baru dan pada instansi baru itu dilakukan > pembukaan workbook yang berisi proses nomor 1 sampai 6. > Jangan lupa untuk menutup instansi baru (beserta workbook yang terbuka > disana) ketika proses utama telah selesai. > > Moga-moga gak banyak errornya ya... > > Wassalam, > Kid. > > > > 2013/3/26 Mansor <dbpermatas...@gmail.com> > >> ** >> >> >> >> >> Dear teman2 BeExcel, >> >> Bagaimana makronya , untuk mencetak dengan printer yang ada password. >> >> Setiap halaman yang dicetak harus dimasukkan passwordnya, pasti nya >> kerja jadi ribet. >> >> Kalau ada 100 halaman yang mau dicetak, kalau hanya sekali diminta >> password masih ok, tapi jangan setiap halaman. Mungkin perlu modifikasi >> kode yang ditulis oleh Mr Kid. >> >> >> >> Public Sub mencetak() >> >> Dim lPage As Long >> >> If Range("o2").Value > 0 Then >> >> Range("o3").Value = 1 >> >> For lPage = 1 To Range("o2").Value >> >> ActiveSheet.Calculate >> >> Range("a1:j69").PrintOut >> >> Range("o3").Value = lPage + 1 >> >> If MsgBox("Page : " & lPage + 1 & vbCrLf & "Print ?", >> vbYesNo + vbQuestion, "Cetak") = vbNo Then >> >> Exit For >> >> End If >> >> Next lPage >> >> End If >> >> End Sub >> >> >> Bisakah, selepas Printout.Password="6932" ???? >> >> >> File seperti dilampirkan >> >> >> >> Terima kasih. >> >> -Mansor >> >> > >