VBA Macro Excel longue.

rgccx Messages postés 5 Date d'inscription jeudi 29 juillet 2010 Statut Membre Dernière intervention 24 mai 2014 - 26 mars 2012 à 14:05
rgccx Messages postés 5 Date d'inscription jeudi 29 juillet 2010 Statut Membre Dernière intervention 24 mai 2014 - 1 avril 2012 à 20:38
Bonjour,

J'ai ecrit sous VBA excel une macro qui
1) demande un répertoire où se situe une liste de PDF à imprimer
2) lance en boucle
[list]* l'impression des PDF en 'silencieux' (Acrobat s'ouvre, Imprime, et se referme à chaque PDF). Silencieux.. mon oeil, pendant ce temps là on ne peut rien faire car Acrobat prend la main constamment, pas pratique pour travailler en même temps./list
[list]* renseigne dans une nouvelle cellule le nom du PDF imprimé./list

Mes questions :
- Est-il possible de prévoir un bouton qui interrompe la macro (faire une Pause, pas forcément un arrêt)
- Pourquoi est-ce que dès que la macro tourne, la page Excel devient blanche ? (Du coup, le nom du PDF en cours d'impression ne se voit pas):
- Y a t'il moyen que l'impression se fasse de manière vraiment transparente ? Sans que le système prenne la main : vous vous croyez dans Word en train de saisir du texte, mais en fait on tape dans le vide (dans la fenêtre Acrobat).

Merci,

Christophe.

PJ : mon script.

Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Type POINTAPI: Gx As Long: Gy As Long: End Type

Sub selectionRepertoire_afficherChemin()
Dim pos As POINTAPI
Dim ret As Long
Dim Repertoire As FileDialog
Dim FileName As String
Dim Parm As String
Dim Path As String
Dim Filter As String
Dim Com_DOS As String
Dim objFSO, objDossier, objFichier

Set Repertoire Application.FileDialog(msoFileDialogFolderPicker): Set objFSO CreateObject("Scripting.FileSystemObject")
MyShell False: Q Chr(34)
On Error GoTo Erreur

Repertoire.Show
Path = Repertoire.SelectedItems(1) + ""
Set objDossier = objFSO.GetFolder(Path)

For V = 10 To 5 Step -1 ' Trouve l'emplacement et la version de l'exe Adobe Reader.
  Pgm = "C:\Program Files\Adobe\Reader " + Trim(Str(V)) + ".0\Reader\AcroRd32.exe": If objFSO.FileExists(Pgm) Then GoTo VerTrouve
  Pgm = "C:\Program Files\Adobe\Acrobat " + Trim(Str(V)) + ".0\Reader\AcroRd32.exe": If objFSO.FileExists(Pgm) Then GoTo VerTrouve
Next
VerTrouve:
If (objDossier.Files.Count > 0) Then ' Qqchose à imprimer.
Application.ScreenUpdating = False
  Range("A1:H5000").ClearContents
  For y 1 To objDossier.Files.Count: Cells(y, 1) "***_*******_***.pdf": Next: Range("A1").Select: y = 0
  For Each objFichier In objDossier.Files
    y y + 1: Cells(y, 1) objFichier.Name: ActiveCell.Offset(1, 0).Select
    If LCase(Right(objFichier.Name, 3)) = "pdf" Then
      Com_DOS = Q + Pgm + Q + " /h /p " + Q + Path + objFichier.Name + Q
      VBA.Interaction.Shell (Com_DOS)
      zz = zz + 1
      If zz > 13 Then ' Bouge la souris (1 pixel) ttes les 3 min.  pour tromper la mise en veille.
        zz = 0
        ret GetCursorPos(pos): Sx Str(pos.Gx) + (1 * PosNeg): If PosNeg = 1 Then PosNeg = -1 Else PosNeg = 1
        If Sx < 3 Then Sx 3 Else If Sx > 1275 Then Sx 1275
        Call SetCursorPos(Sx, Str(pos.Gy))
      End If
      Sleep 13000 ' Attente 13 secondes pour éviter l'engorgement du spouleur.
    End If
  Next
End If
Application.ScreenUpdating = True
MsgBox ("Impressions terminées")
GoTo Fin
Erreur:
MsgBox Err.Description
Fin:
End Sub

4 réponses

NHenry Messages postés 15118 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 mai 2024 159
26 mars 2012 à 19:15
Bonjour,

Quand je vois un GOTO, je me dis que c'est mal codé
Utilises Exit For/Do/Sub/Function/Property à la place de ton Goto
Sinon, évites aussi les lignes à rallonge avec le :

For V = 10 To 5 Step -1 ' Trouve l'emplacement et la version de l'exe Adobe Reader.
Pgm = "C:\Program Files\Adobe\Reader " + CStr(V) + ".0\Reader\AcroRd32.exe"
If objFSO.FileExists(Pgm) Then Exit For
Pgm = "C:\Program Files\Adobe\Acrobat " + CStr(V) + ".0\Reader\AcroRd32.exe"
If objFSO.FileExists(Pgm) Then Exit For
Next


Est plus lisible que :

For V = 10 To 5 Step -1 ' Trouve l'emplacement et la version de l'exe Adobe Reader.
  Pgm = "C:\Program Files\Adobe\Reader " + Trim(Str(V)) + ".0\Reader\AcroRd32.exe": If objFSO.FileExists(Pgm) Then GoTo VerTrouve
  Pgm = "C:\Program Files\Adobe\Acrobat " + Trim(Str(V)) + ".0\Reader\AcroRd32.exe": If objFSO.FileExists(Pgm) Then GoTo VerTrouve
Next



Sinon, VBA Excel n'est pas .NET, je déplace le sujet, fais attention à l'avenir.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
rgccx Messages postés 5 Date d'inscription jeudi 29 juillet 2010 Statut Membre Dernière intervention 24 mai 2014
27 mars 2012 à 13:57
Merci, je saurai pour la prochaine fois.

Ceci dit, toute réponse est la bienvenue

Christophe.
0
NHenry Messages postés 15118 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 mai 2024 159
1 avril 2012 à 20:13
Bonjour,

- Est-il possible de prévoir un bouton qui interrompe la macro (faire une Pause, pas forcément un arrêt)
En mettant des DoEvents qui permettent de libérer les évènements, tu peux utiliser un bouton, qui mettra un booléene à une valeur qui mettra en pause la fonction.

- Pourquoi est-ce que dès que la macro tourne, la page Excel devient blanche ? (Du coup, le nom du PDF en cours d'impression ne se voit pas):
Utilises DoEvents

- Y a t'il moyen que l'impression se fasse de manière vraiment transparente ? Sans que le système prenne la main : vous vous croyez dans Word en train de saisir du texte, mais en fait on tape dans le vide (dans la fenêtre Acrobat).
Par contre là sur ce point, Shell est normalement asynchrone, donc je ne vois pas pourquoi.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
rgccx Messages postés 5 Date d'inscription jeudi 29 juillet 2010 Statut Membre Dernière intervention 24 mai 2014
1 avril 2012 à 20:38
Bonjour NHenry !
Je vais tester le DoEvents, merci ^^
0
Rejoignez-nous