Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Set Cbut = Cpop3.Controls.Add(Type:=msoControlButton)
With Cbut
.FaceId = 326 '<-- bouton avec icône + texte
.Caption = "Dossiers de Toto" '<-- label du bouton
.OnAction = "DossiersToto"
End With
le OnAction me conduit bien sur la Sub DossiersToto qui est :
Sub DossiersToto()
Personne="toto"
Application.ScreenUpdating = False
For i = 1 To [A65000].End(xlUp).Row
If Cells(i, 2) <> Personne Then Cells(i, 1).EntireRow.Hidden = True
Next i
End Sub
l'idée c'est de masquer toutes les lignes de mon fichier ou il n'y a pas toto (qui est forcement dans la colonne B mais bon, là ça marche aussi)
Dans cette configuration, cela fonctionne.
Cela dit, j'ai 15 choix possibles, je me vois mal recopier 25 sub pour finalement une variable qui change.
J'ai donc essayé de déclarer une variable Personne en début de ma sub de création popup :
Personne as String
Set Cbut = Cpop3.Controls.Add(Type:=msoControlButton)
With Cbut
.FaceId = 326 '<-- bouton avec icône + texte
.Caption = "Dossiers de Toto" '<-- label du bouton
.OnAction = "DossiersToto" Personne="Toto"
End With
et d'ajouter juste aprés le OnAction un truc du type Personne="Toto" de façon a demander à ma procédure de masquage de dossier de faire le boulot en prenant la valeur de personne préalablement déclarée.
genre :
Sub DossiersToto()
Application.ScreenUpdating = False
For i = 1 To [A65000].End(xlUp).Row
If Cells(i, 2) <> Personne Then Cells(i, 1).EntireRow.Hidden = True
Next i
End Sub
Ca marche pas évidemment !
Ma question est donc :
Comment faire pour définir la variable Personne dans ma procédure popup et que cette valeur soit conservée lors du passage dans ma seconde procédure ?
Je souhaites maintenant masquer toutes les lignes qui ne sont pas au bon nom (votre version fonctionne nickel) et EN PLUS les lignes qui sont vides en cellule P
J'ai tenté cela mais ce n'est pas bon :
Sub Test(Nom As String)
Application.ScreenUpdating = False
ActiveSheet.Cells.EntireRow.Hidden = False
For i = 1 To [A65000].End(xlUp).Row
If Cells(i, 2) <> Nom And Cells(i, 12) = "" Then Cells(i, 1).EntireRow.Hidden = True
Next i
End Sub
EDIT :
J'ai trouvé !
Pour ceux que cela interresse :
Sub Test(Nom As String)
Application.ScreenUpdating = False
ActiveSheet.Cells.EntireRow.Hidden = False
For i = 1 To [A65000].End(xlUp).Row
If Cells(i, 2) <> Nom Then Cells(i, 1).EntireRow.Hidden = True
If Cells(i, 2).Offset(0, 14) = "" Then Cells(i, 1).EntireRow.Hidden = True
Next i
End Sub
Re : transmission d'une variable d'une procédure à une autre
Bonsoir Phil,
Parce que "" n'est pas = vide:
Code:
Sub Test(Nom As String)
Application.ScreenUpdating = False
ActiveSheet.Cells.EntireRow.Hidden = False
For i = 1 To [A65000].End(xlUp).Row
If Cells(i, 2) <> Nom And [SIZE=3][COLOR=red]isempty(Cells(i, 12))[/COLOR][/SIZE] Then Cells(i, 1).EntireRow.Hidden = True
Next i
End Sub
Petit conseil en passant
Code:
For i = 1 To [A65000].End(xlUp).Row
Est chronophage en exécution car VBA est obligé de réévaluer l'expression à chaque passage de la boucle.
Si tu as beaucoup de lignes, ceci ira plus vite.
Code:
Dim DerLigne as long
DerLignes=[A65000].End(xlUp).Row
For i = 1 to DerLign
....
Next
Sera plus rapide ceci également:
Code:
Cells(i,1).Hidden = Cells(i, 2) <> Nom And isempty(Cells(i, 12))
Tout ceci sans parler des autres moyens d'aller encore plus vite.
Sub Test(Nom As String)
Application.ScreenUpdating = False
ActiveSheet.Cells.EntireRow.Hidden = False
For i = 1 To [A65000].End(xlUp).Row
If Cells(i, 2) <> Nom And [SIZE=3][COLOR=red]isempty(Cells(i, 12))[/COLOR][/SIZE] Then Cells(i, 1).EntireRow.Hidden = True
Next i
End Sub
Petit conseil en passant
Code:
For i = 1 To [A65000].End(xlUp).Row
Est chronophage en exécution car VBA est obligé de réévaluer l'expression à chaque passage de la boucle.
Si tu as beaucoup de lignes, ceci ira plus vite.
Code:
Dim DerLigne as long
DerLignes=[A65000].End(xlUp).Row
For i = 1 to DerLign
....
Next
Sera plus rapide ceci également:
Code:
Cells(i,1).Hidden = Cells(i, 2) <> Nom And isempty(Cells(i, 12))
Tout ceci sans parler des autres moyens d'aller encore plus vite.
Par contre, je ne comprend pas bien pourquoi votre code est plus rapide.
votre for i.... revient au mien me semble t'il...
Mais bon, je ne maitrise pas encore bien les subtilités c'est pour cela que je suis là... 🙂
Dim DerLigne as long
DerLignes=[A65000].End(xlUp).Row
For i = 1 to DerLign
....
Next
est plus rapide que:
Code:
For i = 1 To [A65000].End(xlUp).Row
....
Next
car, dans cette dernière méthose, à chaque NEXT vb doit faire intervenir ce qu'on appelle des "classes d'objets" et leur méthode complexes pour évaluer l'expression et en retourner le résultat.
il faut mieux donc mettre le résultat dans une variable qui demande un temps de traitement moins couteux en faisant appel à des méthodes vb natives et simples de comparaison.
Quant à
Code:
if Cells(i, 2) <> Nom And [COLOR=black]isempty(Cells(i, 12))[/COLOR] Then Cells(i, 1).EntireRow.Hidden = True
Next i
End Sub
Code:
Cells(i, 2) <> Nom And isempty(Cells(i, 12)) 'renvoie Vrai ou Faux
Cells(i, 1).EntireRow.Hidden = True ' renvoie Vrai ou faux
Donc
Code:
Cells(i, 1).EntireRow.Hidden =Cells(i, 2) <> Nom And isempty(Cells(i, 12))
Une comparaison simple d'égalité est moins coûteuse qu'un IF ..... Then, qui fait intervenir d'autres processus de calcul.
Dim DerLigne as long
DerLignes=[A65000].End(xlUp).Row
For i = 1 to DerLign
....
Next
est plus rapide que:
Code:
For i = 1 To [A65000].End(xlUp).Row
....
Next
car, dans cette dernière méthose, à chaque NEXT vb doit faire intervenir ce qu'on appelle des "classes d'objets" et leur méthode complexes pour évaluer l'expression et en retourner le résultat.
il faut mieux donc mettre le résultat dans une variable qui demande un temps de traitement moins couteux en faisant appel à des méthodes vb natives et simples de comparaison.
Quant à
Code:
if Cells(i, 2) <> Nom And [COLOR=black]isempty(Cells(i, 12))[/COLOR] Then Cells(i, 1).EntireRow.Hidden = True
Next i
End Sub
Code:
Cells(i, 2) <> Nom And isempty(Cells(i, 12)) 'renvoie Vrai ou Faux
Cells(i, 1).EntireRow.Hidden = True ' renvoie Vrai ou faux
Donc
Code:
Cells(i, 1).EntireRow.Hidden =Cells(i, 2) <> Nom And isempty(Cells(i, 12))
Une comparaison simple d'égalité est moins coûteuse qu'un IF ..... Then, qui fait intervenir d'autres processus de calcul.
Sauf que, sur discussion et démonstration par MP avec JOB75(que je remercie🙂), ce que je te disais à propos de FOR..TO.. NEXT (post#5) ne semble pas justifié. Que l'expression qui suit TO n'est évaluée qu'une fois en début de boucle.
Je t'ai induit en erreur. Désolé.
Par contre cela se justifie pour les boucles Do...LOOP et les parcours de cellules en général.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD