Tente isso abaixo...
Crie um modulo....e copie esse código, lembrando...que é uma tentativa e não uma solução !!!
Salve ele, como sendo...cortapapel ...Faça a chamada dessa rotina no botão de impressão, tipo....call cortapapel
- Código:
Private Function SetPrinterProperty(ByVal iPropertyType As Long, ByVal iPropertyValue As Long) As Boolean
Dim hPrinter As Long
Dim pd As PRINTER_DEFAULTS
Dim pinfo As PRINTER_INFO_2
Dim dm As DEVMODE
Dim sPrinterName As String
Dim yDevModeData() As Byte
Dim yPInfoMemory() As Byte
Dim iBytesNeeded As Long
Dim iRet As Long
Dim iJunk As Long
Dim iCount As Long
On Error GoTo cleanup
' Obter o nome da impressora atual
sPrinterName = Trim$(Left$(ActivePrinter, InStr(ActivePrinter, " on ")))
' Abrir a impressora
pd.DesiredAccess = PRINTER_NORMAL_ACCESS
iRet = OpenPrinter(sPrinterName, hPrinter, pd)
If (iRet = 0) Or (hPrinter = 0) Then
' Não é possível acessar a impressora atual. Sair sem fazer nada
Exit Function
End If
' Obter o tamanho da estrutura DEVMODE para ser carregada
iRet = DocumentProperties(0, hPrinter, sPrinterName, 0, 0, 0)
If (iRet < 0) Then
' Não é possível acessar as propriedades da impressora. Ir para a limpeza
GoTo cleanup
End If
' Garantir que o array de bytes seja grande o suficiente
ReDim yDevModeData(0 To iRet + 100) As Byte
' Carregar o array de bytes
iRet = DocumentProperties(0, hPrinter, sPrinterName, VarPtr(yDevModeData(0)), 0, DM_OUT_BUFFER)
If (iRet < 0) Then
GoTo cleanup
End If
' Copiar o array de bytes para uma estrutura para que possa ser manipulada
Call CopyMemory(dm, yDevModeData(0), Len(dm))
If dm.dmFields And iPropertyType = 0 Then
' A propriedade desejada não está disponível. Sair para a limpeza
GoTo cleanup
End If
' Definir a propriedade para o valor apropriado
Select Case iPropertyType
Case DM_ORIENTATION
dm.dmOrientation = iPropertyValue
Case DM_PAPERSIZE
dm.dmPaperSize = iPropertyValue
Case DM_PAPERLENGTH
dm.dmPaperLength = iPropertyValue
Case DM_PAPERWIDTH
dm.dmPaperWidth = iPropertyValue
Case DM_DEFAULTSOURCE
dm.dmDefaultSource = iPropertyValue
Case DM_PRINTQUALITY
dm.dmPrintQuality = iPropertyValue
Case DM_COLOR
dm.dmColor = iPropertyValue
Case DM_DUPLEX
dm.dmDuplex = iPropertyValue
End Select
' Carregar a estrutura de volta no array de bytes
Call CopyMemory(yDevModeData(0), dm, Len(dm))
' Informar a impressora sobre a nova propriedade
iRet = DocumentProperties(0, hPrinter, sPrinterName, VarPtr(yDevModeData(0)), 0, DM_OUT_BUFFER)
If (iRet < 0) Then
GoTo cleanup
End If
SetPrinterProperty = True
cleanup:
' Fechar a impressora
ClosePrinter hPrinter
End Function
Este código VBA define várias propriedades da impressora, como orientação, tamanho do papel, qualidade de impressão, etc... Você pode adaptar este código para atender às suas necessidades específicas.