VBA Besoin d'aide
Résolu
everythingflows
-
everythingflows -
everythingflows -
Bonjour,
Je souhaite utiliser Visual Basics pour mettre automatiquement des informations dans un tableau Excell. Comme indiqué dans l'image via le lien au bas du message, je souhaiterais choisir un site et en fonction du site, mettre automatiquement les notes (entre 1 et 5) sur chaque colonne et sur la ligne correspondante (encadré en rouge). Après plusieurs essais sans succès, je voudrais avoir des conseils pour l'écriture du code.
En vous remerciant par avance.
http://imageshack.us/photo/my-images/838/visualbasics.png/
Je souhaite utiliser Visual Basics pour mettre automatiquement des informations dans un tableau Excell. Comme indiqué dans l'image via le lien au bas du message, je souhaiterais choisir un site et en fonction du site, mettre automatiquement les notes (entre 1 et 5) sur chaque colonne et sur la ligne correspondante (encadré en rouge). Après plusieurs essais sans succès, je voudrais avoir des conseils pour l'écriture du code.
En vous remerciant par avance.
http://imageshack.us/photo/my-images/838/visualbasics.png/
7 réponses
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.
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
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 !!!
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 ?
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.
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.
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).