Di Access, untuk menampilkan ukuran kertas kita harus memilih sebuah report terlebih dulu dan membukanya. Setelah report terbuka, kita memilih ukuran kertas yang diinginkan dengan mengklik Page Setup dan masuk ke tab Page.
Pada tab Page, kita bisa memilih ukuran kertas yang diinginkan, seperti terlihat pada gambar di atas. Walau Access sudah menyediakan daftar jenis kertas, kita bisa bisa saja membuat daftar jenis kertas yang dilengkapi dengan ukuran. Dengan demikian, kita dapat memilih kertas secara lebih akurat, sesuai dengan kebutuhan.
Untuk menampilkan daftar jenis kertas yang dilengkapi dengan ukuran, kita bisa membuat fungsi di Access VBA. Berbeda dengan fungsi untuk membuat daftar printer yang terlihat sederhana, fungsi untuk membuat daftar ukuran kertas jauh lebih kompleks. Berikut ini adalah fungsinya, yang diberi nama membuatDaftarUkuranKertas. Tambahkanlah fungsi di bawah ini dalam modul standar yang bernama mdlPrinter, karena kita akan membutuhkannya nanti.
Fungsi ini diambil dari https://msdn.microsoft.com/en-us/vba/access-vba/articles/programmatically-retrieve-printer-capabilities dan diolah kembali.
Setelah nomor urut printer diketahui, fungsi membuatDaftarUkuranKertas dijalankan. Fungsi membuatDaftarUkuranKertas mempunyai tiga variabel, yaitu form yang aktif, control berupa combo box, dan nomor urut printer. Dengan demikian, untuk menjalankan fungsi membuatDaftarUkuranKertas, kita harus menyediakan, terutama, form dan control. Tanpa kedua variabel ini, fungsi tidak bisa dijalankan. Kita dapat menggunakan form yang ada di posting Fungsi Untuk Membuat Daftar Printer di Access VBA.
Sisipkan di bawah control combo box yang bernama cbbPrinter, sebuah combo box yang lain dengan properti sebagai berikut:
Selanjutnya, kode VBA yang ada di modul form Form1 dihapus dan diganti dengan kode VBA berikut ini:
Pada gambar di atas, printer yang digunakan bernama Send To OneNote 2013. Ukuran kertas yang ditampilkan jumlahnya terbatas. Beda dengan nama jenis printer di bawah ini.
Pada gambar di atas, kita menggunakan nama jenis printer EPSON L360 Series. Terlihat bahwa ukuran kertas untuk printer ini sangat bervariasi.
Dengan tampilan seperti gambar di atas, pengguna jadi lebih mudah memilih kertas yang diinginkan karena ada 3 kolom yang bisa menjelaskan ukuran kertas. Yang pertama kolom ukuran berisi penjelasan ukuran kertas. Yang kedua, lebar yang diukur dalam satuan cm. Yang ketiga, panjang yang juga diukur dalam satuan cm.
Pada tab Page, kita bisa memilih ukuran kertas yang diinginkan, seperti terlihat pada gambar di atas. Walau Access sudah menyediakan daftar jenis kertas, kita bisa bisa saja membuat daftar jenis kertas yang dilengkapi dengan ukuran. Dengan demikian, kita dapat memilih kertas secara lebih akurat, sesuai dengan kebutuhan.
Untuk menampilkan daftar jenis kertas yang dilengkapi dengan ukuran, kita bisa membuat fungsi di Access VBA. Berbeda dengan fungsi untuk membuat daftar printer yang terlihat sederhana, fungsi untuk membuat daftar ukuran kertas jauh lebih kompleks. Berikut ini adalah fungsinya, yang diberi nama membuatDaftarUkuranKertas. Tambahkanlah fungsi di bawah ini dalam modul standar yang bernama mdlPrinter, karena kita akan membutuhkannya nanti.
Fungsi ini diambil dari https://msdn.microsoft.com/en-us/vba/access-vba/articles/programmatically-retrieve-printer-capabilities dan diolah kembali.
' Declaration for the DeviceCapabilities function API call. Private Declare PtrSafe Function DeviceCapabilities Lib "winspool.drv" _ Alias "DeviceCapabilitiesA" (ByVal lpsDeviceName As String, _ ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, _ ByVal lpDevMode As Long) As Long ' DeviceCapabilities function constants. Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_BINNAMES = 12 Private Const DC_PAPERSIZE = 3 Private Const DC_BINS = 6 Private Const DEFAULT_VALUES = 0 'define custom type for POINTAPI Private Type POINTAPI X As Long Y As Long End Type Function menghitungUrutanPrinter(strNamaPrinter As String) As Integer Dim Cnt As Integer For Cnt = 0 To Application.Printers.Count - 1 If InStr(1, Application.Printers(Cnt).DeviceName, strNamaPrinter) > 0 Then menghitungUrutanPrinter = Cnt End If Next Cnt End Function Public Function membuatDaftarUkuranKertas(frmName As Form, cbbPaperSize As Access.ComboBox, Printer As Integer) Dim lngPaperCount As Long Dim lngCounter As Long Dim hPrinter As Long Dim strDeviceName As String Dim strDevicePort As String Dim strPaperNamesList As String Dim strPaperName As String Dim i, intLength As Integer Dim strMsg As String Dim aintNumPaper() As Integer Dim intPaperSizeNumber As Integer Dim strPaperSize() As String Dim Pnt() As POINTAPI On Error GoTo Err_Msg ' Get the name and port of the selected printer. strDeviceName = Application.Printers(Printer).DeviceName strDevicePort = Application.Printers(Printer).Port ' Get the count of paper names supported by the printer. lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_PAPERNAMES, _ lpOutput:=ByVal vbNullString, _ lpDevMode:=DEFAULT_VALUES) If lngPaperCount = 0 Then cbbPaperSize.RowSource = vbNullString Exit Function End If ' Re-dimension the array to the count of paper names. ReDim aintNumPaper(1 To lngPaperCount) ReDim Pnt(1 To lngPaperCount) ' Pad the variable to accept 64 bytes for each paper name. strPaperNamesList = String(64 * lngPaperCount, 0) ' Get the string buffer of all paper names supported by the printer. lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_PAPERNAMES, _ lpOutput:=ByVal strPaperNamesList, _ lpDevMode:=DEFAULT_VALUES) ' Get the array of all paper numbers supported by the printer. lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_PAPERS, _ lpOutput:=aintNumPaper(1), _ lpDevMode:=DEFAULT_VALUES) 'get point list of paper sizes for each paper lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, iIndex:=DC_PAPERSIZE, lpOutput:=Pnt(1), lpDevMode:=0) ' List the available paper names. ReDim Preserve strPaperSize(lngPaperCount - 1) With frmName With cbbPaperSize .RowSource = "" .RowSourceType = "Value List" .SeparatorCharacters = acSeparatorCharactersSemiColon .ColumnCount = 4 .ColumnHeads = True .AddItem Item:="Nomor;Ukuran;Lebar (cm);Panjang (cm)" .BoundColumn = 2 .ListWidth = 4 * 1440 .ColumnWidths = "0 In;2 In;1 In;1 In" i = 0 For lngCounter = 1 To lngPaperCount ' Parse a paper name from the string buffer. strPaperName = Mid(String:=strPaperNamesList, Start:=64 * (lngCounter - 1) + 1, Length:=64) intLength = VBA.InStr(Start:=1, String1:=strPaperName, String2:=Chr(0)) - 1 strPaperName = Left(String:=strPaperName, Length:=intLength) intPaperSizeNumber = aintNumPaper(lngCounter) .AddItem Item:=intPaperSizeNumber & "; " & strPaperName & "; " & Pnt(lngCounter).X / 100 & "; " & Pnt(lngCounter).Y / 100 i = i + 1 Next lngCounter End With End With Exit_Function: Exit Function Err_Msg: MsgBox Prompt:=Err.Description, Buttons:=vbCritical & vbOKOnly, _ Title:="Error Number " & Err.Number & " Occurred" Resume Exit_Function End FunctionAda dua fungsi yang digunakan untuk membuat daftar ukuran kertas. Yang pertama adalah fungsi menghitungUrutanPrinter yang digunakan untuk menentukan nomor urut printer yang ada di daftar printer. Untuk diketahui, setiap jenis printer mempunyai ukuran kertas yang belum tentu sama satu dengan lainnya. Misalnya, printer dengan ukuran kecil tentu hanya bisa digunakan untuk kertas yang ukurannya kecil. Sebaliknya, printer dengan ukuran besar, selain kertas ukuran besar bisa juga menggunakan kertas ukuran kecil. Jadi, sebelum menampilkan ukuran kertas, kita harus menentukan terlebih dulu nama jenis printer yang digunakan. Dari nama jenis printer ini, kita kemudian menentukan nomor urut printer.
Setelah nomor urut printer diketahui, fungsi membuatDaftarUkuranKertas dijalankan. Fungsi membuatDaftarUkuranKertas mempunyai tiga variabel, yaitu form yang aktif, control berupa combo box, dan nomor urut printer. Dengan demikian, untuk menjalankan fungsi membuatDaftarUkuranKertas, kita harus menyediakan, terutama, form dan control. Tanpa kedua variabel ini, fungsi tidak bisa dijalankan. Kita dapat menggunakan form yang ada di posting Fungsi Untuk Membuat Daftar Printer di Access VBA.
Sisipkan di bawah control combo box yang bernama cbbPrinter, sebuah combo box yang lain dengan properti sebagai berikut:
- Name=cbbUkuranKertas
- Row Source Type=Value List
Selanjutnya, kode VBA yang ada di modul form Form1 dihapus dan diganti dengan kode VBA berikut ini:
Option Compare Database Private Sub cbbPrinter_Change() membuatDaftarUkuranKertas Forms(Me.Name), Controls(Me.cbbUkuranKertas.Name), menghitungUrutanPrinter(Me.cbbPrinter) End Sub Private Sub Form_Open(Cancel As Integer) Me.cbbPrinter.SeparatorCharacters = 2 Me.cbbPrinter.RowSource = Join(membuatDaftarPrinter, ";") Me.cbbPrinter = Application.Printer.DeviceName membuatDaftarUkuranKertas Forms(Me.Name), Controls(Me.cbbUkuranKertas.Name), menghitungUrutanPrinter(Me.cbbPrinter) End SubBila Form1 dibuka dengan cara Form View, hasilnya seperti ini:
Pada gambar di atas, printer yang digunakan bernama Send To OneNote 2013. Ukuran kertas yang ditampilkan jumlahnya terbatas. Beda dengan nama jenis printer di bawah ini.
Pada gambar di atas, kita menggunakan nama jenis printer EPSON L360 Series. Terlihat bahwa ukuran kertas untuk printer ini sangat bervariasi.
Dengan tampilan seperti gambar di atas, pengguna jadi lebih mudah memilih kertas yang diinginkan karena ada 3 kolom yang bisa menjelaskan ukuran kertas. Yang pertama kolom ukuran berisi penjelasan ukuran kertas. Yang kedua, lebar yang diukur dalam satuan cm. Yang ketiga, panjang yang juga diukur dalam satuan cm.
Comments
Post a Comment