Déclencher un UserForm plusieurs fois selon une valeur de ComboBox

@Dan ah oui bien vu pour les groupes (par contre la variable combo décrémenter et 0 ,,,,,,, là tu m'as coulé, je sors ma bouée

C'est facile.

1. Dans l'USF en haut de tous les codes, juste en dessous de Option explicit, tu déclares une variable comme ceci

Dim Compteur as byte

2. Ensuite tu ajoutes ce code,

Private Sub ComboBox2_Change()
Compteur = ComboBox2.Value
End Sub

3. Ensuite dans le code valider, juste avant le END SUB, tu mets cette instruction

Compteur = Compteur - 1
If Compteur > 0 Then ComboBox2.Enabled = False Else Combobo2.Enabled = True

Le IF permet de rendre la combobox2 inaccessible tant que tu n'as pas validé le nombre de groupe choisi

Faudra tester et peut être ajouter un label pour informer le nombre de groupe restants à valider.
Il faut aussi penser à vider les rubriques à droite à chaque Validation et toute l'UF1 dès que tout est encodé (donc Compteur à 0)

Tu vois l'idée ?

Edit :

merci Dan, j'ai corrigé l'UF1, merci ( j'ai juste ajouté la déclaration de la variable i Dim i As Integer )

Tu peux la laisser a BYTE au lieu d'INTEGER

Re,

Oui, merci, je comprends mieux avec les détails + explications ^^

je vais essayer avec ce que tu as exposé

Note: bon, j'ai l'erreur de la variable ComboBox2, j'ai placé comme dit ci-dessus il y avait combobo2 (corrigé)


EDIT un truc supplémentaire : @Dan et/ou @Martin est-ce bonne idée ?

zcombo1

EDIT @méditer pour plus tard

Pour les comboboxs sauf pour la combobox 2 de l'uf1, une création d'une feuille que l'on nomme par exemple 'cache'

au cas où si, le nom des feuilles change ou si' l'on rajoute ( je fais une capture d'écran)

Private Sub UserForm_Initialize()
' voir feuille du classeur  cache
On Error Resume Next

Dim i, k, l As Integer
' colonne A de la feuille cache  - choix des dates
For i = 1 To Sheets("cache").Range("A65536").End(xlUp).Row
ComboBox1 = Sheets("cache").Range("A" & i)
If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Sheets("cache").Range("A" & i)
Next i

' colonne C de la feuille cache  - Festival, accompagnement, Diffusion et Studios
For k = 1 To Sheets("cache").Range("C65536").End(xlUp).Row
ComboBox3 = Sheets("cache").Range("C" & k)
If ComboBox3.ListIndex = -1 Then ComboBox3.AddItem Sheets("cache").Range("C" & k)
Next k

' colonne D de la feuille cache  - Cession et engagement
For l = 1 To Sheets("cache").Range("D65536").End(xlUp).Row
ComboBox4 = Sheets("cache").Range("D" & l)
If ComboBox4.ListIndex = -1 Then ComboBox4.AddItem Sheets("cache").Range("D" & l)
Next l

'''' ' ComboBox1.AddItem "Jan-Mars"
'''' ' ComboBox1.AddItem "Festival"
'''' ' ComboBox1.AddItem "Avril-Juil"
'''' ' ComboBox1.AddItem "Sept-Déc"

  ComboBox2.AddItem "1"
  ComboBox2.AddItem "2"
  ComboBox2.AddItem "3"
  ComboBox2.AddItem "4"
  ComboBox2.AddItem "5"

 ''''' ComboBox3.AddItem "39 - FESTIVAL"
 ''''' ComboBox3.AddItem "40 - ACCOMPAGNEMENT"
 ''''' ComboBox3.AddItem "41 - DIFFUSION"
 ''''' ComboBox3.AddItem "42 - STUDIOS"

 ''''' ComboBox4.AddItem "Cession"
 ''''' ComboBox4.AddItem "Engagement"

'' la combo2 on laisse comme çà
''For j = 1 To Sheets("cache").Range("B65536").End(xlUp).Row
''ComboBox2 = Sheets("cache").Range("B" & j)
''If ComboBox2.ListIndex = -1 Then ComboBox2.AddItem Sheets("cache").Range("B" & j)
''Next j

End Sub

Re-bonjour !

@Andre13 :

j'ai pensé à un truc pour les artistes et groupes de 1 à 5

soit 1: par message box -input box, si coché 1, 2 , 3, 4 ou 5 de l'UF1 ou voir ci-dessous

soit 2: directement au travers toujours de l'UF1 pour ajouter des frames suivant le choix si, l'option de choix et/ou par la combo la frame en question apparaît 2 les autres frames sont cachés (exemple avec 4 frames mais toutes visibles) après, il serai plus facile pour concaténer les textboxs des noms des artistes et groupes ((c'est un aperçu))

Le soucis dans ce cas là, c'est que j'ai besoin de créer une ligne par artiste car toutes les informations (type de rémunération, coûts etc...) sont individuelles et cette proposition ne me semble pas dissocier les infos ? Je me trompe peut-être, n'hésite pas à me reprendre si c'est le cas !

@Dan :

Voici une idée à creuser avec l'USF1, lorsque tu as plusieurs groupes à faire.

Effectivement c'est une très bonne idée aussi ! Je cherche comment faire, je veux bien que tu laisses le code qui m'aidera sûrement !

1. J'ai modifié le code pour le formatage des données. Vois ci-dessous à remplacer juste en dessous du END SELECT

Je ne suis pas sûr de comprendre où ce morceau de code doit intervenir ?

Je vous joins une autre piste de travail que j'ai explorée, avec plusieurs UF à base de multipage qui se déclenchent en fonction de la valeur de la ComboBox artistes... à voir si cela peut fonctionner mais pour le moment je ne trouve pas comment le coder :

Merci beaucoup ! Et belle soirée :)

@André

Pour les comboboxs sauf pour la combobox 2 de l'uf1, une création d'une feuille que l'on nomme par exemple 'cache'au cas où si, le nom des feuilles change ou si' l'on rajoute ( je fais une capture d'écran)

Non pas besoin de faire cela. Avec le code Valider que je t'ai donné. Il peut même changer le nom des feuilles, cela n'aura aucun impact sur le fonctionnement du fichier. Pour moi tu peux laisser la macro Initialize comme initialement.

@Martin :

Je vous joins une autre piste de travail que j'ai explorée, avec plusieurs UF à base de multipage qui se déclenchent en fonction de la valeur de la ComboBox artistes... à voir si cela peut fonctionner mais pour le moment je ne trouve pas comment le coder :

C'est beaucoup plus compliqué. Et au final vous allez avoir une usine à gaz (ce qu'excel arrive à faire très facilement). Je resterais sur le fichier fait par André avec une seule USF pour l'instant.

Je ne suis pas sûr de comprendre où ce morceau de code doit intervenir ?

Il est bien placé sauf que vous avez supprimé une partie.

Bonjour toutes et tous

j'ai remis à l'initial oki Dan et merci ^^

ci-joint version 006A

1/ du coup on le supprime l'UF2 ?

bonne fin de soirée, je laisse au repos ce classeur pour ce soir

Edit : new version test006b

Bonjour André

Je viens de regarder ta dernière version. Joli !

Afin de bien utiliser la variable Compteur, je te propose de modifier la fin du code validation comme ceci.

' ajouter pour compteur groupe et artistes
Compteur = Compteur - 1
If Compteur > 0 Then
    ComboBox2.Enabled = False
    For i = 2 To 9
        Controls("TextBox" & i).Value = ""
    Next i
    ComboBox4.Value = ""

Else: ComboBox2.Enabled = True
    For i = 1 To 9
        On Error Resume Next
        Controls("TextBox" & i).Value = ""
        Controls("Combobox" & i).Value = ""
    Next i
End If
End Sub

Raison : Cela va permettre à chaque Validation de vider la partie basse l'UF1 dès que plusieurs groupes font partie de l'événement et donc qu'il y a plusieurs lignes à créer.
Lors de la validation du dernier groupe (ou s'il n'y a qu'un seul groupe), l'UF1 sera vidée complètement.

Amélioration :
- Mettre la référence Frame1 sur la partie haute de l'UF1 et Frame2 sur la partie basse (là c'est l'inverse)
- Créer un label dans lequel on met le nombre de validation restant à faire. En gros, il suffirait de mettre une instruction avant le END SUB, genre ceci :

Label14 = Compteur

Cela permettrait au responsable de savoir si tous les groupes ont été renseignés. (Label14 parce qu'il y en a déjà 13 sur l'UF1)

Rem :j'ai vu un chiffre 5 à coté de la Combo Nbre d'artiste. Il y a une raison ?

Bonjour Andre et Dan,

Tout d'abord, merci pour le travail que vous fournissez, cela était au dessus de mes compétences et c'est vraiment chouette d'apprendre avec vous !

Effectivement, la piste que j'ai travaillée était très lourde en terme de code, et je me suis aussi rendu compte que les onglets n'étaient pas forcément intuitifs.

J'ai compilé l'essai d'Andre avec l'ajout de Dan, et j'ai un petit souci. Quand je sélectionne plusieurs groupes, au moment de valider un bug apparait :

capture3

Il me semble que c'est au niveau de la déclaration de la valeur du compteur qu'il y a un souci mais je ne comprends pas lequel.

Une nouvelle fois merci à vous deux !

Martin

Bonjour toutes et tous,

merci Dan, j'ai rectifié ci-dessus ^^

@Dan,

  1. j'avais un peu anticipé pour le label, j'ai modifié son name nom est mis ==> Label14 comme tu as cité sur ton post ci-dessus (rectifié), j'ai mis également avant le End Sub Label14 = Compteur (mis en place dans le code)
  2. inversion des 2 frames UF1 rectifiés

ci-joint classeur ==>0006b

@Martin (bonjour, j'étais en train de réédité mon post en même temps que toi et pas eût le temps de lire ton post, je vais lire ton post, -;) )

EDIT: @Martin, oui exact avec Dan qui me donne un coup de pouce et qui m'explique la marche à suivre ^^, hier soir j'étais trop HS pour comprendre quoi que se soit, là actuellement, part le biais de cette new version 006b et les instructions de Dan, voici cette nouvelle version plus fluide d'où l'erreur de ton compteur de la v006a

crdlt,

André

Re

J'ai compilé l'essai d'Andre avec l'ajout de Dan, et j'ai un petit souci. Quand je sélectionne plusieurs groupes, au moment de valider un bug apparait :

Exact mais il y a deux erreurs dans les codes .... de ma faute ..

1. Dans le code Private Sub ComboBox2_Change() il faut supprimer la défintion de variable Dim Compteur as bytecar elle est déjà déclarée haut dessus après Option Explicit. C'est ce qui provoque l'erreur plus bas mentionnée par Martin

2. Dans le code Valider il faut modifier cette ligne

With Worksheets(ComboBox1.ListIndex + 2).ListObjects("Tableau" & ComboBox1.ListIndex + 1)

par

With F.ListObjects("Tableau" & ComboBox1.ListIndex + 1)

Refais un test

Re,

Merci Dan ^^,

pour la 1, oupsss, c'est moi qui est oublié de supprimer pour la déclaration de la variable Dim compteur As Byte

Question: il faudrait peut-être envoyer un message box, lorsque les actions ont étés réalisés avec succès! ,

ou par rapport au label14 sur l'uf1 dès que sa valeur est sur 0 événement change du label14 ou, carrément quitter le formulaire


merci en tout cas Dan ^^ sans toi, je n'aurai qu'effectuer un millième de ce que tu as réalisé

bon, version test006c

Note : @Martin reste plus qu'à embellir le tout


Edit 19/02/2021 à 14:55 : merci Dan s'est ajouté pour le msgbox

version test006d

crdlt,

André

re

pour la 1, oupsss, c'est moi qui est oublié de supprimer pour la déclaration de la variable Dim compteur As Byte

André, je vais te mettre à l'"amande" (dixit amende façon Marseille)....

Question: il faudrait peut-être envoyer un message box, lorsque les actions ont étés réalisés avec succès! ,ou par rapport au label14 sur l'uf1 dès que sa valeur est sur 0 événement change du label14 ou, carrément quitter le formulaire

Quitter le formulaire peut paraitre une bonne idée mais en pratique je pense que c'est mieux d'informer l'utilisateur. Peut être mettre cette instruction juste en dessous de la ligne Else: ComboBox2.Enabled = True

Msgbox "Toutes les actions sont réalisées"

merci en tout cas Dan ^^ sans toi, je n'aurai qu'effectuer un millième de ce que tu as réalisé

Pas de soucis. Avec plaisir.

Je me demande :
- si le bouton Annuler doit rester actif si le compteur est supérieur à 0. A réfléchir...
- quel est le but de la macro Private Sub ComboBox2_Exit

Je pense que à ce stade, Martin doit faire des tests pour valider ce qui a été fait.

Salut André et Dan,

Après un week-end sans plonger le nez dans Excel, j'ai pris note de vos messages et essais qui m'ont grandement aidé !

Dan, concernant tes questions :

Je me demande :

- si le bouton Annuler doit rester actif si le compteur est supérieur à 0. A réfléchir...

- quel est le but de la macro Private Sub ComboBox2_Exit

J'avais plutôt eu pour idée de permettre à l'utilisateur d'annuler mais d'effacer les lignes qu'il avait déjà saisies en cas d'annulation... à voir pour la pertinence.

Effectivement, au début j'avais créé la macro ComboBox2_Exit pour éviter que l'utilisateur puisse saisir un nombre d'artiste trop élevé mais il n'y a que très peu de chance que celui-ci dépasse les 5 donc je l'ai enlevée !

Je vous joins le fichier actualisé avec tous vos conseils pour information, et je travaille actuellement à fermer l'UF lorsque la saisie est terminée !

Je vous remercie encore une fois infiniment pour votre aide et votre temps, j'ai beaucoup appris sur cet exercice !

A très vite :)

Bonjour

Dans l'UF1, modifiez ce code pour simplifier

Private Sub CommandButtonAnnuler_Click()
' btn Annuler
If MsgBox("Voulez-vous vraiment annuler ?", vbYesNo + vbDefaultButton2, "Demande de confirmation") = vbYes Then Unload Me
'End If
End Sub

Le bouton NON sera actif par défaut

J'avais plutôt eu pour idée de permettre à l'utilisateur d'annuler mais d'effacer les lignes qu'il avait déjà saisies en cas d'annulation... à voir pour la pertinence.

C'est une bonne idée cela pourrait se faire. Dites ce que vous voulez.

je travaille actuellement à fermer l'UF lorsque la saisie est terminée !

Mettez un bouton FERMER avec l'instruction UNLOAD.ME

Cela fermera l'usf bien que là actuellement cela fait un peu double emploi avec ANNULER.

Super merci pour le conseil !

Concernant l'effacement les lignes déjà saisies, j'avais exploré une piste avec la fonction suivante :

Ws.Rows(L).Delete

Je cherche à l'adapter en prenant en compte le nombre de saisies grâce au compteur mais je ne trouve pas encore comment le tourner.

J'avais pensé au bouton "Quitter" aussi, j'essaie simplement de trouver le moyen de fermer l'UF à la fin de la saisie, peut être lorsque le compteur arrive à 0 ?

Merci et bonne journée :)

Je pense avoir trouvé la solution ! Voici un bout de code, qui a l'air de pas mal fonctionner pour cette utilisation :

Private Sub CommandButtonSuivant_Click()

Dim lig As Integer
Dim F As Worksheet
Dim i As Byte

On Error Resume Next
Select Case ComboBox1.ListIndex + 1
    Case Is = 1: Set F = Feuil1 'Janvier/Mars
    Case Is = 2: Set F = Feuil2 'Festival
    Case Is = 3: Set F = Feuil3 'Avril-Juil
    Case Is = 4: Set F = Feuil4 'Sept-Dec
End Select

For i = 4 To 9
   Controls("TextBox" & i).Value = Replace(Controls("TextBox" & i).Value, ",", ".")
Next

With F.ListObjects("Tableau" & ComboBox1.ListIndex + 1)
    If .ListRows.Count = 0 Then
        .ListRows.Add: lig = 1
    Else: .ListRows.Add: lig = .ListRows.Count
    End If
    .DataBodyRange.Item(lig, 1) = ComboBox3.Value 'evenement
    .DataBodyRange.Item(lig, 2) = CDate(TextBox1.Value) ', "dd/mm/yyyy") 'date
    .DataBodyRange.Item(lig, 3) = TextBox2.Value 'nom de l'artiste ou du groupe
    .DataBodyRange.Item(lig, 4) = TextBox3.Value 'multiligne [Commentaire/état des négociations]
    .DataBodyRange.Item(lig, 5) = ComboBox4.Value 'Combobox4  [Type de rémunération]
    .DataBodyRange.Item(lig, 6) = TextBox4.Value 'Montant de la rémunération
    .DataBodyRange.Item(lig, 7) = TextBox5.Value  'Frais de restauration
    .DataBodyRange.Item(lig, 8) = TextBox6.Value 'Frais de transport
    .DataBodyRange.Item(lig, 9) = TextBox7.Value 'Frais d'hébergement
    .DataBodyRange.Item(lig, 10) = TextBox8.Value 'Frais de catering
    .DataBodyRange.Item(lig, 11) = TextBox9.Value 'Frais de sécurité
End With

compteur = compteur - 1

If compteur = 0 Then
MsgBox "Toutes les actions ont été réalisées avec succès !"
Unload Me

ElseIf compteur > 0 Then
    ComboBox2.Enabled = False
    For i = 2 To 9
        Controls("TextBox" & i).Value = ""
    Next i
    ComboBox4.Value = ""

Else: ComboBox2.Enabled = True
' msgbox ajouter 19/02/2021
MsgBox "Toutes les actions ont été réalisées avec succès !"
    For i = 1 To 9
        On Error Resume Next
        Controls("TextBox" & i).Value = ""
        Controls("Combobox" & i).Value = ""
    Next i

End If

Label14 = compteur  ' ajouter 19/02/2021

End Sub

re

J'avais pensé au bouton "Quitter" aussi, j'essaie simplement de trouver le moyen de fermer l'UF à la fin de la saisie, peut être lorsque le compteur arrive à 0 ?

Non c'est pas une bonne idée car lorsque la dernière validation est faite pour le nombre de groupes prévu, l'UF1 se vide toute seul et reste active pour éviter de devoir réouvrir si il est nécessaire d'entrer de nouvelles données pour une autre événement.

Pour la suppression, il faudrait d'abord savoir en pratique ce qu'il peut se passer. Par exemple, on peut vouloir :
- Supprimer un événement qui est en train d'être encodé
- Supprimer l'événement qui est annulé
- Supprimer l'événement juste après avoir fini d'encoder (donc UF1 est vide)

Il me semble que j'opterais plutot pour une Userform spécifique qui rechercherait l'événement à annuler mais il faudrait sur base de quel critère on fait la recherche.

Une chose aussi plus générale, est-ce vous effacez des événements terminés; je suppose que non

Je pense avoir trouvé la solution !

Là vous fermer l'UF1 si le compteur est à 0, donc les instructions du bas après ELSE ne servent à rien. Cela ne me parait pas une bonne idée

Bonjour Dan,

Ah mince je n'avais pas pensé à ça...

Pour l'histoire de la fermeture de l'UF, il me semble que cela fonctionne bien comme ça pourtant, je ne comprends pas vraiment ce que vous entendez par :

Non c'est pas une bonne idée car lorsque la dernière validation est faite pour le nombre de groupes prévu, l'UF1 se vide toute seul et reste active pour éviter de devoir réouvrir si il est nécessaire d'entrer de nouvelles données pour une autre événement.

Là vous fermer l'UF1 si le compteur est à 0, donc les instructions du bas après ELSE ne servent à rien. Cela ne me parait pas une bonne idée

Car si le compteur est arrivé à 0, il n'y a plus de raison de laisser l'UF ouverte, si ?

Pour le bouton annuler, peut-être que je vais plutôt faire deux MsgBox, la première si aucune donnée n'a encore été saisie (= si l'utilisateur n'a pas encore appuyé sur le bouton "Suivant") qui dirait "Voulez-vous vraiment annuler ?" sans impact. La seconde informerait juste que des données ont quand même été saisies dans le tableau et qu'il faut les supprimer manuellement si cela ne convient pas. Je ne suis pas assez calé pour faire la solution que vous proposez.

Merci et bonne journée,

Martin

Car si le compteur est arrivé à 0, il n'y a plus de raison de laisser l'UF ouverte, si ?

Si justement, car imaginons que vous avez un autre événement à entrer pour une autre date. A quoi bon fermer automatiquement l'UF pour devoir la réouvrir pour entrer l'événement suivant.

Si vous voulez absolument fermer l'UF dès que le compteur est à 0, vous pouvez modifier la fin du code comme ceci

compteur = compteur - 1
If compteur > 0 Then
    ComboBox2.Enabled = False
    For i = 2 To 9
        Controls("TextBox" & i).Value = ""
    Next i
    ComboBox4.Value = ""

Else: 
    MsgBox "Toutes les actions sont réalisées"
    Unload Me
End If

label14 = compteur  ' ajouter 19/02/2021
End sub

D'autres possibilités sont possibles, comme par exemple sortir avec la macro Annuler.

Bonjour toutes et tous

merci Dan

j'ai pensé, mettre une temporisation Application.Wait de quelques 5 à 8 secondes par exemple, afin que, l'utilisateur décide vraiment, s'il souhaite faire la réinitialisation (ou bien, de laisser tel quel)

comme Dan tu le précises à la fin

par Dan: D'autres possibilités sont possibles, comme par exemple sortir avec la macro Annuler.

une idée qui m'est venu comme cela

crdlt,

André

Bonjour André

Temporisation : De mon coté, je n'aime pas trop les temporisations avec excel mais bon cela existe

Par rapport à ce que Martin dit :

Pour le bouton annuler, peut-être que je vais plutôt faire deux MsgBox, la première si aucune donnée n'a encore été saisie (= si l'utilisateur n'a pas encore appuyé sur le bouton "Suivant") qui dirait "Voulez-vous vraiment annuler ?" sans impact. La seconde informerait juste que des données ont quand même été saisies dans le tableau et qu'il faut les supprimer manuellement si cela ne convient pas. Je ne suis pas assez calé pour faire la solution que vous proposez.

Mettre un bouton ANNULER pour annuler une opération et un bouton QUITTER pour fermer tout sans impact.

Pour le bouton Quitter, il me semble que deux solutions peuvent être envisagées, soit on quitte sans avoir validé quoi que ce soit, soit on quitte après avoir tout entré. Cela impliquerait que le bouton Quitter ne serait actif que si on n'a pas validé quelque chose ou si le compteur est à 0.

Le bouton Annuler ne servirait qu'à annuler ce qui a été fait. Il faut bien réfléchir avant de faire le code.

Vous en pensez quoi ?

Rechercher des sujets similaires à "declencher userform fois valeur combobox"