| Versions : 97 et supérieures 
 Valable aussi pour: Word ou Excel en adaptant le code (DoCmd.OpenReport...) , l'élément essentiel étant l'entrée dans le registre.  
 Intérêt: Eviter d'avoir la boîte de dialogue de confirmation du nom du fichier PDF à créer, ce qui est primordial.  
 Obtention et définition temporaire dynamique des paramètres d'impression:
 
 Option Compare Database 
Option Explicit 
Private originalPrinter As String 
Public Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" _
  (ByVal lpAppName$, ByVal lpKeyName$, ByVal lpDefault$, _
  ByVal lpReturnedString$, ByVal nSize&) As Long 
Public Declare Function WriteProfileString Lib "kernel32" Alias _
 "WriteProfileStringA" (ByVal lpszSection$, ByVal lpszKeyName$, _
   ByVal lpszString$) As Long 
Public Function fnctGetDefaultPrinter() As String 
Dim nSize As Integer 
Dim strPrinterName As String 
Dim successReturn& 
Dim iPos1 As Integer, iPos2 As Integer 
    nSize = 81 
    strPrinterName = Space(nSize) 
        successReturn = GetProfileString("windows", "device", _
                  vbNullString, strPrinterName, nSize) 
        strPrinterName = Left(strPrinterName, successReturn) 
        iPos1 = InStr(1, strPrinterName, ",") 
        iPos2 = InStr(iPos1 + 1, strPrinterName, ",") 
    strPrinterName = Left(strPrinterName, iPos1 - 1) 
    fnctGetDefaultPrinter = strPrinterName 
End Function 
Private Sub subGetDriverAndPort(ByVal Buffer As String, _
  ByRef DriverName As String, ByRef PrinterPort As String) 
Dim posDriver As Integer 
Dim posPort As Integer 
    
  DriverName = vbNullString 
  PrinterPort = vbNullString 
  posDriver = InStr(Buffer, ",") 
  If posDriver > 0 Then 
    DriverName = Left(Buffer, posDriver - 1) 
    posPort = InStr(posDriver + 1, Buffer, ",") 
    If posPort > 0 Then 
        PrinterPort = Mid(Buffer, posDriver + 1, posPort - posDriver - 1) 
    End If 
  End If 
End Sub 
Private Sub SetDefaultPrinter(ByVal PrinterName As String) 
Dim Buffer As String 
Dim DeviceName As String 
Dim DriverName As String 
Dim PrinterPort As String 
Dim DeviceLine As String 
  Buffer = Space(1024) 
  Call GetProfileString("PrinterPorts", PrinterName, vbNullString, _
      Buffer, Len(Buffer)) 
  subGetDriverAndPort Buffer, DriverName, PrinterPort 
  If DriverName <> vbNullString And PrinterPort <> vbNullString Then 
    DeviceLine = PrinterName & "," & DriverName & "," & PrinterPort 
    Call WriteProfileString("windows", "Device", DeviceLine) 
  End If 
End Sub
 Création du PDF:  
 Private Sub subCreatePDFFromReport(ByVal ReportName As String, _
  ByVal PDFFileName As String) 
  originalPrinter = fnctGetDefaultPrinter() 
  SetDefaultPrinter "Acrobat PDFWriter" 
  subRegistrySetKeyValue rootHKeyCurrentUser, _
   "Software\Adobe\Acrobat PDFWriter\", "PDFFileName", _
     PDFFileName, RRKREGSZ 
  DoCmd.OpenReport ReportName, 0 
  SetDefaultPrinter originalPrinter 
End Sub
 Mode d'utilisation:  
 Private Sub ImprimerPDF() 
  subCreatePDFFromReport "Etat PDF", "C:\Poubelle\PDF\FactureClient.pdf" 
End Sub
 
Informations supplémentaires: 
 
 subRegistrySetKeyValue est une procédure pour écrire une valeur dans la Registre  
 Private Declare Function RegCloseKey Lib "advapi32.dll" _
(ByVal lngHKey As Long) As Long 
Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias _
"RegCreateKeyExA" (ByVal lngHKey As Long, ByVal lpSubKey As String, _
ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, _
ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, _
phkResult As Long, lpdwDisposition As Long) As Long 
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
"RegOpenKeyExA" (ByVal lngHKey As Long, ByVal lpSubKey As String, _
ByVal ulOptions As Long, ByVal samDesired As Long, _
phkResult As Long) As Long 
Private Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
"RegQueryValueExA" (ByVal lngHKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, _
lpcbData As Long) As Long 
Private Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
"RegQueryValueExA" (ByVal lngHKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, lpData As Long, _
lpcbData As Long) As Long 
Private Declare Function RegQueryValueExBinary Lib "advapi32.dll" Alias _
"RegQueryValueExA" (ByVal lngHKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, _
lpcbData As Long) As Long 
Private Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
"RegQueryValueExA" (ByVal lngHKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, _
lpcbData As Long) As Long 
Private Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
"RegSetValueExA" (ByVal lngHKey As Long, ByVal lpValueName As String, _
ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, _
ByVal cbData As Long) As Long 
Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
"RegSetValueExA" (ByVal lngHKey As Long, ByVal lpValueName As String, _
ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
ByVal cbData As Long) As Long 
Private Declare Function RegSetValueExBinary Lib "advapi32.dll" Alias _
"RegSetValueExA" (ByVal lngHKey As Long, ByVal lpValueName As String, _
ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As Long, _
ByVal cbData As Long) As Long 
Private Declare Function RegEnumKey Lib "advapi32.dll" Alias _
"RegEnumKeyA" (ByVal lngHKey As Long, ByVal dwIndex As Long, _
ByVal lpName As String, ByVal cbName As Long) As Long 
Private Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias _
"RegQueryInfoKeyA" (ByVal lngHKey As Long, ByVal lpClass As String, _
ByVal lpcbClass As Long, ByVal lpReserved As Long, lpcSubKeys As Long, _
lpcbMaxSubKeyLen As Long, ByVal lpcbMaxClassLen As Long, lpcValues As Long, _
lpcbMaxValueNameLen As Long, ByVal lpcbMaxValueLen As Long, _
ByVal lpcbSecurityDescriptor As Long, lpftLastWriteTime As FILETIME) As Long 
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias _
"RegEnumValueA" (ByVal lngHKey As Long, ByVal dwIndex As Long, _
ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, _
ByVal lpType As Long, ByVal lpData As Byte, ByVal lpcbData As Long) As Long 
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias _
"RegDeleteKeyA" (ByVal lngHKey As Long, ByVal lpSubKey As String) As Long 
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias _
"RegDeleteValueA" (ByVal lngHKey As Long, _
ByVal lpValueName As String) As Long 
Private Const MCREGKEYALLACCESS = &H3F 
Private Const MCREGKEYQUERYVALUE = &H1 
Private Const mcregOptionNonVolatile = 0
Private Type FILETIME 
  dwLowDateTime As Long 
  dwHighDateTime As Long 
End Type 
Public Enum EnumRegistryRootKeys 
  rootHKeyClassesRoot = &H80000000 
  rootHKeyCurrentUser = &H80000001 
  rootHKeyLocalMachine = &H80000002 
  rootHKeyUsers = &H80000003 
End Enum 
Public Enum EnumRegistryValueType 
  RRKREGSZ = 1 
  RRKREGBINARY = 3 
  RRKREGDWORD = 4 
End Enum 
Public Sub subRegistrySetKeyValue(ByVal RootKey As EnumRegistryRootKeys, _
ByVal KeyName As String, ByVal ValueName As String, ByVal varData As Variant, _
ByVal DataType As EnumRegistryValueType) 
  Dim lReturn As Long 
  Dim lHKey As Long 
  Dim sData As String 
  Dim lData As Long 
  Dim aData() As Byte 
    
  On Error GoTo L_ErrRegistryOperation 
  lReturn = RegCreateKeyEx(RootKey, KeyName, 0&, vbNullString, _
       mcregOptionNonVolatile, MCREGKEYALLACCESS, 0&, lHKey, 0&) 
  Select Case DataType 
  Case RRKREGSZ 
    sData = varData & vbNullChar 
    lReturn = RegSetValueExString(lHKey, ValueName, 0&, DataType, _
        sData, Len(sData)) 
  Case RRKREGDWORD 
    lData = varData 
    lReturn = RegSetValueExLong(lHKey, ValueName, 0&, DataType, _
    lData, Len(lData)) 
  Case RRKREGBINARY 
    aData = varData 
    lReturn = RegSetValueExBinary(lHKey, ValueName, 0&, DataType, _
     VarPtr(aData(0)), UBound(aData) + 1) 
  End Select 
  RegCloseKey (lHKey) 
    
L_ExRegistryOperation: 
  Erase aData 
  Exit Sub 
L_ErrRegistryOperation: 
  MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
   "subRegistrySetKeyValue" 
  Resume L_ExRegistryOperation 
End Sub
 rootHKeyCurrentUser correspond à HKEY_CURRENT_USER  
   rootHKeyClassesRoot = &H80000000 
  rootHKeyCurrentUser = &H80000001 
  rootHKeyLocalMachine = &H80000002 
  rootHKeyUsers = &H80000003
 RRKREGSZ correspond à un type de valeur REG String  
   RRKREGSZ = 1 
  RRKREGBINARY = 3 
  RRKREGDWORD = 4
 |