Simplification de code

Bonjour à tous!

J'ai un code qui fonctionne très bien dans le sens où il fait exactement ce que je veux qu'il fasse. Toute fois, il est extrêmement lent et lourd, je n'arrive toute fois à le simplifier afin qu'il fasse la même chose, mais de façon instentané. Je vous mets mon code ici-bas :

Private Sub C_enregistrercédule_Click()

    ActiveSheet.Unprotect

 Dim lig%
  Application.ScreenUpdating = False
   With ActiveSheet
    .Rows.Hidden = False
     For lig = 7 To 506
      If .Cells(lig, "A") = "" Then Rows(lig).Hidden = True
     Next lig
   End With

Dim rng As Range
   Set rng = Range("A1:I506")
    rng.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    ActiveWorkbook.Path & "\" & ActiveSheet.Range("B2").Value & "_" & "Échéancier R" & " - " & Date, Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=True

    Range("7:506").EntireRow.Hidden = False

    ActiveSheet.Protect, DrawingObjects:=True, Contents:=True, Scenarios:=True

Unload Formulaire

End Sub

Private Sub C_enregistrementgantt_Click()

    ActiveSheet.Unprotect

 Dim lig%, col%
  Application.ScreenUpdating = False
   With ActiveSheet
    .Rows.Hidden = False: .Columns.Hidden = False
     For lig = 7 To 506
      If .Cells(lig, "A") = "" Then Rows(lig).Hidden = True
     Next lig
     For col = 10 To 1009
      If .Cells(1, col) = "" Then Columns(col).Hidden = True
     Next col
   End With

    ActiveWorkbook.Save
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    ActiveWorkbook.Path & "\" & ActiveSheet.Range("B2").Value & "_" & "Échéancier R" & " - " & Date, Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=True

    Range("J:ALU").EntireColumn.Hidden = False
    Range("7:506").EntireRow.Hidden = False

    ActiveSheet.Protect, DrawingObjects:=True, Contents:=True, Scenarios:=True

Unload Formulaire

End Sub

Je ne sais pas si vous pouvez m'aider avec mon problème? Merci d'avance à tous!

Bonsoir,

à savoir : les accès feuilles entre VBA et Excel ralentissent l'exécution des macros.
Pour le masquage des lignes vous pouvez vous "appuyer" sur cet exemple :

Sub MasqueEnLot()
    Dim Plage As Range, I, Tablo
    ' on montre la plage entière
    Range("A1:A20").EntireRow.Hidden = False
    ' on entre en une seule fois sous VBA les données de la colonne de test pour le masquage des lignes
    Tablo = Range("A1:A20")
    ' on boucle sous VBA ce tableau
    For I = 1 To UBound(Tablo)
        If Tablo(I, 1) <> "" Then
            ' si la plage ne correspond à rien
            If Plage Is Nothing Then
                ' on lui attribu la première ligne à masquer
                Set Plage = Range(I & ":" & I)
            Else
                ' sinon on lui rajoute la suivante
                Set Plage = Union(Plage, Range(I & ":" & I))
            End If
        End If
    Next I
    ' on masque la plage "unie" en une seule fois
    Plage.EntireRow.Hidden = True
End Sub

En espérant que ceci suffise...

@ bientôt

LouReeD

Bonsoir!

Merci pour ton aide!

J'ai fait quelque test pour arriver et étrangement il ne sélectionne au final que les 7 à 21 alors que la colonne A7:A21 il y a de l'information d'inscrite. De plus c'est même complété jusqu'à A27. Ma Plage doit être entre A7:A506 et si la cellule est vide donc la masquer. J'ai essayé aussi de changer <>"" pour = "" et ça ma donner le contraire des lignes soit de A22:A506, mais encore une fois la plage qu'il doit vérifié est jusqu'à A506 et des cellules A22:A27 il y a de l'information, mais le reste était vide. Voici ton code de la manière que je l'ai essayé, je n'arrive toute fois pas à lui faire sélectionner les cellules qui sont vraiment vide dans la Plage A7:A506 :

Private Sub CommandButton1_Click()

   Dim Plage As Range, I, Tablo
    ' on montre la plage entière
    'Range("A7:A506").EntireRow.Hidden = False
    ' on entre en une seule fois sous VBA les données de la colonne de test pour le masquage des lignes
    Tablo = Range("A7:A506")
    ' on boucle sous VBA ce tableau
    For I = 7 To UBound(Tablo)
        If Tablo(I, 1) <> "" Then
            ' si la plage ne correspond à rien
            If Plage Is Nothing Then
                ' on lui attribu la première ligne à masquer
                Set Plage = Range(I & ":" & I)
            Else
                ' sinon on lui rajoute la suivante
                Set Plage = Union(Plage, Range(I & ":" & I))
            End If
        End If
    Next I
    ' on masque la plage "unie" en une seule fois
    Plage.Select
    'EntireRow.Hidden

End Sub

Bonjjour,
@CedL,
Que penses-tu de l'idée de joindre un petit fichier (représentatif de tes données) ?
Cdlt.

Bonjour,

La boucle for boucle sur l'index du tableau donc valeur ligne 7 de la feuille = index 1 du tableau

La boucle va de 1 à ubound(tablo) par contre pour la designation de ligne il faudra mettre i+6 !

@ bientôt

LouReeD

MERCI LouReeD!! Il ne manquait plus que ça je ne comprenais pas assez bien le code, merci encore!

Rebonjour LouReeD,

J'essaie maintenant de le faire à partir du même code que tu as fait, mais cette fois-ci pour les colonnes. Voici ce que j'ai tenté :

Private Sub CommandButton1_Click()

   Dim Plagecol As Range, II, Tablo2

    Tablo2 = Range("J1:AX1")

    For II = 1 To UBound(Tablo2)
        If Tablo2(1, II) = "" Then
            If Plagecol Is Nothing Then
                Set Plagecol = Range(II + 9 & ":" & II + 9)
            Else
                Set Plagecol = Union(Plagecol, Range(II + 9 & ":" & II + 9))
            End If
        End If
    Next II

    Plagecol.Select

End Sub

J'ai uniquement un "bug" à la dernière ligne, mais j'imagine que mon problème est plus en amont. Je pensais qu'en inversant seulement la valeur "I" et "1" pour qu'il se retrouve de l'autre côté de la virgule ça fonctionnerait, mais ça ne fonctionne pas... J'ai donc l'impression que mon problème réside dans la fonction Set je me trompe?

Bonsoir,

ci dessous les codes pour les lignes et colonnes avec recherche de la dernière ligne utilisée et la dernière colonne utilisée :

Sub MasqueEnLotLigne()
    Dim Plage As Range, I, Tablo, MaxLig
    ' on cherche la dernière ligne utilisée
    MaxLig = Range("A" & Rows.Count).End(xlUp).Row
    ' on montre la plage entière
    Range("A1:A" & MaxLig).EntireRow.Hidden = False
    ' on entre en une seule fois sous VBA les données de la colonne de test pour le masquage des lignes
    Tablo = Range("A1:A" & MaxLig)
    ' on boucle sous VBA ce tableau
    For I = 1 To UBound(Tablo)
        If Tablo(I, 1) <> "" Then
            ' si la plage ne correspond à rien
            If Plage Is Nothing Then
                ' on lui attribu la première ligne à masquer
                Set Plage = Rows(I)
            Else
                ' sinon on lui rajoute la suivante
                Set Plage = Union(Plage, Rows(I))
            End If
        End If
    Next I
    ' on masque la plage "unie" en une seule fois
    Plage.EntireRow.Hidden = True
End Sub

Sub MasqueEnLotColonne()
    Dim Plage As Range, I, Tablo, MaxCol
    ' on cherche la dernière colonne utilisée
    MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column
    ' on montre la plage entière
    Range(Cells(1, 1), Cells(1, MaxCol)).EntireColumn.Hidden = False
    ' on entre en une seule fois sous VBA les données de la ligne de test pour le masquage des colonnes
    Tablo = Range(Cells(1, 1), Cells(1, MaxCol))
    ' on boucle sous VBA ce tableau
    For I = 1 To UBound(Tablo, 2) ' tableau horizontal on prend la taille de la deuxième dimension de ce dernier
        If Tablo(1, I) <> "" Then ' ici inversion du 1 et i car le tableau est horizontal : 1 ligne sur plusieurs colonnes)
            ' si la plage ne correspond à rien
            If Plage Is Nothing Then
                ' on lui attribu la première colonne à masquer
                Set Plage = Columns(I)
            Else
                ' sinon on lui rajoute la suivante
                Set Plage = Union(Plage, Columns(I))
            End If
        End If
    Next I
    ' on masque la plage "unie" en une seule fois
    Plage.EntireColumn.Hidden = True
End Sub

@ bientôt

LouReeD

Tu es de loin le meilleur spécialiste VBA que j'ai pu rencontrer autant pour ta pédagogie et que tes connaissances, merci beaucoup!

Bonsoir,

Merci pour ce retour, c'est gentil mais "c'est faux" ! Je ne suis pas le meilleur et de loin, mais j'arrive à faire ce que je souhaite... Peut-être parce que je ne m'en demande pas trop !

@ bientôt

LouReeD

Rechercher des sujets similaires à "simplification code"