IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Auteur : Argyronet
Version : 28/01/2005
Page de l'auteur
Exporter un état en PDF
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

Auteur : Tofalu
Version : 28/01/2005
Page de l'auteur
Imprimer les données d'un formulaire dans un état
Versions : 97 et supérieures

Tout d'abord, il faut que l'état possède les mêmes champs que le formulaire.
Ensuite, il risque d'y avoir plusieurs cas.
Dans les exemples, je vais prendre le cas d'un formulaire nommé monformulaire qui possède un bouton nommé BTimprimer et d'un état nommé MonEtat.

1. Le cas le plus simple :
L'utilisateur clique sur BTimprimer, l'état s'ouvre et le formulaire reste ouvert.

Etape 1 : Sur le bouton imprimer,il faut écrire le code qui va ouvrir l'état en mode aperçu. Ce code peut être réalisé à l'aide de l'assistant de création de bouton.

Private Sub BTImprimer_Click() Dim Nom_Etat as string Nom_Etat="MonEtat" DoCmd.OpenReport Nom_Etat, acPreview End Sub
Etape2 : Sur l'évenement Open de l'état on écrira le code :

Private Sub Report_Open(Cancel as integer) Me.RecordSource=Forms.Item("MonFormulaire").recordsource End Sub
Comment ça marche : Le bouton du formulaire ouvre l'état ce qui a pour effet de déclencher l'évenement Open de l'état qui affecte à la propriété RecordSource de MonEtat, la valeur de celle de MonFormulaire.

2. Un cas plus complexe :
MonEtat peut être ouvert depuis plusieurs formulaires. Dans ce cas, on va avoir besoin d'une variable publique que l'on va placer dans un module. Même si effectivement, l'utilisation de variables publiques est à proscrire en général, cela reste le moyen le plus simple de parvenir à nos fins.

Etape 1 : Donc dans un module on déclare une variable publique

Public Source_MonEtat as string
Etape 2 : Sur le bouton BTimprimer du (ou des) formulaire(s) on aura le code suivant :

Private Sub BTImprimer_Click() Dim Nom_Etat as string Nom_Etat="MonEtat" Source_MonEtat=Me.recordsource DoCmd.OpenReport Nom_Etat, acPreview End Sub
Etape3 : Sur l'évenement Open de l'état on écrira le code :

Private Sub Report_Open(Cancel as integer) Me.RecordSource=Source_MonEtat End Sub
Comment ça marche : Le bouton du formulaire affecte à la variable publique la valeur de la propriété RecordSource du formulaire puis ouvre l'état ce qui a pour effet de déclencher l'évenement Open de MonEtat qui affecte à la propriété RecordSource de MonEtat, la valeur de la variable publique.

3. Dans le même genre :

MonEtat doit imprimer les données d'un autre formulaire ouvert autre que celui où se trouve BTimprimer. On prendra le cas où l'état doit imprimer le contenu du formulaire MonAutreFormulaire. Dans ce cas aussi, on va avoir besoin d'une variable publique que l'on va placer dans un module.

Etape 1 : Donc dans un module on déclare une variable publique

Public Nom_Formulaire as string
Etape 2 : Sur le bouton BTimprimer du formulaire Monformulaire on aura le code suivant :

Private Sub BTImprimer_Click() Dim Nom_Etat as string Nom_Etat="MonEtat" Nom_Formulaire="MonAutreFormulaire" DoCmd.OpenReport Nom_Etat, acPreview End Sub
Etape3 : Sur l'évenement Open de l'état on écrira le code :

Private Sub Report_Open(Cancel as integer) Me.RecordSource=Forms.item(Nom_formulaire).recordsource End Sub
Comment ça marche : Le bouton BtImprimer renseigne dans la variable publique le nom du formulaire à interroger, puis ouvre l'état ce qui a pour effet de déclencher l'évenement Open de MonEtat qui interroge alors le bon formulaire pour remplir sa source d'enregistrement avec celle du formulaire concerné.

4. En passant par le mode création de l'état

Dans ce cas, l'état va d'abord être ouvert en mode création puis le code va remplir la propriété RecordSource de l'état et enfin afficher l'état en mode prévisualisation.

Etape 1 : Sur le bouton BTimprimer du formulaire on aura le code suivant :

Private Sub BTImprimer_Click() Dim Nom_Etat as string Nom_Etat="MonEtat" DoCmd.OpenReport Nom_Etat, acViewDesign, , , acHidden Reports.item(Nom_etat).Recordsource=me.recordsource Docmd.Close acReport,Nom_Etat,acYes DoCmd.OpenReport Nom_Etat, acPreview End Sub
Notez que le paramètre acHidden permet d'ouvrir l'état en mode caché afin de réaliser les modifications. Ce paramètre n'est disponible que sur les versions 2000 et supérieures. Pour la version 97, vous devez enlever ce paramètre.



Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004-2005 Maxence Hubiche Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.