impression pdf via excel

  • Initiateur de la discussion etpisculrien
  • Date de début
E

etpisculrien

Guest
Bjr a tous

je crains de connaitre déja la reponse mais je vais tout de meme poser la question: Est il possible de faire une macro sur un tableau excel, qui me permettrait d'ouvrir un fichier .pdf et de l'imprimer?
Bien qu'excel soit un formidable outil, je crains de lui demander un peu trop mais qui sait?

Merci d'avance
 

Jam

XLDnaute Accro
Salut etpisculrien,

Ce que tu demandes est faisable et c'est facile avec le recours aux API :) _Thierry viendra peut-être me contredire :)

Voici le code à mettre dans un module:
Code:
Private Declare Function ShellExecute Lib 'shell32.dll' Alias 'ShellExecuteA' (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Sub PrintThisFile()
    On Error Resume Next
    Dim X As Long
    X = ShellExecute(0, 'Print', 'c:\\temp\\test.pdf', '', '', 1)
End Sub

Remplace ou passe à la Sub le chemin+nom de fichier.
Petite précision utile: si tes users n'ont pas Adobe Reader (ou un autre lecteur de fichier PDF, ben ça ne marchera pas).

Bonne journée
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour,

Non non, je ne viens pas te contredire, mais je viens juste de tester,
et j'ai le regret de t'annoncer que strictement rien ne se passe,
ni bug, ni rien quand je fais tourner ton code MrXL.

Option Explicit

Private Declare Function ShellExecute Lib 'shell32.dll' Alias 'ShellExecuteA' _
(ByVal hwnd
As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub PrintThisFile()
On Error Resume Next
Dim X As Long
X = ShellExecute(0, 'Print', 'C:\\My Test\\MrXL.pdf', '', '', 1)
End Sub

J'ai bien un répertoire 'My Test' sous C...
Mais aucun fichier n'est généré.
La Feuille active contient bien quelque chose à imprimer,
mais Aucun MrXL.pdf n'est généré
(Win XP Pro, Office XP Pro, Adobe Acrobat 5.0 Version Complète)

Est-ce grave Docteur ?

Bonne Journée
@+Thierry

Message édité par: _Thierry, à: 17/03/2005 11:54
 

Jam

XLDnaute Accro
Salut _Thierry,

Bizarre, bizarre...
Bon je t'accorde juste que la première fois (mais les paramètres de ShellExecute étaient légèrement différents) rien ne s'étaient passsés non plus.
La seconde et les suivante on parfaitement fonctionnée.

Par contre ma config qui diffère très légèrement de la tienne WinXPPro SP2+OffXPProSP3+Adobe Acrobat 6.0 version standard) a parfaitement marché. Je l'ai même testé avec Acrobat déjà lancé pour voir s'il n'y avait pas de problème avec le programme déjà lancé.

Bref, va falloir enquêter :)
 

Jam

XLDnaute Accro
Salut _Thierry, @Christophe@, etpisculien,

1. Y'a possibilité de tester l'erreur éventuelle renvoyée par ShellExecute (cf ci-dessous...mais c'est en anglais):

Did it work?
If ShellExecute() succeeds, it returns an integer greater than 32. The integer is in fact the handle of the main window of the application which has been launched. This could be useful if you want to use other API functions to manipulate the window in some way.

A returned value of 32 or lower indicates an error. The commonest error values are 2 (invalid path or filename) and 31 (invalid action, or no application associated with the specified file). You might also come across a value of 8 (insufficient memory) and 11 (invalid EXE file).

2. A vérifier:
Dans l'explorateur de fichier, aller dans menu Outils>Option des dossiers. Sélectionner l'onglet Types de Fichiers. Trouver le PDF et le sélectionner. Cliquer ensuite sur Avancé. Vous devriez avoir la liste des actions qui s'affiche (pour ma part: Imprimer, Ouvrir dans Acrobat 6.0, Printto). Si print ou Imprimer n'y est pas vous pouvez y rajouter l'action.

@+
 

Jam

XLDnaute Accro
Re Salut à tous,

Ci après un code plus complet comprenant la gestion des erreurs:
(source http://www.vbaccelerator.com/codelib/shell/shellex.htm)

Code:
Private Declare Function ShellExecute Lib 'shell32.dll' Alias 'ShellExecuteA' _
  (ByVal hWnd As Long, ByVal lpOperation As String, _
  ByVal lpFile As String, ByVal lpParameters As String, _
  ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Declare Function ShellExecuteForExplore Lib 'shell32.dll' Alias 'ShellExecuteA' _
  (ByVal hWnd As Long, ByVal lpOperation As String, _   ByVal lpFile As String, lpParameters As Any, _
  lpDirectory As Any, ByVal nShowCmd As Long) As Long

Public Enum EShellShowConstants
    essSW_HIDE = 0
    essSW_MAXIMIZE = 3
    essSW_MINIMIZE = 6
    essSW_SHOWMAXIMIZED = 3
    essSW_SHOWMINIMIZED = 2
    essSW_SHOWNORMAL = 1
    essSW_SHOWNOACTIVATE = 4
    essSW_SHOWNA = 8
    essSW_SHOWMINNOACTIVE = 7
    essSW_SHOWDEFAULT = 10
    essSW_RESTORE = 9
    essSW_SHOW = 5
End Enum

Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_PATH_NOT_FOUND = 3&
Private Const ERROR_BAD_FORMAT = 11&
Private Const SE_ERR_ACCESSDENIED = 5        ' access denied
Private Const SE_ERR_ASSOCINCOMPLETE = 27
Private Const SE_ERR_DDEBUSY = 30
Private Const SE_ERR_DDEFAIL = 29
Private Const SE_ERR_DDETIMEOUT = 28
Private Const SE_ERR_DLLNOTFOUND = 32
Private Const SE_ERR_FNF = 2                ' file not found
Private Const SE_ERR_NOASSOC = 31
Private Const SE_ERR_PNF = 3                ' path not found
Private Const SE_ERR_OOM = 8                ' out of memory
Private Const SE_ERR_SHARE = 26


Public Function ShellEx( _
        ByVal sFIle As String, _
        Optional ByVal eShowCmd As EShellShowConstants = essSW_SHOWDEFAULT, _
        Optional ByVal sParameters As String = '', _
        Optional ByVal sDefaultDir As String = '', _
        Optional sOperation As String = 'open', _
        Optional Owner As Long = 0 _
    ) As Boolean
Dim lR As Long
Dim lErr As Long, sErr As Long
    If (InStr(UCase$(sFIle), '.EXE') <> 0) Then
        eShowCmd = 0
    End If
    On Error Resume Next
    If (sParameters = '') And (sDefaultDir = '') Then
        lR = ShellExecuteForExplore(Owner, sOperation, sFIle, 0, 0, essSW_SHOWNORMAL)
    Else
        lR = ShellExecute(Owner, sOperation, sFIle, sParameters, sDefaultDir, eShowCmd)
    End If
    If (lR < 0) Or (lR > 32) Then
        ShellEx = True
    Else
        ' raise an appropriate error:
        lErr = vbObjectError + 1048 + lR
        Select Case lR
        Case 0
            lErr = 7: sErr = 'Out of memory'
        Case ERROR_FILE_NOT_FOUND
            lErr = 53: sErr = 'File not found'
        Case ERROR_PATH_NOT_FOUND
            lErr = 76: sErr = 'Path not found'
        Case ERROR_BAD_FORMAT
            sErr = 'The executable file is invalid or corrupt'
        Case SE_ERR_ACCESSDENIED
            lErr = 75: sErr = 'Path/file access error'
        Case SE_ERR_ASSOCINCOMPLETE
            sErr = 'This file type does not have a valid file association.'
        Case SE_ERR_DDEBUSY
            lErr = 285: sErr = 'The file could not be opened because the target application is busy. Please try again in a moment.'
        Case SE_ERR_DDEFAIL
            lErr = 285: sErr = 'The file could not be opened because the DDE transaction failed. Please try again in a moment.'
        Case SE_ERR_DDETIMEOUT
            lErr = 286: sErr = 'The file could not be opened due to time out. Please try again in a moment.'
        Case SE_ERR_DLLNOTFOUND
            lErr = 48: sErr = 'The specified dynamic-link library was not found.'
        Case SE_ERR_FNF
            lErr = 53: sErr = 'File not found'
        Case SE_ERR_NOASSOC
            sErr = 'No application is associated with this file type.'
        Case SE_ERR_OOM
            lErr = 7: sErr = 'Out of memory'
        Case SE_ERR_PNF
            lErr = 76: sErr = 'Path not found'
        Case SE_ERR_SHARE
            lErr = 75: sErr = 'A sharing violation occurred.'
        Case Else
            sErr = 'An error occurred occurred whilst trying to open or print the selected file.'
        End Select
               
        Err.Raise lErr, , App.EXEName & '.GShell', sErr
        ShellEx = False
    End If

End Function

@+
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour MrXXL (surtout pour la largeur du Post !!! lol), Bonjour Cher Ami @Xtof@

Bon j'ai retenté et retenté, même sur quatre machines
en mettant mon collègue de travail sur le coup aussi...
En mettant un msgbox sur la valeur du X on a 2 en integer de retour...

Donc j'en conclus que ShellExecute() does not succeed,
as it returns an integer smaller than 32 !

Machines Testées Win XP Pro S/P 2, Office XP Pro,
(on est déjà au S/P 3 pour XP 2002 ?)
et Adobe ACrobat 6.0 (et 5.0)

Pour mon copain @Xtof@, toi tu génères un fichier ? moi rien du tout !

Enfin on continue les tests...
@+Thierry
 
E

ETPISCULRIEN

Guest
bon, vous prenez pas la tête pour moi les enfants, chez moi ca marche! Merci beaucoup!!!!

Par contre, pour finir d'etre chiant, y a t il possibiliter d'imprimer seulement certaine feuille du fichier PDF?

J'vous jure, après, j'arrete de vous embeter :S
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Etpisculrien, le Fil

Heuh non non non !! ici sur XLD c'est un forum de partage de connaissance,
et si ça marche chez toi, essaie plutôt de nous donner des détails afin de comprendre et résoudre ce problème
pour que cette solution puisse-t'être utile à tous et toutes...

D'aileurs, si on arrivait à faire fonctionner ce code, on pourrait peut-être t'aider pour ta nouvelle question,
donc tu vois même dès maintenant tu as besoin de ce partage de connaissance.

Donc déjà peux-tu nous donner des infos sur ta config ?

Merci d'avance
@+Thierry

Message édité par: _Thierry, à: 17/03/2005 16:34
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour MrXL, le Fil

Heuh oui, mais le problème c'est qu'évidemment j'ai vérifié le chemin,
(Vaut mieux non, avant de poster)
et aussi que ce n'est pas une erreur qui se produit puisque même en enlevant
le 'On Error Resume Next' rien de rien ne se produit...

Code:
'(Avec, évidemment, la Private Declare Function ShellExecute)
Sub PrintThisFile()
    Dim X As Long
    X = ShellExecute(0, 'Print', 'C:\\MrXL.pdf', '', '', 1)
    MsgBox X
End Sub

Soit le fichier MrXl.pdf n'existe pas, le MsgBox retourne 2

Soit je place un PDF existant directement sous C:
(comme ça je risque pas de me tromper dans le chemin !)
que je nomme 'MrXL.pdf' et alors la message box me retourne 42

Dans le premier cas rien ne se passe et je n'ai aucun fichier créé...
Dans le second cas rien ne se passe et j'ai mon PDF d'origine qui n'a pas bougé d'un poil, pas une virgule !

Donc je ne vois pas du tout d'o&ugrave; ça peut venir...
Et je me demande comment ça fonctionne chez l'épicurien...

Bonne Soirée
@+Thierry
 
E

Etpisculrien

Guest
Ben je dois vous avouer que mes connaissance en VBA sont assez limitées, ce qui fait que je ne comprends pas toujours pourquoi ca marche ou ca marche pas. Mais si cela peut vous aider, je bosse sur accrobat reader 5.0, windows 2000, excel 2000 9.0

que puis je vous dire de + ? Je vois vraiment pas pourquoi ca marche chez moi et pas chez vous.
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Bonjour

Cela peut être très pratique,Marianne, si tu veux envoyer une page jsute en consultation sans possibilité de la modifier

De plus le format pdf se lit avec le logiciel gratuit acrobat reader alors que tout le monde n'a pas forcément excel.

Voilà quelques raisons et il en existe peut-être d'autres encore

Bonne soirée
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
314 017
Messages
2 104 584
Membres
109 084
dernier inscrit
mizab