Bonjour à tous,
Je vous explique mon cas :
J'ai créé un utilitaire excel qu'on utilise dans mon entreprise pour lister des matériels techniques avec leurs caractéristiques (entreprise d'installation en chauffage / clim / ventil / plomberie) puis qui va permettre de générer des dossiers techniques du projet avec tris de fichiers produits, notices, certificats de conformité etc...
Cet utilitaire permet ensuite de créer des dossiers pdf complets, compilés, avec choix de chapitres etc...
Le problème, c'est que selon les constructeurs et leur manière de générer leurs documentations en pdf, je me retrouve régulièrement avec des bugs, variés, à cause des fichiers sources en question.
J'ai constaté, depuis 1 an et demi qu'on s'en sert, que pour régler ce problème, il me suffisait de ré-imprimer le fichier "corrompu" avec l'imprimante "Microsoft Print to pdf" et on repartait.
J'essaye donc de coder un module complémentaire qui devrait me permettre de régénérer en une seule opération toute notre bibliothèque pdf (qui est assez conséquente).
J'ai déjà traité la sélection du dossier (qui sera utile plus tard pour les rajouts de documents dans la bibliothèque), et lister l'ensemble des fichiers pdf présents dans les dossiers et sous-dossiers (stocké dans un tableau())
J'en suis au moment où à partir du nom fichier (que j'ai déjà), je voudrais :
- l'ouvrir depuis excel (sans l'ouvrir à l'écran de préférence),
- le lancer en impression sur "Microsoft Print to pdf"
- écraser automatiquement le fichier pour le remplacer par sa version régénérée (au pire, je pensais créer une copie du dossier et de ses sous-dossiers à côté pour les ranger dedans, car j'ai déjà remarqué qu'il ne voulait pas toujours écraser un fichier déjà ouvert)
J'ai fouillé un peu partout, et j'ai trouvé la méthode avec "shell32.dll" qui fonctionne presque, à ceci-prêt :
- Dans mon code, il utilise l'imprimante par défaut de windows. Et vu que je ne traite que l'imprimante par défaut de excel, ça ne part pas au bon endroit.
- si je bascule l'imprimante par défaut de windows manuellement, ça fonctionne bien, mais j'ai la boîte de dialogue d'enregistrement de fichier qui s'ouvre, et vu la quantité de documents à traiter, je préfèrerai qu'il se débrouille tout seul
J'avoue, que la méthode "shell32" me dépasse un peu
Si quelqu'un avait des pistes ou des méthodes que je puisse étudier pour adaptation, ça me rendrait grand service !
NB : je suis sur Windows 10 en 64 bits
Ci-dessous, le code que j'ai en place pour l'instant (avec sélection manuelle du fichier pour l'instant, c'est pour simplifier le module en phase développement, ensuite je le transformerai en fonction en renvoyant mon nom de fichier)
Et merci par avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 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 Dim ligne As Integer Dim liste_fichiers() As String Sub Impression_MS_to_pdf() Dim stock_nom_imprimante As String '--------------------------------------------------------------------------- 'choix d'un fichier manuellement (TEMPORAIRE, ce sera automatisé ensuite, et itératif) Dim Nom_Fichier As Variant 'Sélection manuelle du fichier par la boîte de dialogue Nom_Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*") 'Gestion de l'annulation de la procédure If Nom_Fichier = False Then Exit Sub '--------------------------------------------------------------------------- 'stockage du nom de l'imprimante par défaut : stock_nom_imprimante = Application.ActivePrinter 'affectation de l'imprimante par défaut sur MS to pdf : Application.ActivePrinter = "Microsoft Print to PDF sur Ne06:" Dim x As Long 'Recherche le fichier x = FindWindow("XLMAIN", Application.Caption) 'Imprime le fichier ShellExecute x, "print", Nom_Fichier, "", "", 1 'réaffectation de l'imprimante par défaut initiale Application.ActivePrinter = stock_nom_imprimante End Sub![]()
Partager