Skip to main content

Fungsi Untuk Membuat Daftar Ukuran Kertas di Access VBA

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.
' 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 Function
Ada 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:
  1. Name=cbbUkuranKertas
  2. 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 Sub
Bila 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

Posting Terpopuler

Normalisasi, Denormalisasi, dan Anomali Database

Membuat Relasi Database

Menampilkan Data MySQL dalam Form di Access