comment accélérer ma macro pour imprimer seulement les lignes contenants A commander

Alex550445

XLDnaute Junior
Bonjour,
j'ai fait un programme pour imprimer seulement les lignes contenant A commander dans la colonne T ( mon tableau excel a 450 lignes). Ma macro est un peu longue a s'executer.
Comment faire pour la rendre plus rapide. Dois je utiliser le filtre automatique de ma colonne T ou ya t'il une autre solution ?

je vous joins mon prog
Merci


Private Sub Imprimer_Click()
Rows().Hidden = False

Columns().Hidden = False ' affiche toutes les colonnes

Range("A:A, C:J, P:Q, S:S, U:W").EntireColumn.Hidden = True ' masque colonnes A et C

PrinterDefault = ActivePrinter 'mémorise l'imprimante par défaut
MyDate = Format(Date, "dd-mm-yy") 'défini le format de la date

With ActiveSheet.PageSetup ' mise en page
.CenterHorizontally = True 'centre l'impression sur la feuille
.Orientation = xlLandscape ' format paysage
.Zoom = False
.FitToPagesWide = 1 ' agrandissement 100% largeur
.FitToPagesTall = 1 ' agrandissement 100% hauteur
End With
ActiveSheet.PageSetup.PrintArea = "" ' mise en page en-tête
With ActiveSheet.PageSetup

.RightHeader = "&""Arial,Gras""&11Commande du " & MyDate ' écrit : "commande du + date du jour" en en-tête de la feuille

End With

Dim n As Integer

Application.ScreenUpdating = False
For n = 3 To 450
If Cells(n, 20) <> "A commander" Then ' si la colonne 20 affiche A commander
Rows(n).Hidden = True ' masque les ligne différentes de à commander
End If ' et
Next n ' passe à la ligne suivante
ActiveSheet.Range("A2:T450").PrintOut , ActivePrinter:="Microsoft office document image writer" ' prend en compte les colonne A2 à T150 et imprime sur une imprimante défénie
For n = 2 To 450 'exclu la première ligne
Rows(n).Hidden = False ' affiche les lignes
Next n ' passe à la ligne suivante

Range("A:W").EntireColumn.Hidden = False 'affiche colonne A à W

Range("A1").Select 'selectionne la cellule A1 pour afficher correctement le tableau
Application.ActivePrinter = PrinterDefault 'remet l'imprimante du départ

Application.ScreenUpdating = True
End Sub
 

wilfried_42

XLDnaute Barbatruc
Re : comment accélérer ma macro pour imprimer seulement les lignes contenants A comma

Bonjour alex

essaye ceci, un autofilter en automatique

Code:
    Range("T2").Select
    on error resume next
    Selection.AutoFilter
    Selection.AutoFilter Field:=20, Criteria1:="A commander"
    on error goto 0

fin du filtre
Code:
    ActiveSheet.ShowAllData
    Range("T2").Select
    Selection.AutoFilter

Edit : Bonjour Romain, Un peu plus rapide, mais avec beaucoup moins de lignes, ton code est complet :D
 
Dernière édition:

porcinet82

XLDnaute Barbatruc
Re : comment accélérer ma macro pour imprimer seulement les lignes contenants A comma

Salut,

Voici une solution qui il me semble, sera plus rapide :
Code:
Private Sub Imprimer_Click()
Dim n As Integer
Application.ScreenUpdating = False
Rows().Hidden = False
Columns().Hidden = False ' affiche toutes les colonnes
Range("A:A, C:J, P:Q, S:S, U:W").EntireColumn.Hidden = True ' masque colonnes A et C
PrinterDefault = ActivePrinter 'mémorise l'imprimante par défaut
MyDate = Format(Date, "dd-mm-yy") 'défini le format de la date
With ActiveSheet.PageSetup ' mise en page
    .CenterHorizontally = True 'centre l'impression sur la feuille
    .Orientation = xlLandscape ' format paysage
    .Zoom = False
    .FitToPagesWide = 1 ' agrandissement 100% largeur
    .FitToPagesTall = 1 ' agrandissement 100% hauteur
End With
ActiveSheet.PageSetup.PrintArea = "" ' mise en page en-tête
With ActiveSheet.PageSetup
    .RightHeader = "&""Arial,Gras""&11Commande du " & MyDate ' écrit : "commande du + date du jour" en en-tête de la feuille
End With
'on active le filtre sur la colonne 20
Cells(1, 20).AutoFilter
'on filtre les lignes qui on : A commander
Cells.AutoFilter Field:=1, Criteria1:="A commander"
ActiveSheet.Range("A2:T450").PrintOut , ActivePrinter:="Microsoft office document image writer" ' prend en compte les colonne A2 à I150 et imprime sur une imprimante défénie
Cells(1, 20).AutoFilter ' affiche toutes les lignes
Range("A:W").EntireColumn.Hidden = False 'affiche colonne A à W
Range("A1").Select 'selectionne la cellule A1 pour afficher correctement le tableau
Application.ActivePrinter = PrinterDefault 'remet l'imprimante du départ
Application.ScreenUpdating = True
End Sub

Une petite remarque toutefois, si tu ne veux pas passer par un filtre, tu peux deja gagner en execution en mettant Rows("2:450").Hidden = False à la place de ta boucle de 2 à 450

@+

Edition : Salut, Wilfried, tu as ete un poil plus rapide...
 

Alex550445

XLDnaute Junior
Re : comment accélérer ma macro pour imprimer seulement les lignes contenants A comma

Bonjour alex

essaye ceci, un autofilter en automatique

Code:
    Range("T2").Select
    on error resume next
    Selection.AutoFilter
    Selection.AutoFilter Field:=20, Criteria1:="A commander"
    on error goto 0


a quoi sert la fonction : on error resume next et on error goto o ?

sinon nickel, c'est beaucoup plus rapide merci
 

wilfried_42

XLDnaute Barbatruc
Re : comment accélérer ma macro pour imprimer seulement les lignes contenants A comma

re:

à controler des erreurs eventuelles, mais apres plusieurs essais, ces lignes ne servent à rien dans ce cas

On error resume next :indique de continuer la macro, meme en cas d'erreur
On error goto 0 : Rend la gestion des erreurs à Excel

Ces commandes sont à utiliser lorsque l'on sait que la ligne d'un programme risque de provoquer une erreur
exemple : Destruction d'un fichier (il peut ne pas exister), creation d'un repertoire (Ce repertoire ne pouvant etre créé qu'une seule fois, la ligne provoquera au 2eme lancement une erreur)
Rendre imperativement le controle des erreurs apres les lignes susceptibles d'en provoquer
SINON : Une simple erreur involontaire sera traitée et ne sera plus visible par le developpeur, des resultats incoherents risquent d'en découler et les recherches d'etre longues.....
 

Alex550445

XLDnaute Junior
Re : comment accélérer ma macro pour imprimer seulement les lignes contenants A comma

re:



On error goto 0 : Rend la gestion des erreurs à Excel

Rendre imperativement le controle des erreurs apres les lignes susceptibles d'en provoquer
SINON : Une simple erreur involontaire sera traitée et ne sera plus visible par le developpeur, des resultats incoherents risquent d'en découler et les recherches d'etre longues.....

En concret lorsque tu met rend la gestion des erreurs à excel, ca fait quoi ? en cas d'erreur. Avec et sans la ligne On error goto 0
 

wilfried_42

XLDnaute Barbatruc
Re : comment accélérer ma macro pour imprimer seulement les lignes contenants A comma

re:

un exemple grossier est plus simple à expliquer

dim b as date, drapeau as boolean, c as string
b = cdate(inputbox ("Entrez la date"))

si tu entre n'importe quoi à la place d'une date ca va planter avec la fenetre de debbogage habituelle, maintenant, je vais controler l'erreur pour obliger à une bonne saisie

Code:
dim b as date, drapeau as boolean, c as string
     drapeau = false
     while drapeau = false ' Tant que la valeur est false, je continue à saisir
             on error goto erreur ' s'il y a une erreur, je vais à l'etiquette erreur
             b = cdate(inputbox("Entrez la date"))
' Il n'y a pas d'erreur, la date est bien saisie
             drapeau = true ' je vais sortir de ma boucle de saisie
             goto suite ' Je vais à l'etiquette suite (Saute la gestion de l'erreur puisque pas d'erreur)
erreur:
             msgbox "Veuillez entrer une date valide"
suite:
             on error goto 0 ' je rends le controle d'erreur à excel
      wend
' Maintenant je vais ecrire erreur grossiere l'adresse "A0" n'exite pas
      Range("A0") = b ' Si on error goto 0 n'est pas mis, le on error goto erreur est toujours valide et va m'envoyer à l'etiquette erreur:
' cette meme etiquette se trouve dans une boucle While Wend qui n'a pas ete initialisée
Alors avec une On error resume next , va faire continuer la macro sans nous denoncer l'erreur (là volontaire).......

Je ne sais pas si je suis tres clair, :rolleyes:
 

porcinet82

XLDnaute Barbatruc
Re : comment accélérer ma macro pour imprimer seulement les lignes contenants A comma

Salut,

Je pensais pour ma part que On Error Goto 0 invalidait la gestion d'erreur dans une procédure ? Et je viens de jeter un oeil dans l'aide, ca ne m'a pas beaucoup avancé !!!!
En tout cas, j'utilise de temps a autre On Error Resume Next, mais pour les autres, il vaut mieux éviter car ca devient vite des usines a gaz dont on ne comprend plus le sens (dixit les ténors de ce forum).

@+
 

wilfried_42

XLDnaute Barbatruc
Re : comment accélérer ma macro pour imprimer seulement les lignes contenants A comma

re: bonjour Romain :)

Je suis entierement d'accord avec toi, moins on utilise cette procedure, plus joli est le programme et surtout beaucoup plus lisible

Tout comme toi, j'utilise principalement on error resume next et uniquement si je sais que ma ligne risque de provoquer une erreur et que celle-ci est identifiée
 

Alex550445

XLDnaute Junior
Re : comment accélérer ma macro pour imprimer seulement les lignes contenants A comma

Merci pour cette explication,
si j'ai bien compris la ligne 'on error goto 0' permet de faire reprendre la macro si jamais la saisie demandée n'est pas au bon format. Par contre j'ai essayé ton exemple mais il me trouve une erreur lorsque j'essai de saisir plusieurs fois une date, enfin c'est pas trop grave.

encore merci pour l'explication :)
 

Discussions similaires

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote