Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Impression complexe Adobe

18 réponses
Avatar
Chevrot
Bonjour à tous,

Après l'exécution d'une série de codes sur une base Access 2003, un état
"Etat P" est produit. Je souhaite effectuer plusieurs tâches par code:

Imprimer sur une imprimante "Prn 1" la page 1 de l'"Etat P"
Exporter l'"Etat P" en fichier Adobe dans un répertoire
"U:\Développement\Etats" sous un nom composé de la Date du jour et d'un champ
"RéfDossier" appartenant à la Table "Table P" dont est issu l'"Etat P", soit
un format du genre "2007-08-25 - B2514857"

Pour information, je dispose de la version 6.0 d'Adobe Acrobat Professionnel"

j'ai essayé de consulter les sites de Raymond etc, mais le niveau de
compréhension de VBA exigé est trop élevé pour un amateur comme moi.

Merci de votre aide.

Alain

10 réponses

1 2
Avatar
Argyronet
Bonjour,

Pour générer un PDF dans un dossier donné via PDF Distiller, vous n'avez pas
le choix que d'écrire par code VBA qui plus est si vous voulez éviter
l'affichage de la fenêtre intermédiaire vous demandant le nom du fichier PDF
de sortie ce qui est apparemment votre besoin.
De plus, avec Adobe, des droits d'admin sont requis car pour créer le PDF
par défaut dans un dossier et sous un nom donné, une MAJ d'une clé de
Registre est nécessaire...

Si vous voulez simplifier, vous n'obtiendrez que des opérations manuelles
donc fastidieuses.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Bonjour à tous,

Après l'exécution d'une série de codes sur une base Access 2003, un état
"Etat P" est produit. Je souhaite effectuer plusieurs tâches par code:

Imprimer sur une imprimante "Prn 1" la page 1 de l'"Etat P"
Exporter l'"Etat P" en fichier Adobe dans un répertoire
"U:DéveloppementEtats" sous un nom composé de la Date du jour et d'un champ
"RéfDossier" appartenant à la Table "Table P" dont est issu l'"Etat P", soit
un format du genre "2007-08-25 - B2514857"

Pour information, je dispose de la version 6.0 d'Adobe Acrobat Professionnel"

j'ai essayé de consulter les sites de Raymond etc, mais le niveau de
compréhension de VBA exigé est trop élevé pour un amateur comme moi.

Merci de votre aide.

Alain


Avatar
Chevrot
Merci, je vais m'y mettre, mais comment faire?

Alain


Bonjour,

Pour générer un PDF dans un dossier donné via PDF Distiller, vous n'avez pas
le choix que d'écrire par code VBA qui plus est si vous voulez éviter
l'affichage de la fenêtre intermédiaire vous demandant le nom du fichier PDF
de sortie ce qui est apparemment votre besoin.
De plus, avec Adobe, des droits d'admin sont requis car pour créer le PDF
par défaut dans un dossier et sous un nom donné, une MAJ d'une clé de
Registre est nécessaire...

Si vous voulez simplifier, vous n'obtiendrez que des opérations manuelles
donc fastidieuses.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Bonjour à tous,

Après l'exécution d'une série de codes sur une base Access 2003, un état
"Etat P" est produit. Je souhaite effectuer plusieurs tâches par code:

Imprimer sur une imprimante "Prn 1" la page 1 de l'"Etat P"
Exporter l'"Etat P" en fichier Adobe dans un répertoire
"U:DéveloppementEtats" sous un nom composé de la Date du jour et d'un champ
"RéfDossier" appartenant à la Table "Table P" dont est issu l'"Etat P", soit
un format du genre "2007-08-25 - B2514857"

Pour information, je dispose de la version 6.0 d'Adobe Acrobat Professionnel"

j'ai essayé de consulter les sites de Raymond etc, mais le niveau de
compréhension de VBA exigé est trop élevé pour un amateur comme moi.

Merci de votre aide.

Alain




Avatar
Argyronet
Re,

J'ai écris une procédure ici :
http://access.developpez.com/sources/?page=Etat#ExportPDF

Bonne journée
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, je vais m'y mettre, mais comment faire?

Alain


Bonjour,

Pour générer un PDF dans un dossier donné via PDF Distiller, vous n'avez pas
le choix que d'écrire par code VBA qui plus est si vous voulez éviter
l'affichage de la fenêtre intermédiaire vous demandant le nom du fichier PDF
de sortie ce qui est apparemment votre besoin.
De plus, avec Adobe, des droits d'admin sont requis car pour créer le PDF
par défaut dans un dossier et sous un nom donné, une MAJ d'une clé de
Registre est nécessaire...

Si vous voulez simplifier, vous n'obtiendrez que des opérations manuelles
donc fastidieuses.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Bonjour à tous,

Après l'exécution d'une série de codes sur une base Access 2003, un état
"Etat P" est produit. Je souhaite effectuer plusieurs tâches par code:

Imprimer sur une imprimante "Prn 1" la page 1 de l'"Etat P"
Exporter l'"Etat P" en fichier Adobe dans un répertoire
"U:DéveloppementEtats" sous un nom composé de la Date du jour et d'un champ
"RéfDossier" appartenant à la Table "Table P" dont est issu l'"Etat P", soit
un format du genre "2007-08-25 - B2514857"

Pour information, je dispose de la version 6.0 d'Adobe Acrobat Professionnel"

j'ai essayé de consulter les sites de Raymond etc, mais le niveau de
compréhension de VBA exigé est trop élevé pour un amateur comme moi.

Merci de votre aide.

Alain






Avatar
Chevrot
Merci de l'information.

J'ai copié-collé l'ensemble de la procédure dans un module appelé "Module 1"
sauf les deux remarques de fin "RootHKeyCurrentUser ..." et "RRKREGSZ..."
Ces dernières sont elles purement explicatives? Sinon que dois je en faire?

Quels sont les autres modification que je dois effectuer pour personnaliser?
Par exemple, j'ai modifié le chemin et le nom du fichier .PDF dans "Mode
d'Utilisation". Y a t-il d'autres éléments à personnaliser?

Enfin comment lancer la procédure à partir d'un bouton d'exécution d'une
macro situé sur un formulaire.

Merci de vos réponses à ces questions qui traduisenet bien mon niveau de
compréhension de VBA!!!

Alain


Re,

J'ai écris une procédure ici :
http://access.developpez.com/sources/?page=Etat#ExportPDF

Bonne journée
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, je vais m'y mettre, mais comment faire?

Alain


Bonjour,

Pour générer un PDF dans un dossier donné via PDF Distiller, vous n'avez pas
le choix que d'écrire par code VBA qui plus est si vous voulez éviter
l'affichage de la fenêtre intermédiaire vous demandant le nom du fichier PDF
de sortie ce qui est apparemment votre besoin.
De plus, avec Adobe, des droits d'admin sont requis car pour créer le PDF
par défaut dans un dossier et sous un nom donné, une MAJ d'une clé de
Registre est nécessaire...

Si vous voulez simplifier, vous n'obtiendrez que des opérations manuelles
donc fastidieuses.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Bonjour à tous,

Après l'exécution d'une série de codes sur une base Access 2003, un état
"Etat P" est produit. Je souhaite effectuer plusieurs tâches par code:

Imprimer sur une imprimante "Prn 1" la page 1 de l'"Etat P"
Exporter l'"Etat P" en fichier Adobe dans un répertoire
"U:DéveloppementEtats" sous un nom composé de la Date du jour et d'un champ
"RéfDossier" appartenant à la Table "Table P" dont est issu l'"Etat P", soit
un format du genre "2007-08-25 - B2514857"

Pour information, je dispose de la version 6.0 d'Adobe Acrobat Professionnel"

j'ai essayé de consulter les sites de Raymond etc, mais le niveau de
compréhension de VBA exigé est trop élevé pour un amateur comme moi.

Merci de votre aide.

Alain








Avatar
Argyronet
La procédure qui régie le fonctionnement est "subCreatePDFFromReport" :

Private Sub ImprimerPDF()
subCreatePDFFromReport "Etat PDF", "C:PoubellePDFFactureClient.pdf"
End Sub

Donc votre bouton peut l'appeler directement :
Private Sub btnCreerPDF()
subCreatePDFFromReport "Nom de votre état", "C:Chemin de votre
PDFVotreFichier.pdf"
End Sub

ATTENTION ! Cette procédure "subCreatePDFFromReport" soit être Public (et
non Private comme dans l'exemple) et logée dans le même module que les 3
autres... (fnctGetDefaultPrinter, subGetDriverAndPort, SetDefaultPrinter)
avec les déclarations API et variables.

Le bloc relatif à la base de Registre doit être dans un module seul.
Vous y copiez l'intégralité du bloc situé sous la mention "Informations
supplémentaires:" sauf les données explicatives comme vous le mentionnez.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci de l'information.

J'ai copié-collé l'ensemble de la procédure dans un module appelé "Module 1"
sauf les deux remarques de fin "RootHKeyCurrentUser ..." et "RRKREGSZ..."
Ces dernières sont elles purement explicatives? Sinon que dois je en faire?

Quels sont les autres modification que je dois effectuer pour personnaliser?
Par exemple, j'ai modifié le chemin et le nom du fichier .PDF dans "Mode
d'Utilisation". Y a t-il d'autres éléments à personnaliser?

Enfin comment lancer la procédure à partir d'un bouton d'exécution d'une
macro situé sur un formulaire.

Merci de vos réponses à ces questions qui traduisenet bien mon niveau de
compréhension de VBA!!!

Alain


Re,

J'ai écris une procédure ici :
http://access.developpez.com/sources/?page=Etat#ExportPDF

Bonne journée
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, je vais m'y mettre, mais comment faire?

Alain


Bonjour,

Pour générer un PDF dans un dossier donné via PDF Distiller, vous n'avez pas
le choix que d'écrire par code VBA qui plus est si vous voulez éviter
l'affichage de la fenêtre intermédiaire vous demandant le nom du fichier PDF
de sortie ce qui est apparemment votre besoin.
De plus, avec Adobe, des droits d'admin sont requis car pour créer le PDF
par défaut dans un dossier et sous un nom donné, une MAJ d'une clé de
Registre est nécessaire...

Si vous voulez simplifier, vous n'obtiendrez que des opérations manuelles
donc fastidieuses.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Bonjour à tous,

Après l'exécution d'une série de codes sur une base Access 2003, un état
"Etat P" est produit. Je souhaite effectuer plusieurs tâches par code:

Imprimer sur une imprimante "Prn 1" la page 1 de l'"Etat P"
Exporter l'"Etat P" en fichier Adobe dans un répertoire
"U:DéveloppementEtats" sous un nom composé de la Date du jour et d'un champ
"RéfDossier" appartenant à la Table "Table P" dont est issu l'"Etat P", soit
un format du genre "2007-08-25 - B2514857"

Pour information, je dispose de la version 6.0 d'Adobe Acrobat Professionnel"

j'ai essayé de consulter les sites de Raymond etc, mais le niveau de
compréhension de VBA exigé est trop élevé pour un amateur comme moi.

Merci de votre aide.

Alain










Avatar
Chevrot
Merci, j'ai essayé de faire comme suit:

Un premier module appelé "Impression sous Adobe" contient le lignes suivantes:

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 BtnCreerPDF()
SubCreatePDFFromReport "Etat", "U:DéveloppementOutputClient.pdf"
End Sub
Private Sub ImprimerPDF()
SubCreatePDFFromReport "Etat", "U:DéveloppementOutputClient.pdf"End Sub
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

Public Sub SubCreatePDFFromReport(ByVal ReportName As String, _
ByVal PDFFileName As String)
originalPrinter = fnctGetDefaultPrinter()
SetDefaultPrinter "Acrobat PDFWriter"
subRegistrySetKeyValue rootHKeyCurrentUser, _
"SoftwareAdobeAcrobat PDFWriter", "PDFFileName", _
PDFFileName, RRKREGSZ

DoCmd.OpenReport ReportName, 0
SetDefaultPrinter originalPrinter
End Sub

Un second module appelé: Modification Base de registre contient les ligens
suivanets:

Option Compare Database

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

Le problème est que lorsque, sur mon formulaire, ll faut affecter une macro
(et pas un code) à un bouton (Sur Clic: xxxx) et lorsque je crée une macro
pour exécuter le code "SubImprimerPDF(), le dit code n'apparait pas dans la
liste de choix des codes de "Impression sous Adobe".

Quelle erreur ais-je pu commettre?

Merci de votre aide.

Alain



La procédure qui régie le fonctionnement est "subCreatePDFFromReport" :

Private Sub ImprimerPDF()
subCreatePDFFromReport "Etat PDF", "C:PoubellePDFFactureClient.pdf"
End Sub

Donc votre bouton peut l'appeler directement :
Private Sub btnCreerPDF()
subCreatePDFFromReport "Nom de votre état", "C:Chemin de votre
PDFVotreFichier.pdf"
End Sub

ATTENTION ! Cette procédure "subCreatePDFFromReport" soit être Public (et
non Private comme dans l'exemple) et logée dans le même module que les 3
autres... (fnctGetDefaultPrinter, subGetDriverAndPort, SetDefaultPrinter)
avec les déclarations API et variables.

Le bloc relatif à la base de Registre doit être dans un module seul.
Vous y copiez l'intégralité du bloc situé sous la mention "Informations
supplémentaires:" sauf les données explicatives comme vous le mentionnez.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci de l'information.

J'ai copié-collé l'ensemble de la procédure dans un module appelé "Module 1"
sauf les deux remarques de fin "RootHKeyCurrentUser ..." et "RRKREGSZ..."
Ces dernières sont elles purement explicatives? Sinon que dois je en faire?

Quels sont les autres modification que je dois effectuer pour personnaliser?
Par exemple, j'ai modifié le chemin et le nom du fichier .PDF dans "Mode
d'Utilisation". Y a t-il d'autres éléments à personnaliser?

Enfin comment lancer la procédure à partir d'un bouton d'exécution d'une
macro situé sur un formulaire.

Merci de vos réponses à ces questions qui traduisenet bien mon niveau de
compréhension de VBA!!!

Alain


Re,

J'ai écris une procédure ici :
http://access.developpez.com/sources/?page=Etat#ExportPDF

Bonne journée
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, je vais m'y mettre, mais comment faire?

Alain


Bonjour,

Pour générer un PDF dans un dossier donné via PDF Distiller, vous n'avez pas
le choix que d'écrire par code VBA qui plus est si vous voulez éviter
l'affichage de la fenêtre intermédiaire vous demandant le nom du fichier PDF
de sortie ce qui est apparemment votre besoin.
De plus, avec Adobe, des droits d'admin sont requis car pour créer le PDF
par défaut dans un dossier et sous un nom donné, une MAJ d'une clé de
Registre est nécessaire...

Si vous voulez simplifier, vous n'obtiendrez que des opérations manuelles
donc fastidieuses.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Bonjour à tous,

Après l'exécution d'une série de codes sur une base Access 2003, un état
"Etat P" est produit. Je souhaite effectuer plusieurs tâches par code:

Imprimer sur une imprimante "Prn 1" la page 1 de l'"Etat P"
Exporter l'"Etat P" en fichier Adobe dans un répertoire
"U:DéveloppementEtats" sous un nom composé de la Date du jour et d'un champ
"RéfDossier" appartenant à la Table "Table P" dont est issu l'"Etat P", soit
un format du genre "2007-08-25 - B2514857"

Pour information, je dispose de la version 6.0 d'Adobe Acrobat Professionnel"

j'ai essayé de consulter les sites de Raymond etc, mais le niveau de
compréhension de VBA exigé est trop élevé pour un amateur comme moi.

Merci de votre aide.

Alain












Avatar
Argyronet
Quelle erreur ais-je pu commettre ?
Au regard de ce que vous m'avez fourni, la procédure SubImprimerPDF()
n'existe pas dans votre code. Il vous faut la rédiger avec les paramètres
requis.
De plus, vous n'êtes pas obligé d'affecter le bouton à une macro mais à un
événement.

Par ailleurs, ne nommez pas vos modules avec des espaces.
Nommez les "basAdobePDF" et "basRegistre"

Je vous recommande la lecture de ce tuto :
http://argyronet.developpez.com/office/vba/convention/
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, j'ai essayé de faire comme suit:
.................

Le problème est que lorsque, sur mon formulaire, ll faut affecter une macro
(et pas un code) à un bouton (Sur Clic: xxxx) et lorsque je crée une macro
pour exécuter le code "SubImprimerPDF(), le dit code n'apparait pas dans la
liste de choix des codes de "Impression sous Adobe".

Quelle erreur ais-je pu commettre?

Merci de votre aide.

Alain



La procédure qui régie le fonctionnement est "subCreatePDFFromReport" :

Private Sub ImprimerPDF()
subCreatePDFFromReport "Etat PDF", "C:PoubellePDFFactureClient.pdf"
End Sub

Donc votre bouton peut l'appeler directement :
Private Sub btnCreerPDF()
subCreatePDFFromReport "Nom de votre état", "C:Chemin de votre
PDFVotreFichier.pdf"
End Sub

ATTENTION ! Cette procédure "subCreatePDFFromReport" soit être Public (et
non Private comme dans l'exemple) et logée dans le même module que les 3
autres... (fnctGetDefaultPrinter, subGetDriverAndPort, SetDefaultPrinter)
avec les déclarations API et variables.

Le bloc relatif à la base de Registre doit être dans un module seul.
Vous y copiez l'intégralité du bloc situé sous la mention "Informations
supplémentaires:" sauf les données explicatives comme vous le mentionnez.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci de l'information.

J'ai copié-collé l'ensemble de la procédure dans un module appelé "Module 1"
sauf les deux remarques de fin "RootHKeyCurrentUser ..." et "RRKREGSZ..."
Ces dernières sont elles purement explicatives? Sinon que dois je en faire?

Quels sont les autres modification que je dois effectuer pour personnaliser?
Par exemple, j'ai modifié le chemin et le nom du fichier .PDF dans "Mode
d'Utilisation". Y a t-il d'autres éléments à personnaliser?

Enfin comment lancer la procédure à partir d'un bouton d'exécution d'une
macro situé sur un formulaire.

Merci de vos réponses à ces questions qui traduisenet bien mon niveau de
compréhension de VBA!!!

Alain


Re,

J'ai écris une procédure ici :
http://access.developpez.com/sources/?page=Etat#ExportPDF

Bonne journée
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, je vais m'y mettre, mais comment faire?

Alain











Avatar
Chevrot
Merci de votre réponse. Malheureusement j’ai encore besoin de vos lumières et
vous remercie par avance de vos conseils:

En effet, lorsque je click sur le bouton du formulaire « Fiche Intermédiaire
» (sur lequel se situe le bouton dont le nom dans la feuille de propriété est
« btncreerPDF »), l’état « Etat » est imprimé par l’imprimante papier au lieu
de s’imprimer sur un document PDF appelé OutputClient.pdf.

1. Dans le module « Form_Fiche Intermédiaire » sur lequel se situe le
bouton qui doit déclencher l’impression d’ « Etat » dans le document PDF «
OutputClient.pdf » et dont le nom dans la feuille de propriété est «
btncreerPDF » je dispose de la procédure suivante

Private Sub btncreerPDF_click()

subCreatePDFFromReport "Etat", "U:DéveloppementOutputClient.pdf"

End Sub


2. J’ai réinstallé Adobe Acrobat 6.0 Professional avec toutes les fonctions
exécutables depuis le disque dur. En fait dans le menu d’installation d’Adobe
4.0, il y a bien une référence à PDFWriter. Mais l’installation d’Adobe
Acrobat Professional (Mise à jour) demande de supprimer Adobe 4.0 et
réinstalle Adobe 6.0 afin de ne pas laisser coexister deux versions. . Dans
le menu d’installation je n’ai trouvé aucune référence à PDFWriter. Dans le
menu de choix de l’imprimante d’Access, l’imprimante est désignée sous le nom
d’ « Adobe PDF ».

3.. J’ai vérifié les lignes cochées dans le menu Microsoft Visual Basic –
Outils – Références :
• Visual Basic for Applications
• Microsoft Access 11.0 Objects library
• OLE automation
• Microsoft DAO 3.6 Objects library
• Microsoft Actiive X Data Objects 2.5 Library
• Microsoft Forms 2.0 Objects Library
• Microsoft Word 11.0 Objects library
• Acrobat Distiller
• Acrobat PDFMakerX
• Acrobat Access 2.0 Type Library
• Adobe Acrobat 6.0 Type Library

Dois-je sélectionner des lignes supplémentaires ?

4. Je joins par ailleurs les deux modules que vous avez développés tels
qu’ils sont actuellement dans ma base :

BasAdobePDF

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

Public Sub subCreatePDFFromReport(ByVal ReportName As String, _
ByVal PDFFileName As String)

originalPrinter = fnctGetDefaultPrinter()
SetDefaultPrinter "Acrobat PDFWriter"
subRegistrySetKeyValue rootHKeyCurrentUser, _
"SoftwareAdobeAcrobat PDFWriter", "PDFFileName", _
PDFFileName, RRKREGSZ

DoCmd.OpenReport ReportName, 0
SetDefaultPrinter originalPrinter

End Sub

Private Sub ImprimerPDF()

subCreatePDFFromReport "", "U:DéveloppementOutputClient.pdf"

End Sub

BasRegistre

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





Quelle erreur ais-je pu commettre ?
Au regard de ce que vous m'avez fourni, la procédure SubImprimerPDF()
n'existe pas dans votre code. Il vous faut la rédiger avec les paramètres
requis.
De plus, vous n'êtes pas obligé d'affecter le bouton à une macro mais à un
événement.

Par ailleurs, ne nommez pas vos modules avec des espaces.
Nommez les "basAdobePDF" et "basRegistre"

Je vous recommande la lecture de ce tuto :
http://argyronet.developpez.com/office/vba/convention/
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, j'ai essayé de faire comme suit:
.................

Le problème est que lorsque, sur mon formulaire, ll faut affecter une macro
(et pas un code) à un bouton (Sur Clic: xxxx) et lorsque je crée une macro
pour exécuter le code "SubImprimerPDF(), le dit code n'apparait pas dans la
liste de choix des codes de "Impression sous Adobe".

Quelle erreur ais-je pu commettre?

Merci de votre aide.

Alain



La procédure qui régie le fonctionnement est "subCreatePDFFromReport" :

Private Sub ImprimerPDF()
subCreatePDFFromReport "Etat PDF", "C:PoubellePDFFactureClient.pdf"
End Sub

Donc votre bouton peut l'appeler directement :
Private Sub btnCreerPDF()
subCreatePDFFromReport "Nom de votre état", "C:Chemin de votre
PDFVotreFichier.pdf"
End Sub

ATTENTION ! Cette procédure "subCreatePDFFromReport" soit être Public (et
non Private comme dans l'exemple) et logée dans le même module que les 3
autres... (fnctGetDefaultPrinter, subGetDriverAndPort, SetDefaultPrinter)
avec les déclarations API et variables.

Le bloc relatif à la base de Registre doit être dans un module seul.
Vous y copiez l'intégralité du bloc situé sous la mention "Informations
supplémentaires:" sauf les données explicatives comme vous le mentionnez.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci de l'information.

J'ai copié-collé l'ensemble de la procédure dans un module appelé "Module 1"
sauf les deux remarques de fin "RootHKeyCurrentUser ..." et "RRKREGSZ..."
Ces dernières sont elles purement explicatives? Sinon que dois je en faire?

Quels sont les autres modification que je dois effectuer pour personnaliser?
Par exemple, j'ai modifié le chemin et le nom du fichier .PDF dans "Mode
d'Utilisation". Y a t-il d'autres éléments à personnaliser?

Enfin comment lancer la procédure à partir d'un bouton d'exécution d'une
macro situé sur un formulaire.

Merci de vos réponses à ces questions qui traduisenet bien mon niveau de
compréhension de VBA!!!

Alain


Re,

J'ai écris une procédure ici :
http://access.developpez.com/sources/?page=Etat#ExportPDF

Bonne journée
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, je vais m'y mettre, mais comment faire?

Alain













Avatar
Fabien
Merci de votre réponse. Malheureusement j’ai encore besoin de vos lumières et
vous remercie par avance de vos conseils:

En effet, lorsque je click sur le bouton du formulaire « Fiche Intermédiaire
» (sur lequel se situe le bouton dont le nom dans la feuille de propriété est
« btncreerPDF »), l’état « Etat » est imprimé par l’imprimante papier au lieu
de s’imprimer sur un document PDF appelé OutputClient.pdf.

1. Dans le module « Form_Fiche Intermédiaire » sur lequel se situe le
bouton qui doit déclencher l’impression d’ « Etat » dans le document PDF «
OutputClient.pdf » et dont le nom dans la feuille de propriété est «
btncreerPDF » je dispose de la procédure suivante

Private Sub btncreerPDF_click()

subCreatePDFFromReport "Etat", "U:DéveloppementOutputClient.pdf"

End Sub


2. J’ai réinstallé Adobe Acrobat 6.0 Professional avec toutes les fonctions
exécutables depuis le disque dur. En fait dans le menu d’installation d’Adobe
4.0, il y a bien une référence à PDFWriter. Mais l’installation d’Adobe
Acrobat Professional (Mise à jour) demande de supprimer Adobe 4.0 et
réinstalle Adobe 6.0 afin de ne pas laisser coexister deux versions. . Dans
le menu d’installation je n’ai trouvé aucune référence à PDFWriter. Dans le
menu de choix de l’imprimante d’Access, l’imprimante est désignée sous le nom
d’ « Adobe PDF ».

3.. J’ai vérifié les lignes cochées dans le menu Microsoft Visual Basic –
Outils – Références :
• Visual Basic for Applications
• Microsoft Access 11.0 Objects library
• OLE automation
• Microsoft DAO 3.6 Objects library
• Microsoft Actiive X Data Objects 2.5 Library
• Microsoft Forms 2.0 Objects Library
• Microsoft Word 11.0 Objects library
• Acrobat Distiller
• Acrobat PDFMakerX
• Acrobat Access 2.0 Type Library
• Adobe Acrobat 6.0 Type Library

Dois-je sélectionner des lignes supplémentaires ?

4. Je joins par ailleurs les deux modules que vous avez développés tels
qu’ils sont actuellement dans ma base :

BasAdobePDF

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

Public Sub subCreatePDFFromReport(ByVal ReportName As String, _
ByVal PDFFileName As String)

originalPrinter = fnctGetDefaultPrinter()
SetDefaultPrinter "Acrobat PDFWriter"
subRegistrySetKeyValue rootHKeyCurrentUser, _
"SoftwareAdobeAcrobat PDFWriter", "PDFFileName", _
PDFFileName, RRKREGSZ

DoCmd.OpenReport ReportName, 0
SetDefaultPrinter originalPrinter

End Sub

Private Sub ImprimerPDF()

subCreatePDFFromReport "", "U:DéveloppementOutputClient.pdf"

End Sub

BasRegistre

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





Quelle erreur ais-je pu commettre ?
Au regard de ce que vous m'avez fourni, la procédure SubImprimerPDF()
n'existe pas dans votre code. Il vous faut la rédiger avec les paramètres
requis.
De plus, vous n'êtes pas obligé d'affecter le bouton à une macro mais à un
événement.

Par ailleurs, ne nommez pas vos modules avec des espaces.
Nommez les "basAdobePDF" et "basRegistre"

Je vous recommande la lecture de ce tuto :
http://argyronet.developpez.com/office/vba/convention/
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, j'ai essayé de faire comme suit:
.................

Le problème est que lorsque, sur mon formulaire, ll faut affecter une macro
(et pas un code) à un bouton (Sur Clic: xxxx) et lorsque je crée une macro
pour exécuter le code "SubImprimerPDF(), le dit code n'apparait pas dans la
liste de choix des codes de "Impression sous Adobe".

Quelle erreur ais-je pu commettre?

Merci de votre aide.

Alain



La procédure qui régie le fonctionnement est "subCreatePDFFromReport" :

Private Sub ImprimerPDF()
subCreatePDFFromReport "Etat PDF", "C:PoubellePDFFactureClient.pdf"
End Sub

Donc votre bouton peut l'appeler directement :
Private Sub btnCreerPDF()
subCreatePDFFromReport "Nom de votre état", "C:Chemin de votre
PDFVotreFichier.pdf"
End Sub

ATTENTION ! Cette procédure "subCreatePDFFromReport" soit être Public (et
non Private comme dans l'exemple) et logée dans le même module que les 3
autres... (fnctGetDefaultPrinter, subGetDriverAndPort, SetDefaultPrinter)
avec les déclarations API et variables.

Le bloc relatif à la base de Registre doit être dans un module seul.
Vous y copiez l'intégralité du bloc situé sous la mention "Informations
supplémentaires:" sauf les données explicatives comme vous le mentionnez.
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci de l'information.

J'ai copié-collé l'ensemble de la procédure dans un module appelé "Module 1"
sauf les deux remarques de fin "RootHKeyCurrentUser ..." et "RRKREGSZ..."
Ces dernières sont elles purement explicatives? Sinon que dois je en faire?

Quels sont les autres modification que je dois effectuer pour personnaliser?
Par exemple, j'ai modifié le chemin et le nom du fichier .PDF dans "Mode
d'Utilisation". Y a t-il d'autres éléments à personnaliser?

Enfin comment lancer la procédure à partir d'un bouton d'exécution d'une
macro situé sur un formulaire.

Merci de vos réponses à ces questions qui traduisenet bien mon niveau de
compréhension de VBA!!!

Alain


Re,

J'ai écris une procédure ici :
http://access.developpez.com/sources/?page=Etat#ExportPDF

Bonne journée
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )



Merci, je vais m'y mettre, mais comment faire?

Alain

Bonjour Alain et Argy







Si je puis me permettre d'intervenir, ci joint un lien vers un module
qui permet d'obtenir du PDF sans outils acrobat
http://www.lebans.com/reporttopdf.htm
C'est une autre solution ;-)
Fabien







Avatar
Chevrot
Merci Fabien de votre réponse; en fait je la testerai après la réposne
d'Argy, si celui ci souhaite répondre à ma question, car je voudrai éviter de
me disperser.

Alain


Merci de votre réponse. Malheureusement j’ai encore besoin de vos lumières et
vous remercie par avance de vos conseils:

En effet, lorsque je click sur le bouton du formulaire « Fiche Intermédiaire
» (sur lequel se situe le bouton dont le nom dans la feuille de propriété est
« btncreerPDF »), l’état « Etat » est imprimé par l’imprimante papier au lieu
de s’imprimer sur un document PDF appelé OutputClient.pdf.

1. Dans le module « Form_Fiche Intermédiaire » sur lequel se situe le
bouton qui doit déclencher l’impression d’ « Etat » dans le document PDF «
OutputClient.pdf » et dont le nom dans la feuille de propriété est «
btncreerPDF » je dispose de la procédure suivante

Private Sub btncreerPDF_click()

subCreatePDFFromReport "Etat", "U:DéveloppementOutputClient.pdf"

End Sub


2. J’ai réinstallé Adobe Acrobat 6.0 Professional avec toutes les fonctions
exécutables depuis le disque dur. En fait dans le menu d’installation d’Adobe
4.0, il y a bien une référence à PDFWriter. Mais l’installation d’Adobe
Acrobat Professional (Mise à jour) demande de supprimer Adobe 4.0 et
réinstalle Adobe 6.0 afin de ne pas laisser coexister deux versions. . Dans
le menu d’installation je n’ai trouvé aucune référence à PDFWriter. Dans le
menu de choix de l’imprimante d’Access, l’imprimante est désignée sous le nom
d’ « Adobe PDF ».

3.. J’ai vérifié les lignes cochées dans le menu Microsoft Visual Basic –
Outils – Références :
• Visual Basic for Applications
• Microsoft Access 11.0 Objects library
• OLE automation
• Microsoft DAO 3.6 Objects library
• Microsoft Actiive X Data Objects 2.5 Library
• Microsoft Forms 2.0 Objects Library
• Microsoft Word 11.0 Objects library
• Acrobat Distiller
• Acrobat PDFMakerX
• Acrobat Access 2.0 Type Library
• Adobe Acrobat 6.0 Type Library

Dois-je sélectionner des lignes supplémentaires ?

4. Je joins par ailleurs les deux modules que vous avez développés tels
qu’ils sont actuellement dans ma base :

BasAdobePDF

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

Public Sub subCreatePDFFromReport(ByVal ReportName As String, _
ByVal PDFFileName As String)

originalPrinter = fnctGetDefaultPrinter()
SetDefaultPrinter "Acrobat PDFWriter"
subRegistrySetKeyValue rootHKeyCurrentUser, _
"SoftwareAdobeAcrobat PDFWriter", "PDFFileName", _
PDFFileName, RRKREGSZ

DoCmd.OpenReport ReportName, 0
SetDefaultPrinter originalPrinter

End Sub

Private Sub ImprimerPDF()

subCreatePDFFromReport "", "U:DéveloppementOutputClient.pdf"

End Sub

BasRegistre

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





Quelle erreur ais-je pu commettre ?
Au regard de ce que vous m'avez fourni, la procédure SubImprimerPDF()
n'existe pas dans votre code. Il vous faut la rédiger avec les paramètres
requis.
De plus, vous n'êtes pas obligé d'affecter le bouton à une macro mais à un
événement.

Par ailleurs, ne nommez pas vos modules avec des espaces.
Nommez les "basAdobePDF" et "basRegistre"

Je vous recommande la lecture de ce tuto :
http://argyronet.developpez.com/office/vba/convention/
--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN-2742982442 )






1 2