VBA Besoin d'aide

Résolu/Fermé
everythingflows - 4 janv. 2012 à 08:51
 everythingflows - 23 janv. 2012 à 09:07
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/

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 744
4 janv. 2012 à 09:25
Bonjour,
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
1
everythingflows
4 janv. 2012 à 09:37
Super ! Merci ! Je vais regarder cela de prêt ^^
0
everythingflows
4 janv. 2012 à 11:31
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 :
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
0
everythingflows
4 janv. 2012 à 12:17
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...) :

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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
everythingflows
4 janv. 2012 à 12:31
haha... Hum...

Bon nickel, ça marche maintenant. Merci beaucoup pour tes infos et ton temps !!!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
4 janv. 2012 à 12:55
pas de quoi.
Quand tu veux.
A+
0
everythingflows
4 janv. 2012 à 15:47
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 ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 :
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.
0
everythingflows
4 janv. 2012 à 16:02
Parfait ! Tout fonctionne ! Merci !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
4 janv. 2012 à 16:25
mais de rien!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
20 janv. 2012 à 08:25
Salut,
Je n'ai strictement rien compris à ta demande...
0
everythingflows
20 janv. 2012 à 17:30
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 :
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
0
everythingflows
22 janv. 2012 à 10:57
Ok, merci ! Je vais essayer cela demain au taf !
0
everythingflows
23 janv. 2012 à 08:38
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).
0
everythingflows
23 janv. 2012 à 09:07
J'ai trouvé une solution à mon problème. En tout cas, merci pour ton aide !
0