VBA Besoin d'aide

Résolu
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

  1. Modérateur
    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. 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.
      1. Modérateur
        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
    2. 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
      1. Modérateur
        Tu m'étonnes Simone!!!
        Ubount n'existe pas... Il faut remplacer par Ubound avec un "d" comme dupont et dupond!!
    3. haha... Hum...

      Bon nickel, ça marche maintenant. Merci beaucoup pour tes infos et ton temps !!!
      1. Modérateur
        pas de quoi.
        Quand tu veux.
        A+
      2. 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 ?
      3. Modérateur
        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.
      4. Parfait ! Tout fonctionne ! Merci !
      5. Modérateur
        mais de rien!
    4. Modérateur
      Salut,
      Je n'ai strictement rien compris à ta demande...
      1. 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.
        1. Modérateur
          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
        2. Ok, merci ! Je vais essayer cela demain au taf !
        3. 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).
        4. J'ai trouvé une solution à mon problème. En tout cas, merci pour ton aide !