Hai Roni, Kenapa yang di-print adalah userform ? Bukankah bisa disusun dengan worksheet agar lebih luwes. Jadi, hasil pengolahan dengan userform dibuatkan sebuah worksheet untuk print berisi layout seperti userform. Karena kalau print userform dalam orientasi kertas landscape, maka si userform di print screen (pakai ALT supaya hanya userform yang ter-capture) lalu di hasil print screen di paste ke sebuah worksheet kosong yang baru, kemudian worksheet berisi picture shape tadi diatur page setupnya, dan bila perlu diatur ukuran shape-nya barulah di sheet tersebut di printout, diakhir dengan delete sheet tersebut.
Urutan proses dalam prosedur juga mengikuti alur di atas. Untuk BeExceller semua, proses penekanan tombol keyboard lebih luwes dilakukan dengan windows api keybd_event, terutama ketika membutuhkan tombol PrtScr yang tidak bisa diatur dengan mudah menggunakan Application.SendKeys Contohnya begini : 'deklarasi variabel kerja Dim shtTmp As Worksheet, shtApp As Worksheet, shpFrm As Shape Dim dblScT As Double, dblScL As Double 'init semua bahan Application.DisplayAlerts = False Set shtApp = ActiveSheet Set shtTmp = ThisWorkbook.Sheets.Add 'tambah sheet baru dblScT = Me.ScrollTop dblScL = Me.ScrollLeft 'atur tampilan yang akan di ALT+PRTSCR Me.ScrollTop = 0 Me.ScrollLeft = 0 Application.CutCopyMode = False 'clear clipboard dari range yang ter-copy sebelumnya 'proses ALT+PRTSCR (tersimpan di clipboard) keybd_event 164, 0, 1, 0 'pencet ALT (klik tombol) jangan dilepaskan keybd_event 44, 0, 1, 0 'pencet PRTSCR (klik tombol) jangan dilepaskan keybd_event 44, 0, 3, 0 'lepas PRTSCR yang tadi dipencet (2 : extended + 1 : klik tombol) keybd_event 164, 0, 3, 0 'lepas ALT yang tadi dipencet (2 : extended + 1 : klik tombol) DoEvents 'lakukan seluruh events dalam antrian, dan tangkap event yang baru Application.Wait Now + TimeValue("00:00:01") 'beri waktu 1 detik agar perintah keyboard di proses, atur waktunya 'paste hasil ALT+PRTSCR ke worksheet dan print shtTmp.Paste 'paste isi clipboard ke worksheet (biasanya ke activecell di sheet tersebut, tapi kasus ini tidak peduli lokasinya) Set shpFrm = shtTmp.Shapes(1) 'simpan shapes ke-1 yang ada di sheet tersebut ke variabel shape '--> atur pagesetup worksheet disini <--' 'mulai dari ubah kertas, margin, orientasi, dan sebagainya (lihat dialog page setup) 'lalu attur ukuran shape agar mengikuti perbandingan kertas 'akhiri dengan printout/printpreview sheet '---------------------------------------' 'kembalikan area kerja ke keadaan semula Me.ScrollTop = dblScT Me.ScrollLeft = dblScL shtTmp.Delete shtApp.Activate Application.DisplayAlerts = False Silakan diatur Regards, Kid On Wed, Dec 6, 2017 at 4:38 PM, y.ron...@yahoo.com [belajar-excel] < belajar-excel@yahoogroups.com> wrote: > > > Dear Rekan-Rekan, > > > Mohon Bantuannya, saya mau print untuk userform dengan kertas landscape. > saya pake office 2010 (64 bit). Saya peke code ini tidak bisa, mohon di > koreksi. > > Option Explicit > > > > Private Declare PtrSafe Sub keybd_event Lib "user32" ( _ > > ByVal bVk As Byte, ByVal bScan As > Byte, _ > > ByVal dwFlags As Long, ByVal > dwExtraInfo As Long) > > > > Private Const VK_SNAPSHOT As Long = &H2C '44 > > Private Const VK_LMENU As Long = &HA4 '164 > > Private Const KEYEVENTF_KEYUP As Long = 2 > > Private Const KEYEVENTF_EXTENDEDKEY As Long = 1 > > > Private Sub CommandButton1_Click() > > > End Sub > > Dim sngScrollTop As Single > > Dim sngScrollHt As Single > > Dim sngLt As Single > > Dim sngTp As Single > > Dim sngHt As Single > > With Me > > sngScrollTop = .ScrollTop > > sngScrollHt = .ScrollHeight > > sngLt = .Left > > sngTp = .Top > > sngHt = .Height > > .Left = 0 > > .Top = 0 > > .Height = .ScrollHeight > > .ScrollTop = 0 > > DoEvents > > keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0& > > keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0& > > keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or > KEYEVENTF_KEYUP, 0& > > keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or > KEYEVENTF_KEYUP, 0 > > DoEvents > > Selection.Paste > > sngScrollTop = .ScrollTop > > sngScrollHt = .ScrollHeight > > .Height = sngHt > > .ScrollHeight = ScrollHeight > > .ScrollTop = sngScrollTop > > .Left = sngLt > > .Top = sngTp > > End With > > > >