VBA Besoin d'aide
Résolu/Fermé
A voir également:
- VBA Besoin d'aide
- Mkdir vba ✓ - Forum VB / VBA
- Excel compter cellule couleur sans vba - Guide
- Vba range avec variable ✓ - Forum VB / VBA
- L'indice n'appartient pas à la sélection vba ✓ - Forum Programmation
- Autofill vba ✓ - Forum Excel
7 réponses
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
4 janv. 2012 à 09:25
4 janv. 2012 à 09:25
Bonjour,
Regarde ce fichier exemple
Le code de l'userform :
Cordialement,
Franck P
Regarde ce fichier exemple
Le code de l'userform :
Option Explicit Private Sub CommandButton1_Click() 'BOUTON VALIDER Dim trouve As Range Dim Notes() As Integer, i As Integer Dim Ctrl As Control 'on teste d'abord si les listes sont bien remplies : If ComboBox1 = "" Or ComboBox2 = "" Then Exit Sub 'remplissage 'on remplit la variable tableau Notes avec les valeurs des optionbutton For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.OptionButton Then If Ctrl.Value = True Then ReDim Preserve Notes(i) Notes(i) = Ctrl.Caption i = i + 1 End If End If Next 'restitution 'on cherche le contenu de la liste des noms dans la colonne 1 feuil1 : With Sheets("Feuil1") Set trouve = .Columns(1).Cells.Find(ComboBox1) If trouve Is Nothing Then MsgBox "Impossible n'est pas Français!" Else For i = 0 To UBound(Notes) trouve.Offset(0, 2 + i) = Notes(i) Next End If End With '-------- On "vide" les boutons d'options ----- For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.OptionButton Then Ctrl.Value = False End If Next '--------- On remets à zéro les listes sans effacer leur contenu ComboBox1 = "" ComboBox2 = "" End Sub Private Sub CommandButton2_Click() 'BOUTON FIN End End Sub Private Sub UserForm_Initialize() 'A L'INITIALISATION DE L'USERFORM Dim Ctrl As Control '-------- On "vide" les boutons d'options ----- For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.OptionButton Then Ctrl.Value = False End If Next '-------- on remplit les listes : -------- 'le 1er 1 pour ComboBox1, 'le second 1 pour le numéro de colonne utilisé pour le remplissage '"Feuil1" est bien sur le nom de la feuille ou sont les données de remplissage Call RempliMaListe(1, 1, "Feuil1") 'le 1er 2 pour ComboBox2 'le second 2 pour le numéro de colonne utilisé pour le remplissage Call RempliMaListe(2, 2, "Feuil1") End Sub Sub RempliMaListe(Indic As Integer, Colonn As Integer, NomFeuil As String) 'PROCEDURE DE REMPLISSAGE DE LISTE Dim Lig As Long, DrLig As Long Me.Controls("ComboBox" & Indic).Clear With Sheets(NomFeuil) DrLig = .Columns(Colonn).Find("*", , , , xlByColumns, xlPrevious).Row For Lig = 2 To DrLig '2 à modifier si pas de ligne d'entête Me.Controls("ComboBox" & Indic).AddItem .Cells(Lig, Colonn) Next End With End Sub--
Cordialement,
Franck P
Je voulais savoir à quoi correspond "Notes" dans le code ? Il s'agit d'une sélection de cellules dans Excel qui est nommée "Notes" ?
Car quand je teste, il me me surligne UBount(Notes) et met Sub ou fonction non défini.
Car quand je teste, il me me surligne UBount(Notes) et met Sub ou fonction non défini.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
Modifié par pijaku le 4/01/2012 à 11:47
Modifié par pijaku le 4/01/2012 à 11:47
Notes() est une variable tableau. Le message d'erreur que tu obtiens est du au fait que cette variable est vide, ne contient aucun élément.
Pour remplir une variable tableau, on procède comme ceci :
notes(0) = "truc"
notes(1) = "bidule"
notes(2) = "machin"
Dans ton cas, on la remplit selon le "caption" du bouton d'option qui est sélectionné.
En gros si tu as 5 bouton d'option sélectionnés :
Notes(0) = OptionButton3.Caption
Notes(1) = OptionButton7.Caption
etc...
Notes(4) = OptionButton22.Caption
Que j'ai traduit dans la macro par :
Traduction en "français" de ce code :
Par conséquent, si aucun OptionButton n'est sélectionné, le code plante.
Remplace donc, dans la procédure, le remplissage :
A REMPLACER PAR :
Pour remplir une variable tableau, on procède comme ceci :
notes(0) = "truc"
notes(1) = "bidule"
notes(2) = "machin"
Dans ton cas, on la remplit selon le "caption" du bouton d'option qui est sélectionné.
En gros si tu as 5 bouton d'option sélectionnés :
Notes(0) = OptionButton3.Caption
Notes(1) = OptionButton7.Caption
etc...
Notes(4) = OptionButton22.Caption
Que j'ai traduit dans la macro par :
For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.OptionButton Then If Ctrl.Value = True Then ReDim Preserve Notes(i) Notes(i) = Ctrl.Caption i = i + 1 End If End If Next
Traduction en "français" de ce code :
Pour tous les contrôles contenus dans l' userform : Si c'est un bouton d'option Si sa valeur est true (donc s'il est sélectionné) Je redimensionne et sauvegarde ma variable tableau Notes Notes(i) = valeur du caption de mon bouton d'option (pour toi 1, 2, 3, 4 ou 5) indice suivant me permet d'augmenter ma variable tableau le cas échéant Fin du test si valeur true Fin du test si bouton d'option Contrôle suivant
Par conséquent, si aucun OptionButton n'est sélectionné, le code plante.
Remplace donc, dans la procédure, le remplissage :
'remplissage 'on remplit la variable tableau Notes avec les valeurs des optionbutton For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.OptionButton Then If Ctrl.Value = True Then ReDim Preserve Notes(i) Notes(i) = Ctrl.Caption i = i + 1 End If End If Next
A REMPLACER PAR :
'remplissage 'on remplit la variable tableau Notes avec les valeurs des optionbutton Dim test as Boolean test = false For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.OptionButton Then If Ctrl.Value = True Then ReDim Preserve Notes(i) Notes(i) = Ctrl.Caption i = i + 1 test = true End If End If Next If test = false Then MsgBox "Aucun bouton d'option n'a été sélectionné. Arrêt de la procédure." Exit Sub End If
J'ai fait le changement mais j'ai toujours le même problème. Il me surligne UBount et met sub ou fonction non défini.
Voici le code que j'ai mis (j'ai certainement fait trop de copier coller sans forcément m'adapter comme il faut...) :
Voici le code que j'ai mis (j'ai certainement fait trop de copier coller sans forcément m'adapter comme il faut...) :
Private Sub CommandButton1_Click() Dim trouve As Range Dim Notes() As Integer, i As Integer Dim Ctrl As Control If ComboBox1 = "" Or ComboBox2 = "" Then Exit Sub Dim test As Boolean test = False For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.OptionButton Then If Ctrl.Value = True Then ReDim Preserve Notes(i) Notes(i) = Ctrl.Caption i = i + 1 test = True End If End If Next If test = False Then MsgBox "Aucun bouton d'option n'a été sélectionné. Arrêt de la procédure." Exit Sub End If With Sheets("Feuil5") Set trouve = .Columns(1).Cells.Find(ComboBox1) If trouve Is Nothing Then MsgBox "Non correct" Else For i = 0 To UBount(Notes) trouve.Offset(0, 2 + i) = Notes(i) Next End If End With For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.OptionButton Then Ctrl.Value = False End If Next ComboBox1 = "" ComboBox2 = "" End Sub Private Sub CommandButton2_Click() End End Sub Private Sub UserForm1_Initialize() Dim Ctrl As Control For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.OptioButton Then Ctrl.Value = False End If Next Call RempliMaListe(1, 1, "Feuil5") Call RempliMaListe(2, 2, "Feuil5") End Sub Sub RempliMaListe(Indic As Integer, Colonn As Integer, NomFeuil As String) Dim Lig As Long, DrLig As Long Me.Controls("ComboBox" & Indic).Clear With Sheets(NomFeuil) DrLig = .Columns(Colonn).Find("*", , , , xlByColumns, xlPrevious).Row For Lig = 2 To DrLig Me.Controls("ComboBox" & Indic).AddItem .Cells(Lig, Colonn) Next End With End Sub
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
4 janv. 2012 à 12:22
4 janv. 2012 à 12:22
Tu m'étonnes Simone!!!
Ubount n'existe pas... Il faut remplacer par Ubound avec un "d" comme dupont et dupond!!
Ubount n'existe pas... Il faut remplacer par Ubound avec un "d" comme dupont et dupond!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
haha... Hum...
Bon nickel, ça marche maintenant. Merci beaucoup pour tes infos et ton temps !!!
Bon nickel, ça marche maintenant. Merci beaucoup pour tes infos et ton temps !!!
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
4 janv. 2012 à 12:55
4 janv. 2012 à 12:55
pas de quoi.
Quand tu veux.
A+
Quand tu veux.
A+
En fait, j'aurais une autre question (encore...). En faisant le test sur visual basic, tout fonctionne très bien et les notes sont intégrées dans le tableau Excel. Par contre, j'ai voulu créer un bouton de commande sur la feuille Excel pour faire apparaitre le formulaire directement. Cependant, pour faire le lien avec la macro, cela ne fonctionne pas. Je ne retrouve aucune Macro enregistrer quand je me trouve à vouloir affecter une macro.
Comment est-ce possible ?
Comment est-ce possible ?
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
4 janv. 2012 à 15:55
4 janv. 2012 à 15:55
Il faut insérer un bouton à partir de la barre d'outils "boite à outils controle", pas "formulaire". Une fois ce bouton déssiné, doucle clic dessus et dans le code du bouton tu ajoutes :
Il me semble que je l'ai fait dans l'exemple, sauf que dans cet exemple j'ai mis un "label" dans la feuille au lieu d'un "CommandButton"... Mais c'est la même démarche.
Load UserForm1 UserForm1.Show
Il me semble que je l'ai fait dans l'exemple, sauf que dans cet exemple j'ai mis un "label" dans la feuille au lieu d'un "CommandButton"... Mais c'est la même démarche.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
4 janv. 2012 à 16:25
4 janv. 2012 à 16:25
mais de rien!
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
20 janv. 2012 à 08:25
20 janv. 2012 à 08:25
Salut,
Je n'ai strictement rien compris à ta demande...
Je n'ai strictement rien compris à ta demande...
Salut,
Je reprends. C'est vrai que ce n'était pas assez clair.
Dans le formulaire qui est un questionnaire comme montré en haut de page, j'ai les valeurs 1 à 5 pour donner une note de satisfaction. Quand je sélectionne 4, le nombre 4 s'inscrit dans la colonne correspondante en fonction de l'adresse sélectionnée. Cependant, je souhaiterais ajouter la valeur NA pour non concerné. Du coup, je souhaiterais que le mot NA s'inscrive dans la cellule. Lorsque je rajoute le point NA à la suite des points qui vont de 1 à 5, cela ne fonctionne pas quand je lance l'opération.
Je reprends. C'est vrai que ce n'était pas assez clair.
Dans le formulaire qui est un questionnaire comme montré en haut de page, j'ai les valeurs 1 à 5 pour donner une note de satisfaction. Quand je sélectionne 4, le nombre 4 s'inscrit dans la colonne correspondante en fonction de l'adresse sélectionnée. Cependant, je souhaiterais ajouter la valeur NA pour non concerné. Du coup, je souhaiterais que le mot NA s'inscrive dans la cellule. Lorsque je rajoute le point NA à la suite des points qui vont de 1 à 5, cela ne fonctionne pas quand je lance l'opération.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
21 janv. 2012 à 09:23
21 janv. 2012 à 09:23
OK. Tu ajoutes une note qui n'est pas numérique, mais du texte.
Alors essaie de modifier la déclaration des variables :
à remplacer par :
Alors essaie de modifier la déclaration des variables :
Dim trouve As Range Dim Notes() As Integer, i As Integer Dim Ctrl As Control
à remplacer par :
Dim trouve As Range Dim Notes(), i As Integer Dim Ctrl As Control
Ok, j'ai essayé et cela marche ! Merci ! Par contre, ce qui est bizarre, c'est l'odre dans lequel les points sont mis dans le tableau excel. Par exemple, dés que je met NA, que ce soit la première, troisième ou dernière question du formulaire. La valeur NA se met automatiquement sur les dernières colonnes du tableau. Je souhaiterias que la valeur se mette au niveau de la colonne qui lui correspond (cf, image de mon premier message).