Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

RESOLU - Feuille de visite - Merci phlaurent55

castor30

XLDnaute Occasionnel
Bonjour
Je trouve le temps d'exécution de ce code un peu long (15 secondes)
Peut-il être améliorer
En vous remerciant
VB:
Sub Impression()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Range("G2").Select

    For I = 2 To Range("A300").End(xlUp).Row
            If UCase(Cells(I, 5)) <> "X" Then
                 Rows(I).Hidden = True
            Else
                 I = I + 1
             End If
    Next I
  
'    ActiveWindow.SelectedSheets.PrintOut Copies:=1
    ActiveWindow.SelectedSheets.PrintPreview
    Columns("A:E").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5
    Selection.AutoFilter
    SupSelect
    Range("A2").Select
CreateObject("Wscript.shell").Popup "Impression envoyée à l'imprimante." & Chr(10) & Chr(10) & "Veuillez patienter Svp." & Chr(10) & Chr(10), 1, "Association", vbExclamation
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

Sub SupSelect()
    Range("E2:E300").ClearContents
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.

Essayez :
VB:
LignesOùRelat(Rows(3), "E", "<>", "X").EntireRow.Hidden = True
Ou bien :
VB:
LignesOùCondR1C1(Rows(3), "UCASE(RC5)<>""X""").EntireRow.Hidden = True
Avec :
VB:
Function ColLignesOùRelat(ByVal CelDéb As Range, ByVal ColQuoi, ByVal Opé As String, ByVal Valeur) As Range
Rem. ——— Cellules partant de CelDéb dans sa colonne où la colonne ColQuoi est en relation Opé avec Valeur.
Set ColLignesOùRelat = Intersect(LignesOùRelat(CelDéb, ColQuoi, Opé, Valeur), CelDéb.EntireColumn)
End Function

Function LignesOùRelat(ByVal LigneDéb As Range, ByVal ColQuoi, ByVal Opé As String, ByVal Valeur) As Range
Rem. ——— Lignes entières partant de LigneDéb où la colonne ColQuoi est en relation Opé avec une Valeur.
If Not IsNumeric(ColQuoi) Then ColQuoi = LigneDéb.Worksheet.Columns(ColQuoi).Column
If VarType(Valeur) = vbString Then Valeur = """" & Replace(Valeur, _
   """", """""") & """" Else Valeur = Trim$(Str$(Valeur))
Set LignesOùRelat = LignesOùCondR1C1(LigneDéb, CondR1C1:="RC" & ColQuoi & Opé & Valeur)
End Function

Function ColLignesOùCondR1C1(ByVal CelDéb As Range, ByVal CondR1C1 As String) As Range
Rem. ——— Cellules partant de CélDéb dans sa colonne dont les lignes vérifient une condition R1C1 CondR1C1.
Set ColLignesOùCondR1C1 = Intersect(LignesOùCondR1C1(CelDéb, CondR1C1), CelDéb.EntireColumn)
End Function

Function LignesOùCondR1C1(ByVal LigneDéb As Range, ByVal CondR1C1 As String) As Range
Rem. ——— Lignes entières partant de LigneDéb qui vérifient une condition R1C1 CondR1C1.
Dim Lignes As Range, ColTrv As Range
With LigneDéb.Worksheet.UsedRange
   Set Lignes = LigneDéb.EntireRow.Resize(.Rows.Count + .Row - LigneDéb.Row)
   Set ColTrv = Intersect(.Columns(.Columns.Count + 1), Lignes): End With
ColTrv.FormulaR1C1 = "=1/(" & CondR1C1 & ")"
On Error Resume Next
Set LignesOùCondR1C1 = ColTrv.SpecialCells(xlCellTypeFormulas, 1).EntireRow
ColTrv.Delete xlShiftToLeft
End Function
 

Si...

XLDnaute Barbatruc
Re

L’accès à ton imprimante est rapide d’habitude ?

Il me semble avoir vu qu’une telle création de Pop Up pouvait poser problème d’où ma proposition précédente revue et corrigée avec une seule macro d’impression.

Reprendre plutôt le fichier du message #8 !
 

Pièces jointes

  • Impression(VBA).xls
    47.5 KB · Affichages: 49
Dernière édition:

castor30

XLDnaute Occasionnel
Bonjour Si,
Merci de me venir en aide.
Je tiens à préciser que j'ai besoin de la colonne Sel, en effet, il est utile de revoir la sélection avant l'impression car dans les faits une quinzaine de noms seront sélectionnés pour la visite et c'est plus facile et rapide de contrôler avec cette colonne que de rechercher dans une liste de 300-400 noms les dates de la visite programmée.
Les dates étant effacées seulement, une fois que toutes les personnes auront été visitées.
Ma macro s'exécute bien la première fois mais longues si on reclique sur Imprimer
Je ne comprends pas les codes de Dranreb, mais peut-être peux-tu me les expliquer et où les mettre.
En te remerciant.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
C'était au cas où la lenteur venait de l'accès ligne par ligne pour les masquer.
Ces procédures servent à effectuer en une fois une opération sur toutes les lignes répondant à une certaine condition.
Il y a un commentaire derrière chaque instruction Function qui explique ce que représente l'objet Range qu'elle renvoie.
 

Si...

XLDnaute Barbatruc
Re

Dans For i =… Next , il est fortement déconseillé, comme ici, de modifier la variable de boucle i.

Si tu veux voir la liste avant d’imprimer, il suffit d’ajouter une demande (MsgBox par exemple) sans colonne ni procédure supplémentaires comme dans le nouveau fichier qui doit remplacer celui du message #4.

Si tu tiens à ta colonne Sel, il faudra revoir la programmation.
 

Pièces jointes

  • Impression Si(VBA).xls
    44 KB · Affichages: 46

Dranreb

XLDnaute Barbatruc
Bonjour.
La ligne utilisant LignesOùRelat ou LignesOùCondR1C1 était destinée à remplacer la boucle qui masquait des lignes dans la Sub Impression
Ces fonctions de service, elles, peuvent être implantées dans un autre module standard si vous voulez.
 

castor30

XLDnaute Occasionnel
Bonjour Si Dranreb,
Je ne comprend pas, désolé.
Je met le code si vous voulez bien le rectifier.
En vous remerciant.
VB:
Sub Impression
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Range("G2").Select

    For I = 2 To Range("A300").End(xlUp).Row
            If UCase(Cells(I, 5)) <> "X" Then
                 Rows(I).Hidden = True
            Else
                 I = I + 1
             End If
    Next I
 
    ActiveWindow.SelectedSheets.PrintOut Copies:=InputBox("Saisissez le Nombre de copie", "Nombre de copie"), Collate:=True
'    ActiveWindow.SelectedSheets.PrintOut Copies:=1
    ActiveWindow.SelectedSheets.PrintPreview
    c = InputBox("Combien de copies voulez-vous imprimer ?")
    Columns("A:E").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5
    Selection.AutoFilter
    Range("E2:E300").ClearContents
    Range("A2").Select
CreateObject("Wscript.shell").Popup "Impression envoyée à l'imprimante." & Chr(10) & Chr(10) & "Veuillez patienter Svp." & Chr(10) & Chr(10), 1, "APE Marguerittes", vbExclamation
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Bonjour à tous

Peut-être comme ceci, d'après ce que j'ai compris(sans passer par ImputBox et Message)

VB:
Sub Impression()
Dim derlig As Long, i As Long, NbCopies As Long
    Application.ScreenUpdating = False

    Sheets("Impressions").Activate

    With ActiveSheet
              derlig = .Cells(Rows.Count, "E").End(xlUp).Row
              NbCopies = .Range("g2")  'Ici tu inscrit le nombre de copies à éffectuer
        For i = derlig To 2 Step -1
            If .Cells(i, 5) <> "X" Then
                .Rows(i).Hidden = True
            Else
                .Rows(i).Hidden = False
            End If
        Next i
            .PageSetup.PrintArea = "$A$1:$E$300"
           '.PrintOut Copies:=NbCopies
           .PrintPreview
        For i = derlig To 2 Step -1
            If .Rows(i).Hidden = True Then .Rows(i).Hidden = False
        Next i
    End With
    CreateObject("Wscript.shell").Popup "Impression envoyée à l'imprimante." & Chr(10) & Chr(10) & "Veuillez patienter Svp." & Chr(10) & Chr(10), 1, "Association", vbExclamation
End Sub
 
Dernière édition:

castor30

XLDnaute Occasionnel
Bonjour Lone-wolf
Je te remercie de vouloir m'aider.
NbCopies = .Range("g2") 'Ici tu inscrit le nombre de copies à effectuer
Je crois comprendre que dans la cellule G2 je porte le nombre de copie désirée.

Par contre, je rencontre le problème suivant :
Les lignes ou un X figure dans la colonne Sel (E) ne sont pas triées
Ton code est déjà bien plus rapide.
 

castor30

XLDnaute Occasionnel
re,
Presque ça, ça devient rapide il faut que ça trie la ligne ou X est présent avec la ligne immédiatement en dessous, soit 2 lignes par 2 lignes.
Pour un premier code, j'en bave.
 
Dernière édition:

Discussions similaires

Réponses
8
Affichages
653
Réponses
7
Affichages
477
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…