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 SubJe 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 SubEn 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 SubBonjjour,
@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 SubJ'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" !
@ bientôt
LouReeD