transmission d'une variable d'une procédure à une autre

  • Initiateur de la discussion Initiateur de la discussion Phil39
  • Date de début Date de début

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 !

Phil39

XLDnaute Occasionnel
Encore moi... 🙂

J'ai un popup type (c'est un extrait)


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 ?
 
Dernière édition:
Re : transmission d'une variable d'une procédure à une autre

Bonjour Phil,

Attention aux guillemets simples et doubles
Code:
    .OnAction = "[SIZE=3][COLOR=red]'[/COLOR][/SIZE]DossiersToto ""tata""[SIZE=3][COLOR=red]'[/COLOR][/SIZE]"

Ou avec la même mise en garde:

Code:
.OnAction = [COLOR=#ff0000][SIZE=3][COLOR=blue]"[/COLOR][/SIZE]'[COLOR=black]DossiersToto [/COLOR][SIZE=3][COLOR=blue]"[/COLOR][/SIZE][/COLOR][COLOR=#ff0000][SIZE=3][COLOR=blue]""[/COLOR][/SIZE][/COLOR]  & UneVariable & [SIZE=3][COLOR=#ff0000][COLOR=blue]""[/COLOR][/COLOR][COLOR=#ff0000][COLOR=blue]"[/COLOR][COLOR=red]'[/COLOR][COLOR=blue]"[/COLOR][/COLOR][/SIZE]

Bien-sûr il faut

Code:
Sub DossiersToto([SIZE=3][COLOR=red]Qui as string[/COLOR][/SIZE])


A+
 
Dernière modification par un modérateur:
Re : transmission d'une variable d'une procédure à une autre

Bonjour Phil,

Attention aux guillemets simples et doubles
Code:
    .OnAction = "[SIZE=3][COLOR=red]'[/COLOR][/SIZE]DossiersToto ""tata""[SIZE=3][COLOR=red]'[/COLOR][/SIZE]"

Ou avec la même mise en garde:

Code:
.OnAction = [COLOR=#ff0000][SIZE=3][COLOR=blue]"[/COLOR][/SIZE]'[COLOR=black]DossiersToto [/COLOR][SIZE=3][COLOR=blue]"[/COLOR][/SIZE][/COLOR][COLOR=#ff0000][SIZE=3][COLOR=blue]""[/COLOR][/SIZE][/COLOR]  & UneVariable & [SIZE=3][COLOR=#ff0000][COLOR=blue]""[/COLOR][/COLOR][COLOR=#ff0000][COLOR=blue]"[/COLOR][COLOR=red]'[/COLOR][COLOR=blue]"[/COLOR][/COLOR][/SIZE]

Bien-sûr il faut

Code:
Sub DossiersToto([SIZE=3][COLOR=red]Qui as string[/COLOR][/SIZE])


A+

Autre question sur le même sujet :

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
 
Dernière édition:
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.

A+++
 
Dernière modification par un modérateur:
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.

A+++

Merci pour les infos.

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à... 🙂
 
Re : transmission d'une variable d'une procédure à une autre

Bonjour,

Après week-end:

Phil39 à dit:
Par contre, je ne comprend pas bien pourquoi votre code est plus rapide.

Code:
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.

A+

A+
 
Re : transmission d'une variable d'une procédure à une autre

Bonjour,

Après week-end:



Code:
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.

A+

A+

OK c'est plus clair. Merci beaucoup
 
Re : transmission d'une variable d'une procédure à une autre

bonjour Phil,

OK c'est plus clair. Merci beaucoup
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.

Bonne journnée
A bientôt
 
- 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

Discussions similaires

Réponses
11
Affichages
1 K
Réponses
6
Affichages
736
Retour