XL 2013 Gestion clic bouton UserForm

M.Ben

XLDnaute Junior
Bonjour tous le monde,

J'ai un soucis dans un programme que je ne cesse de faire évoluer au dès que j'ai un moment pour.
J'ai un bouton qui m'ouvre un Userform (avec multiPage), sur la première page l'utilisateur a la possibilité de cliquer sur 3 boutons.
Chaque bouton amène l'utilisateur sur une page dédié, jusque la pas de problème.

Pour le moment, je me suis concentré à développer le 1er bouton "Gestion des actionneurs", qui ouvre la page suivante :
1682055177381.png

Arrivé ici, l'utilisateur va sélectionner ce qu'il souhaite faire (Actuellement seulement "Ajouter actionneurs" est en développement).
En fonction de son choix le frame grandi et laisse apparaitre d'autres éléments.
Rubrique concerné par ce topic le bouton "Actionneur suivant" quand la checkbox "Créer les lignes 1 à 1" est coché.

Scénario:
L'utilisateur complète les champs et il clique sur le bouton "Actionneur suivant", quand il clique sur ce bouton, les valeurs qui sont renseignées dans les champs sont copier dans les cellules correspondantes de la feuille nommée "LAC", les champs de l'userForm se vide est on passe à l'actionneur suivant est ceux jusqu'à avoir complété x actionneur (x étant le nombre renseigné dans la case "Nombre d'actionneur à ajouter).
Le bouton Créer lignes restantes permet à l'utilisateur de créer comme son nom l'indique les ligne restante dans la LAC (Exemple: on renseigne que nous voulons ajouter 5 actionneur, l'utilisateur complète les champs pour 3 actionneurs mais il ne veut pas remplir les champs des 2 actionneurs restant, alors il clique sur le bouton et les 2 lignes manquant s'ajoute dans la LAC et reste vide. On pourra les remplir plus tard directement dans le LAC).

Mon blocage:

Dans mon VBE, j'ai une module nommé "GestionLAC" qui fait un certain nombre d'action liées aux choix fait par l'utilisateur. Le problème que j'ai, c'est que j'arrive pas à lier mon bouton actionneur suivant à celui-ci. J'aimerai que mon programme se mette en pause lorsque qu'il rentre dans une certaine fonction et que le clic sur le bouton incrémente une variable qui sera lié à une boucle (pour résumer exécuter une boucle en pas à pas avec ce bouton).

J'ai essayer d'afficher le résultat de ce compteur (qui représenterai ma variable) à une cellule pour tester la fonction mais je n'arrive pas à lier mon bouton.
J'ai passer des heures sur des forums pour trouver une solution, j'ai essayé d'adapter ce que je trouvais mais sans succès.

Désolé pour ce roman, j'espère que ma demande est assez compréhensive.

J'ai joint mon fichier pour faciliter les échanges.

Je vous remercie d'avance pour votre aide,

M.Ben
 

Pièces jointes

  • Fichier allégé.xlsm
    219.5 KB · Affichages: 14
Solution
Je suis entièrement d'accord avec ce que vous dites.

Alors le problème vient de ma demande initiale qui est mal posé.
Je m'excuse, j'ai l'impression d'être long à la détente.

Ce que je cherche à obtenir, c'est que ma boucle soit dépendante de l'action sur le bouton.
Quand je clique sur le bouton, je rentre dans ma boucle pour exécuter des opérations (pour le moment je n'ai pas encore écrit les actions à faire).

L'actionneur en question sera de prendre les valeurs dans les différents champs et les coller dans la LAC. et s'il n'y a pas assez de ligner de créer une ligne puis coller les valeurs des champs dans les cellules correspondantes.

Je ne sais pas si je suis plus claire, ou si au contraire je rend la chose encore plus...

Gégé-45550

XLDnaute Accro
Bonjour tous le monde,

J'ai un soucis dans un programme que je ne cesse de faire évoluer au dès que j'ai un moment pour.
J'ai un bouton qui m'ouvre un Userform (avec multiPage), sur la première page l'utilisateur a la possibilité de cliquer sur 3 boutons.
Chaque bouton amène l'utilisateur sur une page dédié, jusque la pas de problème.

Pour le moment, je me suis concentré à développer le 1er bouton "Gestion des actionneurs", qui ouvre la page suivante :
Regarde la pièce jointe 1168668
Arrivé ici, l'utilisateur va sélectionner ce qu'il souhaite faire (Actuellement seulement "Ajouter actionneurs" est en développement).
En fonction de son choix le frame grandi et laisse apparaitre d'autres éléments.
Rubrique concerné par ce topic le bouton "Actionneur suivant" quand la checkbox "Créer les lignes 1 à 1" est coché.

Scénario:
L'utilisateur complète les champs et il clique sur le bouton "Actionneur suivant", quand il clique sur ce bouton, les valeurs qui sont renseignées dans les champs sont copier dans les cellules correspondantes de la feuille nommée "LAC", les champs de l'userForm se vide est on passe à l'actionneur suivant est ceux jusqu'à avoir complété x actionneur (x étant le nombre renseigné dans la case "Nombre d'actionneur à ajouter).
Le bouton Créer lignes restantes permet à l'utilisateur de créer comme son nom l'indique les ligne restante dans la LAC (Exemple: on renseigne que nous voulons ajouter 5 actionneur, l'utilisateur complète les champs pour 3 actionneurs mais il ne veut pas remplir les champs des 2 actionneurs restant, alors il clique sur le bouton et les 2 lignes manquant s'ajoute dans la LAC et reste vide. On pourra les remplir plus tard directement dans le LAC).

Mon blocage:

Dans mon VBE, j'ai une module nommé "GestionLAC" qui fait un certain nombre d'action liées aux choix fait par l'utilisateur. Le problème que j'ai, c'est que j'arrive pas à lier mon bouton actionneur suivant à celui-ci. J'aimerai que mon programme se mette en pause lorsque qu'il rentre dans une certaine fonction et que le clic sur le bouton incrémente une variable qui sera lié à une boucle (pour résumer exécuter une boucle en pas à pas avec ce bouton).

J'ai essayer d'afficher le résultat de ce compteur (qui représenterai ma variable) à une cellule pour tester la fonction mais je n'arrive pas à lier mon bouton.
J'ai passer des heures sur des forums pour trouver une solution, j'ai essayé d'adapter ce que je trouvais mais sans succès.

Désolé pour ce roman, j'espère que ma demande est assez compréhensive.

J'ai joint mon fichier pour faciliter les échanges.

Je vous remercie d'avance pour votre aide,

M.Ben
Bonjour,
C'est un roman certes, mais particulièrement abscons.
Il serait plus simple de nous dire quelle partie de votre code vous pose un problème et ce qu'elle est censée faire.
Vous parlez de lier le bouton 'Actionneur suivant' du formulaire 'MenuPrincipal' au module 'GestionLAC'.
Vu la quantité de code, je n'ai jeté qu'un œil rapide mais, a priori, je n'ai vu qu'un point commun entre le bouton et le module, c'est la variable 'i' déclarée publique dans le module.
D'ailleurs, un clic sur le bouton ne fait qu'une chose, incrémenter la variable 'i'.
Pour qu'il y ait un "lien" avec le module 'GestionLAC', il faudrait au minimum que le bouton "appelle" une des procédures de 'GestionLAC', non ?
Au passage, personnellement, je renommerais la variable publique 'i' avec un nom plus explicite, d'autant que 'i' est déjà utilisée plein de fois comme variable privée dans votre code.
Cordialement,
 

M.Ben

XLDnaute Junior
Bonjour Gégé-45550,
Tout d'abord merci d'avoir pris le temps de me lire, d'avoir regardé mon fichier et d'avoir pris le temps de me répondre.
Je m'excuse pour ce roman qui rend nébuleux ma demande.
Tout d'abord, j'ai pris en considération votre remarque concernant la variable "i" de mon bouton je l'ai renommé pour éviter tout problème.
Renommage variable
Private Sub Bt_Act_Suivant_Click()
Act_Suivant = Act_Suivant + 1
Call Actionneur_en_1a1_Premiere_LAC 'Appelle la function
End Sub
Dans mon module "Gestion LAC", il a une partie que j'ai commenté 'Main, en fonction des évènements j'appelle des functions.
La function qui me pose problème est la suivante:
Function Actionneur_en_1a1_Premiere_LAC()
With Sheets("LAC")
If Act_Suivant < Actuator_Number_Add Then
For Impul_Bt_Act_Suiv = Act_Suivant To Actuator_Number_Add
.Range("O1") = Impul_Bt_Act_Suiv
Next Impul_Bt_Act_Suiv
End If
End With
End Function
Pour le moment j'ai voulu affecter le résultat de la variable à une cellule, car je souhaitais voir si elle s'incrémentait lorsque je clique sur mon bouton. Actuellement ce n'est pas le cas.

Ce que je cherchais à obtenir, c'est que lorsque mon main du module "GestionLAC" appelle la procédure " Function Actionneur_en_1a1_Premiere_LAC()". Elle y reste tant que je n'ai pas ajouté tout les "actionneurs" que je souhaite. les actionneurs s'ajoute qu'après avoir cliqué sur le bouton actionneur suivant.
Une fois que j'ai ajouté le même nombre d'actionneur que renseigné dans la textbox qui est en haut de l'useform, je sort de ma procédure.

Je ne sais pas si j'éclairci ou si j'obscurci encore plus ma demande 😰.

J'ai remis mon fichier, car j'ai apporté la modification que vous m'avez conseillé.

Cordialement
 

Pièces jointes

  • Fichier allégé.xlsm
    189.9 KB · Affichages: 9

Gégé-45550

XLDnaute Accro
Bonjour Gégé-45550,
Tout d'abord merci d'avoir pris le temps de me lire, d'avoir regardé mon fichier et d'avoir pris le temps de me répondre.
Je m'excuse pour ce roman qui rend nébuleux ma demande.
Tout d'abord, j'ai pris en considération votre remarque concernant la variable "i" de mon bouton je l'ai renommé pour éviter tout problème.
Renommage variable

Dans mon module "Gestion LAC", il a une partie que j'ai commenté 'Main, en fonction des évènements j'appelle des functions.
La function qui me pose problème est la suivante:

Pour le moment j'ai voulu affecter le résultat de la variable à une cellule, car je souhaitais voir si elle s'incrémentait lorsque je clique sur mon bouton. Actuellement ce n'est pas le cas.

Ce que je cherchais à obtenir, c'est que lorsque mon main du module "GestionLAC" appelle la procédure " Function Actionneur_en_1a1_Premiere_LAC()". Elle y reste tant que je n'ai pas ajouté tout les "actionneurs" que je souhaite. les actionneurs s'ajoute qu'après avoir cliqué sur le bouton actionneur suivant.
Une fois que j'ai ajouté le même nombre d'actionneur que renseigné dans la textbox qui est en haut de l'useform, je sort de ma procédure.

Je ne sais pas si j'éclairci ou si j'obscurci encore plus ma demande 😰.

J'ai remis mon fichier, car j'ai apporté la modification que vous m'avez conseillé.

Cordialement
Bonsoir,
Votre variable 'Act_Suivant' s'incrémente parfaitement, c'est la boucle que vous avez faite pour mettre à jour la cellule O1 qui vous masque le fonctionnement.
Pour constater par vous même, modifiez la fonction 'Actionneur_en_1a1_Premiere_LAC' comme suit :
VB:
Function Actionneur_en_1a1_Premiere_LAC()
Dim i&, derlig&
    With Sheets("LAC")
        .Unprotect
        Debug.Print "Act_Suivant = " & Act_Suivant
        Debug.Print "Actuator_Number_Add = " & Actuator_Number_Add
        derlig = .Cells(Rows.Count, 15).End(xlUp).Row       'calcule le numéro de la dernière ligne non vide de la 15e colonne (colonne O)
        For i = 1 To derlig
            .Range("O" & i) = ""                                         'Efface les résultats précédents
        Next
            If Act_Suivant < Actuator_Number_Add Then
                For Impul_Bt_Act_Suiv = Act_Suivant To Actuator_Number_Add
                    If Impul_Bt_Act_Suiv > 0 Then .Range("O" & Impul_Bt_Act_Suiv) = Impul_Bt_Act_Suiv
                Next Impul_Bt_Act_Suiv
            End If
        
    End With
End Function
ça ne sert à rien mais ça permet de voir l'évolution de la variable.
Vous constaterez aussi qu'il est nécessaire de déprotéger la feuille pour éviter une erreur d'exécution.
Pensez à utiliser Debug.Print et les variables espions, ça aide au débogage.
Cordialement,
 

M.Ben

XLDnaute Junior
Bonjour,

Je vous remercie, je vais tester et essayer de continuer mon programme avec l'aide que vous venez de m'apporter.

Je suis d'accord avec vous sur le fait que suivre la variable n'a pas d'utilité particulière. Mais comme je ne suis pas un expert en programmation je n'ai trouvé que cette alternative pour contrôle ce que je fais.

Pour ce qui est des fonctionnalitées Debug.Print et variables espions, je ne connais pas et ne sais pas comment les exploiter, c'est la raison pour laquelle je ne m'en sert pas sur mes programmes actuels.

Je me sert énormément de ce forum pour enrichir mes compétences sur le sujet et je l'espère un jour pouvoir apporter ma contribution comme vous et tant d'autre XLDnaute.

Encore merci, je test au plus ce que vous venez de me proposer.
 

Gégé-45550

XLDnaute Accro
Pour ce qui est des fonctionnalitées Debug.Print et variables espions, je ne connais pas et ne sais pas comment les exploiter, c'est la raison pour laquelle je ne m'en sert pas sur mes programmes actuels.
Je me sert énormément de ce forum pour enrichir mes compétences ...
C'est justement pour ça qu'il faut apprendre à se servir des outils d'aide inclus dans VBA (aide Microsoft, Debug, variables espions, etc.).
Un conseil, commencez par ça (il y a plein de tutos sur la toile) et vous verrez que vous progresserez plus vite.
Cordialement,
 

M.Ben

XLDnaute Junior
Je viens de tester votre solution, l'action sur le bouton incrémente bien la variable.

Cependant ma boucle se fait automatiquement, je sort de ma function sans avoir pu incrémenter ma boucle par l'action du bouton "actionneur suivant".

Est-ce que le problème vient des conditions d'entrée de ma boucle ?

Je vais regarder sur la toile ce que je peux trouver sur les Debug, variable espions, etc.
 

Gégé-45550

XLDnaute Accro
Je viens de tester votre solution, l'action sur le bouton incrémente bien la variable.

Cependant ma boucle se fait automatiquement, je sort de ma function sans avoir pu incrémenter ma boucle par l'action du bouton "actionneur suivant".

Est-ce que le problème vient des conditions d'entrée de ma boucle ?

Je vais regarder sur la toile ce que je peux trouver sur les Debug, variable espions, etc.
Si la boucle dont vous parlez est bien celle à laquelle je pense, elle ne sert à rien puisqu'elle modifie le valeur de O1 dans la fonction, visuellement, vous ne voyez donc que le résultat final, à savoir la valeur de 'Actuator_Number_Add'.
Mais, si vous appuyez plusieurs fois sur le bouton 'actionneur_suivant', vous "verrez" les différentes évolutions de O1,O2, etc., ce qui montre bien que la fonction "fonctionne", ce que vous pouvez vérifier dans l'éditeur VBA en ouvrant la fenêtre "Exécution" (menu Affichage) dans la quelle Debug.Print affiche l'évolution des valeurs.
Cordialement,
 

M.Ben

XLDnaute Junior
Je suis entièrement d'accord avec ce que vous dites.

Alors le problème vient de ma demande initiale qui est mal posé.
Je m'excuse, j'ai l'impression d'être long à la détente.

Ce que je cherche à obtenir, c'est que ma boucle soit dépendante de l'action sur le bouton.
Quand je clique sur le bouton, je rentre dans ma boucle pour exécuter des opérations (pour le moment je n'ai pas encore écrit les actions à faire).

L'actionneur en question sera de prendre les valeurs dans les différents champs et les coller dans la LAC. et s'il n'y a pas assez de ligner de créer une ligne puis coller les valeurs des champs dans les cellules correspondantes.

Je ne sais pas si je suis plus claire, ou si au contraire je rend la chose encore plus agaçante 😔.
 

Gégé-45550

XLDnaute Accro
Je suis entièrement d'accord avec ce que vous dites.

Alors le problème vient de ma demande initiale qui est mal posé.
Je m'excuse, j'ai l'impression d'être long à la détente.

Ce que je cherche à obtenir, c'est que ma boucle soit dépendante de l'action sur le bouton.
Quand je clique sur le bouton, je rentre dans ma boucle pour exécuter des opérations (pour le moment je n'ai pas encore écrit les actions à faire).

L'actionneur en question sera de prendre les valeurs dans les différents champs et les coller dans la LAC. et s'il n'y a pas assez de ligner de créer une ligne puis coller les valeurs des champs dans les cellules correspondantes.

Je ne sais pas si je suis plus claire, ou si au contraire je rend la chose encore plus agaçante 😔.
Dans ce cas, ce n'est pas une boucle qu'il faut écrire (une boucle s'exécute du début à la fin et n'est interrompue que si elle rencontre une condition d'arrêt).
Cela peut être par exemple un Select Case sur le compteur 'Act_Suivant' :
VB:
Select Case Act_Suivant
    Case 0
        'mon action 0
    Case 1
        'mon action 1
    Case 2
        'mon action 2
End Select
Cordialement,
 

M.Ben

XLDnaute Junior
Dans cette solution, si j'ai renseigne 100 actionneurs dans ma TextBox, je suis obligé de faire 100 case ?
Ou il est possible de mettre une condition?

Du genre IF Case < au nombre d'actionneur, tu fais des actions et incrémente de le "Case" de +1 et si Case = Nombre actionneur tu passes aux étapes d'après ?

ou

Exemple:
Select Case Act_Suivant
Case Act_Suivant < Actuator_Number_Add
'Action : copier les champs dans cellules
Case Act_Suivant = Actuator_Number_Add
exit
End Select
Ou c'est absurde ce que je dis ?

Cordialement
 

Gégé-45550

XLDnaute Accro
Dans cette solution, si j'ai renseigne 100 actionneurs dans ma TextBox, je suis obligé de faire 100 case ?
Ou il est possible de mettre une condition?

Du genre IF Case < au nombre d'actionneur, tu fais des actions et incrémente de le "Case" de +1 et si Case = Nombre actionneur tu passes aux étapes d'après ?

ou

Exemple:

Ou c'est absurde ce que je dis ?

Cordialement
Non, ça doit marcher
 

Gégé-45550

XLDnaute Accro
Dans cette solution, si j'ai renseigne 100 actionneurs dans ma TextBox, je suis obligé de faire 100 case ?
Ou il est possible de mettre une condition?

Du genre IF Case < au nombre d'actionneur, tu fais des actions et incrémente de le "Case" de +1 et si Case = Nombre actionneur tu passes aux étapes d'après ?

ou

Exemple:

Ou c'est absurde ce que je dis ?

Cordialement
Mais ce serait plutôt :
VB:
Select Case Act_Suivant
Case Act_Suivant <= Actuator_Number_Add
'Action : copier les champs dans cellules
Case Act_Suivant > Actuator_Number_Add
exit
End Select
Cordialement,
 

M.Ben

XLDnaute Junior
Quand j'écris :

Select Case Act_Suivant
Case Act_Suivant <= Actuator_Number_Add
'Code pour les différente action a exécuter
Case Act_Suivant < Actuator_Number_Add
Exit
End Select

J'ai le mot Exit qui se met en rouge et le message suivant apparait, alors que pour moi je n'ai pas d'erreur de syntaxe:
1682155450970.png


le code est le suivant:

Function Actionneur_en_1a1_Premiere_LAC()
Dim i&, derlig&
With Sheets("LAC")
.Unprotect
Debug.Print "Act_Suivant = " & Act_Suivant
Debug.Print "Actuator_Number_Add = " & Actuator_Number_Add
derlig = .Cells(Rows.Count, 15).End(xlUp).Row 'calcule le numéro de la dernière ligne non vide de la 15e colonne (colonne O)
For i = 1 To derlig
.Range("O" & i) = "" 'Efface les résultats précédents
Next
Select Case Act_Suivant
Case Act_Suivant <= Actuator_Number_Add
'Code pour les différente action a exécuter
Case Act_Suivant < Actuator_Number_Add
Exit
End Select
' If Act_Suivant < Actuator_Number_Add Then
' For Impul_Bt_Act_Suiv = Act_Suivant To Act_Suivant = Actuator_Number_Add
' If Impul_Bt_Act_Suiv > 0 Then .Range("O" & Impul_Bt_Act_Suiv) = Impul_Bt_Act_Suiv
' Next Impul_Bt_Act_Suiv
' End If

End With
End Function
Pour résoudre le problème, je dois écrire:


Cependant je constate que je sort de mon Main, je me demande si la fonction select case il ne faudrait t-il pas que je la mette dans mon "Main" plutôt que dans ma function.

Merci, au file de la discussion, la résolution de ma demande avance et j'apprend pas mal de chose.

Cordialement
 
Dernière édition:

Gégé-45550

XLDnaute Accro
Quand j'écris :



J'ai le mot Exit qui se met en rouge et le message suivant apparait, alors que pour moi je n'ai pas d'erreur de syntaxe:
Regarde la pièce jointe 1168729

le code est le suivant:


Pour résoudre le problème, je dois écrire:
end function
Au temps pour moi, j'ai été inattentif ; remplacez Exit par Exit Function
Cependant je constate que je sort de mon Main, je me demande si la fonction select case il ne faudrait t-il pas que je la mette dans mon "Main" plutôt que dans ma function.
Tout dépend de quand vous voulez que le Select Case soit activé.
Du moment que votre 'Main' appelle la fonction, le Select Case sera exécuté. Donc vous pouvez le placer où cela vous semble le mieux (et s'il est dans la Sub 'Main', il faudra écrire Exit Sub au lieu de Exit Function).
Cordialement,
 

Statistiques des forums

Discussions
315 087
Messages
2 116 082
Membres
112 654
dernier inscrit
SADIKA