' プリンターの設定
Dim strPrinterDeviceName As String
Dim intPaperSize As Integer
Dim intOrientation As Integer
Dim udtPrinterDefaults As PRINTER_DEFAULTS
Dim lngPrinterHandle As Long
Dim lngPrinterInfo2Level As Long
Dim lngPrinterInfo2Needed As Long
Dim bytPrinterInfo2Buffer() As Byte
Dim udtPrinterInfo2 As PRINTER_INFO_2
Dim udtDevMode As DEVMODE
Dim lngResult As Long

' プリンタ名を指定
strPrinterDeviceName = Printer.DeviceName

' 用紙サイズを指定
intPaperSize = DMPAPER_A3' A3
intPaperSize = DMPAPER_A4' A4
intPaperSize = DMPAPER_A5' A5
intPaperSize = DMPAPER_B5' B5
intPaperSize = DMPAPER_B4' B4
intPaperSize = DMPAPER_JAPANESE_POSTCARD' ハガキ

' 用紙方向を指定
intOrientation = DMORIENT_PORTRAIT' 縦
intOrientation = DMORIENT_LANDSCAPE' 横

' プリンタアクセス権を指定
With udtPrinterDefaults
.DesiredAccess = PRINTER_ALL_ACCESS
End With

' プリンタオブジェクトを取得
lngResult = OpenPrinter( strPrinterDeviceName, lngPrinterHandle, udtPrinterDefaults)

' 構造体のレベルを指定
lngPrinterInfo2Level = 2

' バッファに必要なサイズを取得
lngResult = GetPrinter( lngPrinterHandle, lngPrinterInfo2Level, ByVal vbNullString, 0, lngPrinterInfo2Needed)

' バッファを確保
ReDim bytPrinterInfo2Buffer (lngPrinterInfo2Needed - 1)

' プリンタ情報を取得
lngResult = GetPrinter( lngPrinterHandle, lngPrinterInfo2Level, bytPrinterInfo2Buffer(0), lngPrinterInfo2Needed, _
lngPrinterInfo2Needed)

' 取得したプリンタ情報を構造体へ移動
MoveMemory udtPrinterInfo2, bytPrinterInfo2Buffer(0), Len(udtPrinterInfo2)

' 取得したプリンタデバイス情報を構造体へ移動
MoveMemory udtDevMode, ByVal udtPrinterInfo2.pDevMode, Len(udtDevMode)

' プリンタデバイス情報を設定
With udtDevMode
' 用紙サイズが指定できるときは
If .dmFields And DM_PAPERSIZE Then
' 用紙を指定
.dmPaperSize = intPaperSize
' 構造体を取得したプリンタデバイス情報へ移動
MoveMemory ByVal udtPrinterInfo2.pDevMode, udtDevMode, Len(udtDevMode)
' プリンタ情報を書き戻し
lngResult = SetPrinter( lngPrinterHandle, lngPrinterInfo2Level, udtPrinterInfo2, 0)
End If
' 用紙の印刷方向が指定できるときは
If .dmFields And DM_ORIENTATION Then
' 印刷方向を指定
.dmOrientation = intOrientation
' 構造体を取得したプリンタデバイス情報へ移動
MoveMemory ByVal udtPrinterInfo2.pDevMode, udtDevMode, Len(udtDevMode)
' プリンタ情報を書き戻し
lngResult = SetPrinter( lngPrinterHandle, lngPrinterInfo2Level, udtPrinterInfo2, 0)
End If
End With ' プリンタオブジェクトをクローズ
lngResult = ClosePrinter(lngPrinterHandle)