Selasa, 23 Agustus 2016

[belajar-excel] Digest Number 3945

Milis Belajar Microsoft Excel

4 Messages

Digest #3945

Messages

Mon Aug 22, 2016 6:24 am (PDT) . Posted by:

naga.galaxy

buat para ahli , saya mau bertanya dong masalah vba excel ,
kalo mau nambahin tombol maximize dan minimize di userform gimana ya
saya udah coba nyari postingan lain tapi gagal terus di
Public Sub UserForm_Activate ()
AddMinMaxButton Me.Caption , MinButton :=True, MaxButton:=True
End Sub

Mon Aug 22, 2016 9:00 pm (PDT) . Posted by:

"Abang Jakarta" budi170177

Dear all ...
Mohon bantuannya dan sharing ilmunya ...
Saya punya data dalam lampiran, dalam data ini ada:1. Kolom B : tanggal kejadian 2. kolom D : incident category 3. kolom E : list of incident 4. kolom F : tower 5. kolom G :status 6. kolom H : date closed / kejadian selesai di follow up
Disheet statistic adalah jumlah total kejadian untuk keseluruhan. Yang saya ingin minta bantuan atau petunjuk dari para master excel adalah bagaimana caranya Rumus:
1. Menghitung kategori kejadian / incident category dimasing masing tower, misalnya berapa banyak kejadian yang berkaitan dengan Security di Tower 1 ( antara kolom D dan kolom F) 
2. Menghitung kejadian yang sering terjadi atau kejadian yang paling sering terjadi di masing masing tower dari data dikolom List of incident, misalnya kejadian " Door not Lock " di tower 1 ( kolom E dan F )
3. Menghitung status yang sudah closed, open atau on going di masing masing tower ( kolom G dan F )
4. Menghitung jumlah waktu response mulai dari yang tercepat statusnya closed dan terlama statusnya closed di masing masing tower dan secara keseluruhan yang merupakan gabungan tower 1 sampai tower 3
Terimakasih
arzie

Mon Aug 22, 2016 10:54 pm (PDT) . Posted by:

"Ieka Sulis"

Dear Master Excel,


Mohon bantuannya dunk untuk memecahkan masalah ini..
Kronologi nya :
- Ada sebuah inputan berupa plan roti yang akan dibuat pada hari tsb
- Masing-masing roti memiliki bahan pembentuknya, dan dari bahan pembentuknya tadi dibuat di beberapa cetakan, misal disini : cetakan1, cetakan2, cetakan3
- Output di masing-masing cetakan ditampilkan secara berulang sebanyak jumlah yang akan dibuat



Yang saya tanyakan :
- Bagaimana untuk memunculkan output di cetakan 1,2,3 ketika plan dimasukkan (membaca master yang ada).?
- Bagaimana macro untuk Print all sheet ketika button ditekan maka sheet cetakan 1,2,3 langsung terprint


File terlampir..
Atas bantuannya saya ucapkan banyak terima kasih..

--- Mods ---
File lampiran melebihi 250KB dilepas dari email. Silakan memposting ulang file lampiran dengan ukuran file maksimum 250KB dengan cara me-reply email ini.
---------------




Mon Aug 22, 2016 11:13 pm (PDT) . Posted by:

"Mr. Kid" nmkid.family@ymail.com

Dear BeExceller,

Tampilan userform di Excel biasanya seperti ini :

Tidak bisa di-minimize, maximize, atau di-resize sesukanya user.

Padahal sebenarnya userform bisa dibuat melakukan hal tersebut, seperti ini
:


Caranya juga mudah...
Mau mencoba ?
Yuk dicoba...

Peringatan !!!
Buat yang pakai xl2010 ke atas (terutama yang pakai office 64 bit, baca
sampai selesai dulu dan jangan buru-buru di-run ya...)

Tahap persiapannya begini :
1. buka Excel berisi workbook kosong (baru) -> save as dengan nama apa saja
TAPI type-nya dipilih Macro Enabled (.xlsm atau .xlsb) [.xls juga bisa,
tapi sebaiknya mulai pakai .xlsm atau .xlsb ya]
2. ke VBE (ALT F11) -> insert userform (menu Insert -> Userform) [Inilah
userform yang akan dijadikan kelinci percobaan... perhatikan, nama userform
masing-masing... misal namanya UserForm1]
[ketika sampai sini dan di run, akan muncul userform seperti gambar
yang di atas sana... karena bukan targetnya, maka ndak usah di-run ya]
3. insert general module (menu Insert -> Module [BUKAN class module loh
ya]) [inilah wadah baris kode pengubah userform]
4. save

dah... sampai disini, alatnya sudah siap... yang pokok adalah userform yang
akan diubah-ubah dan sebuah general module wadah baris kode pengubah
userform.

Cara menyusun pengubahnya begini :
0. Alur proses
a. userform dijalankan (di-run atau di-show gitulah) -> maka Windows
akan menggambar si userform yang seperti gambar atas sana
b. saat windows sudah selesai menggambar dan mulai menginisialisasi
(menyiapkan) seluruh perangkat userform -> lakukan proses pengubahan
*** [yang proses a adalah kegiatan menampilkan userform seperti biasa]
*** [yang proses b adalah proses event milik userform yang bernama
initialize, jadi cukup atur 1 kali saja untuk dipakai selama si userform
masih dipakai, jadi TIDAK keranjingan pakai event Activate]

1. Mengenal fungsi-fungsi mililk Windows (biasa disebut Windows API
Function) yang akan digunakan (sila cari di MSDN atau bisa juga lihat di :
http://allapi.mentalis.org/apilist/apilist.php )
a. FindWindow
> fungsi untuk mencari sebuah window berdasar jenis window-nya dan
teks caption (judul) si window
> contoh kasus ini adalah di Excel dan window yang akan diproses
adalah sebuah userform
> Excel userform berjenis '*ThunderDFrame*' untuk xl2000 ke atas
(kalau tanya kenapa, silakan tanya ke pembuat ms office kok milih nama itu
untuk jenis windownya)
> judul si userform adalah isi properti bernama Caption
> hasil fungsi ini adalah nomor indeks window yang dikenal dengan
handle window yang biasanya disimpan dalam variabel bernama hwnd
> baris deklarasi untuk FindWindow adalah :
Declare Function FindWindow Lib "user32" Alias
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String)
As Long

b. GetWindowLong
> fungsi untuk mendapatkan nomor indeks elemen dari window yang
akan diproses
> window yang akan diproses adalah hasil FindWindow
> elemen yang akan diproses adalah style-nya window yang memiliki
jenis elemen bernilai -16 yang sering disimpan dalam suatu variabel
konstanta bernama GWL_STYLE
*** nama variabel konstanta nya bisa Anda ubah-ubah sendiri
(tapi nanti ngubahnya, kalau sudah mudeng)
*** detil tentang jenis-jenis elemen bisa dilihat di :
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633584(v=vs.85).aspx
*** sengaja nama variabelnya disamakan dengan yang dijelaskan di
link tersebut
> hasil fungsi ini adalah nomor indeks elemen yang akan diproses
yang dikenal dengan handle elemen window yang biasanya disimpan dalam
variabel-variabel indeks seperti nIndex dan sebagainya
> baris deklarasi untuk GetWindowLong adalah :
Declare Function GetWindowLong Lib "user32" Alias
"GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

c. SetWindowLong
> fungsi ini untuk menulis nilai properti elemen window yang baru,
jadi kalau GetWindowLong mendapatkan elemen window, SetWindowLong menulis
nilai baru ke elemen hasil GetWindowLong
> window yang akan diproses adalah hasil FindWindow
> elemen yang akan diproses adalah style-nya window yang memiliki
jenis elemen bernilai -16 yang sering disimpan dalam suatu variabel
konstanta bernama GWL_STYLE
> nilai elemen yang baru = nilai elemen yang lama (yang disimpan
oleh hasil GetWindowLong) + atau - (setara OR atau OR NOT) nilai properti
pengubah
> nilai-nilai properti untuk style window adalah seperti yang ada
di link berikut :
https://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx
*** untuk kasus ini, yang dibutuhkan adalah nilai untuk :
(pakai nama yang sama dengan link itu aja biar gampang mudeng)
a. kotak membesarkan window (baca : userform) : namanya
*WS_MAXIMIZEBOX* yang bernilai (dalam Hex) &H10000
b. kotak mengecilkan window (baca : userform) : namanya
*WS_MINIMIZEBOX* yang bernilai (dalam Hex) &H20000
c. kotak meresize window sesukanya, yang sejatinya adalah
memasang border window (userform) dengan border yang bisa ditarik kesana
kesini :
namanya *WS_SIZEBOX* atau
*WS_THICKFRAME* bernilai (dalam Hex) &H40000 [pakai yang *WS_SIZEBOX* saja
ya, biar sama-sama ada bunyi box-nya]
> karena proses menulis dan tidak perlu tahu hasilnya seperti apa
(error atau tidak saat fungsi tersebut dijalankan), maka tidak perlu
mempedulikan hasil dari fungsi ini, biarkan menguap dalam memori saja
> baris deklarasi untuk SetWindowLong adalah :
Declare Function SetWindowLong Lib "user32" Alias
"SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong
As Long) As Long

d. DrawMenuBar
> fungsi ini untuk me-redraw (menggambar ulang) menu bar si window
(userform) [jadi bukan me-refresh ya, tapi menggambar ulang (yang lama
dibuang lalu digambar lagi yang baru)]
> window yang akan diproses adalah hasil FindWindow
> karena proses gambar ulang dan tidak perlu tahu hasilnya seperti
apa (error atau tidak saat fungsi tersebut dijalankan), maka tidak perlu
mempedulikan hasil dari fungsi ini, biarkan menguap dalam memori saja
> baris deklarasi untuk DrawMenuBar adalah :
Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As
Long) As Long

2. Urutan proses pengubahan properti window (userform)
> Jadi, setelah mengenal fungsi-fungsi yang dibutuhkan, maka bisa
disusun sebuah alur proses (misal nanti diwujudkan sebagai sebuah prosedur
kerja) untuk mengubah properti window :
1. dapatkan handle window dari object yang akan diproses
(userform) dengan FindWindow
2. dapatkan handle elemen window tentang Style dari handle window
yang diproses (userform) dengan GetWindowLong
3. menyusun nilai-nilai elemen yang baru, yaitu nilai elemen yang
lama ditambah atau dikurang dengan nilai-nilai pengubah
4. menuliskan nilai elemen yang baru ke handle window yang
diproses (userform) untuk elemen Style dengan SetWindowLong
5. menggambar ulang window (userform) dengan DrawMenuBar

3. Menentukan variabel-variabel kerja
> dari alur proses nomor 2, bisa diperkirakan variabel-variabel kerja
yang dibutuhkan, seperti :
a. handle window yang diproses (userform) sebagai penyimpan hasil
FindWindow : misal diberi nama lHWND yang bertipe Long
b. handle elemen window (elemen style, karena yang diubah adalah
style window) sebagai penyimpan hasil GetWindowLong : misal diberi nama
lELEMEN yang bertipe Long
c. wadah object window yang diproses (userform), sehingga userform
yang akan diubah bisa mengirim dirinya ke proses pengubah tersebut : misal
diberi nama objWIN yang bertipe Object
*** sapa tahu nanti mo dipakai untuk object lain yang serupa
yang bukan UserForm, maka dipakailah tipe Object

4. Mendaftar variabel-variabel konstanta yang digunakan selama proses :
> dari catatan resmi di MSDN, nilai-nilai konstanta yang digunakan pada
sepanjang proses ini adalah : (nama mengikuti MSDN saja)
a. GWL_STYLE bertipe Long diisi nilai -16 sebagai jenis elemen
window
b. *WS_MAXIMIZEBOX* bertipe Long diisi nilai dalam Hex &H10000
sebagai properti kotak memperbesar window
c. *WS_MINIMIZEBOX* bertipe Long diisi nilai dalam Hex &H20000
sebagai properti kotak memperkecil window
d. *WS_SIZEBOX* bertipe Long diisi nilai dalam Hex &H40000 sebagai
properti kotak pengubah ukuran window sesukanya

5. Menulis baris-baris kode prosesnya di sebuah general module (yang dibuat
di tahap persiapan nomor 3)
> Tahap penulisannya adalah :
A. deklarasi fungsi-fungsi Windows yang akan digunakan (4 baris
deklarasi untuk 4 fungsi yang dijabarkan di nomor 1)
> karena akan menggunakan fungsi-fungsi milik Window, maka
diatur scope-nya adalah di level module saja alias private
> jadi, kalau user menulis formula di sebuah cells, nama-nama
fungsi Windows-nya tidak menjadi salah satu opsi fungsi yang bisa digunakan
oleh user di worksheet
> bunyi deklarasinya menjadi :
Private Declare blablabla
*** silakan dibuat ya... ( maunya copas aja ya...
hadeeehh... ya wis lah ... sing waras ngalah... silakan kalau mau copas )



B. deklarasi variabel-variabel konstanta yang dibutuhkan sepanjang
proses, dengan scope juga private saja (fungsinya private dan hanya dipakai
module ini saja) : lihat nomor 4, ada 4 konstanta bertipe Long
> ditulis dibaris bawahnya baris deklarasi fungsi (poin A)
> cara penulisannya :
private const nama_konstanta AS datatype = nilainya
*** silakan dibuat ya... ( masih mau copas aja ya...baiklah
)
private const GWL_STYLE as long = -16 'jenis
elemen windows style
private const* WS_MAXIMIZEBOX* as long = &H10000
'kotak maximize
private const* WS_MINIMIZEBOX* as long = &H20000
'kotak minimize
private const* WS_SIZEBOX* as long = &H40000
'kotak resize

C. deklarasi variabel kerja (2 bijik sebagai wadah handle, yaitu
handle window dan handle elemen
> ditulis dibawahnya baris deklarasi konstanta dengan scope
private juga saja
> cara penulisannya :
private nama_Variabel AS datatype
*** silakan dibuat ya... ( copas lagi ya... hmmm )
private lHWND as long 'kalau di-upper, bunyinya
LHWND (BUKAN pakai i besar, tapi pakai L kecil)
private lELEMEN as long

D. membuat *prosedur yang bisa dipanggil oleh userform yang akan
diubah-ubah*, berisi proses pengubahannya
> misal bernama UbahCaptionUserform berjenis prosedur Sub
dengan scope *Public* (bisa dipanggil dari mana saja) dan inputan berupa
object window yang akan diproses bernama objWIN yang bertipe Object
> ditulis dibawahnya baris deklarasi variabel kerja (poin C)
Public sub *UbahCaptionUserfor*( objWIN as Object )

end sub

E. menulis baris proses setiap step-nya di dalam blok prosedur
(poin D [dibaris kosong setelah Public blabla sampai sebelum End Sub])
> Step 1 : dapatkan handle window dari object yang akan
diproses (userform) dengan FindWindow
*lHWND* = FindWindow( "*ThunderDFrame*" ,
objWin.caption )

> Step 2 : dapatkan handle elemen window tentang Style dari
handle window yang diproses (userform) dengan GetWindowLong
*lELEMEN *= GetWindowLong( *lHWND* , GWL_STYLE )

> Step 3 : menyusun nilai-nilai elemen yang baru, yaitu
nilai elemen yang lama ditambah atau dikurang dengan nilai-nilai
pengubah

* lELEMEN *= * lELEMEN* + *WS_MAXIMIZEBOX *+
*WS_MINIMIZEBOX* + *WS_SIZEBOX*

> Step 4 : menuliskan nilai elemen yang baru ke handle
window yang diproses (userform) untuk elemen Style dengan SetWindowLong
SetWindowLong *lHWND* , GWL_STYLE , *lELEMEN*

> Step 5 : menggambar ulang window (userform) dengan
DrawMenuBar
DrawMenuBar *lHWND*

> dah selesai....

6. Mengatur userform untuk menggunakan prosedur hasil nomor 5.D yang
bernama *UbahCaptionUserfor* melalui event initialize milik si userform
> langkahnya sebagai berikut :
a. mengaktifkan object userform :
-> klik kanan object bernama UserForm1 (ingat, di atas sana
dimisalkan namanya UserForm1) yang ada di Project Explorer (sisi kiri
layar) -> pilih View Code
b. membuat event initialize milik userform1
-> diarea penulisan kode (lembar kosong sisi kanan project
explorer) -> combobox sisi kiri : pilih UserForm -> combobox sisi kanan :
pilih Initialize -> muncul blok prosedur event Initialize
c. isi blok proses event initialize yang baru saja terbentuk
dengan baris kode pemanggil prosedur bernama disertai object userform yang
akan diproses (misal akan memproses si userform1 [dirinya sendiri])
*UbahCaptionUserfor *UserForm1
d. save

* *** Bagi Anda yang ingin membuat proses di atas bisa dijalankan di
Office 64bit, sebaiknya terus melanjutkan ke nomor 7*

* *** Bagi Anda yang belum tahu cara menjalankan userform, silakan ke
nomor 8*
7. Membuat proses agar bisa dijalankan di office 64 bit
> baris-baris kode di atas adalah untuk VBA pada office 32 bit
> sejak xl2010, ada office 64bit, sehingga baris-baris kode yang
merujuk ke suatu pointer (seperti indeks window alias hwnd) memerlukan
datatype yang lebih sesuai
> lebih lengkapnya, silakan lhat di :
https://msdn.microsoft.com/en-us/library/ee691831(office.14).aspx
> mulai xl2010, VBA yang digunakan disebut VB7 yang bisa bekerja di
office 32bit maupun 64bit, tetapi datatype-nya disesuaikan agar support
untuk 64bit walau sedang bekerja di 32bit.
> bagi xl2007 (yang semuanya 32 bit) ke bawah, hanya bisa menggunakan
variabel untuk proses 32bit.
> sejak VB7, disediakan option bernama VB7 yang menunjukkan apakah VBA
yang digunakan adalah versi xl2010 ke atas atau bukan.
> pemanfaatan option VBA7 adalah berupa blok option berikut :
#if vba7 then
'baris-baris kode untuk xl2010 ke atas yang membutuhkan
64bit variabel dan ptrsafe function yang bisa bekerja pada proses 32bit
maupun 64bit
#else
'baris-baris kode untuk xl2007 ke bawah yang membutuhkan
32bit variabel yang hanya bisa bekerja pada proses 32bit

Tidak ada komentar:

Posting Komentar