Problème Boucle Optionbuttons avec variable sans UF

Bonjour à tous,

je poursuis mon projet vba, et je bute de nouveau sur un problème dont je ne trouve la solution nulle part sur le web.

Je souhaite effectuer une boucle sur un nombre d'optionbuttons variable. MAIS je n'utilise pas de UserForm, car j'ai disposé les optionbuttons directement dans les cellules de ma feuille(2), Colonne G.

Détails des variables utilisées :

  • "Cpt" compte le nombre de matchs de Hockey (importés via internet) disposés dans ma colonne B feuille 2.
  • "Var" m'indique à quelle ligne j'arrête ma boucle For (Cpt*2 car une ligne est sautée entre chaque match)
  • "ligne" m'indique à quelle ligne de la feuille apparait le 1er match
"n" est le nombre variable d'optionbuttons insérés ==> A chaque match va correspondre un optionbutton, placé en bout de ligne.

Le problème se situe au niveau du If, avec le ".Controls" qui n'est pas reconnu ... Je ne sais vraiment pas quoi inventer comme code pour que ça marche

Merci beaucoup pour votre aide !!

Private Sub CommandButton1_Click()
Dim Cote1, Cote2, Cote3 As String
Dim Eq1, Eq2 As String
Dim Cpt, Var, ligne, n As Integer
Dim OptionButton As Object

ligne = 10
    Cpt = Application.CountA(Range("B:B"))
    Var = 2 * Cpt + ligne - 1

For n = 1 To Var

   If Sheets(2).Controls("OptionButton" & n).Value = True Then
        'Sheets(2).OLEObjects ne marche pas non plus

    Eq1 = Sheets(2).Cells(ligne, 1).Value
    Eq2 = Sheets(2).Cells(ligne, 6).Value
    Cote1 = Sheets(2).Cells(ligne, 3).Value
    Cote2 = Sheets(2).Cells(ligne, 4).Value
    Cote3 = Sheets(2).Cells(ligne, 5).Value
    End If
    ligne = ligne + 1
Next

End Sub

Bonjour Lanfeust,

Tu peux joindre un fichier stp ? Ce serait plus facile pour nous.

Une remarque dans ta déclaration de variable.

En VBA, le type de chaque variable doit être explicitement déclaré. Le fait de les mettre sur la même ligne et écrire "Integer" à la fin ne les déclarera pas en Integer mais en Variant.

lanfeust

Merci beaucoup de t'être intéressé à mon cas !

Et merci également pour le schéma photo, je viens d'apprendre quelque chose, car dans mes cours vba je faisais comme ça et je n'avais jamais rencontré de problèmes ... Bizarre.

Les optionbuttons sont dans la feuille "Prochains Matchs", et le code correspondant est placé dans le Commandbutton "Go" feuille : Affiche du Jour.

Mon objectif : cliquer sur un bouton (=choisir un match), et importer les données du match (nom équipes + cotes) dans ma feuille "affiche du jour" pour ensuite sortir des analyses statistiques.

Si des choses ne sont pas claires, n'hésite pas à demander, je suis dispo pour y répondre

Lanfeust a écrit :

et je n'avais jamais rencontré de problèmes ... Bizarre.

C'est normal ! Car une variable de type Variant peut par définition accueillir tout type de données !

Variant est un type de données spécial pouvant contenir des données de toutes sortes, à l'exception des données de type String de longueur fixe

Une variable déclarée en Variant prend plus de place en mémoire.

Si tu connais à l'avance le type de données de ta variable, il vaudra mieux la déclarer en tant que tel comme tu l'as fait...mais avec la bonne syntaxe !!

Ensuite, il faut savoir que la collection Controls appartient à l'objet Userform, tu ne peux donc pas l'utiliser ici.

Dans ton cas, étant donné que c'est des contrôles ActiveX que tu as utilisés, c'est bien OLEObject qu'il faut utiliser.

Tu dis que tes optionbutton se trouve sur la feuille "Prochains matchs" qui correspond à la 3è feuille de ton classeur, je n'ai pas regardé ton code en détail mais remplace la ligne

If Sheets(2).Controls("OptionButton" & n).Value = True Then

par

If Sheets(3).OLEObjects("OptionButton" & n).Object.Value = True Then

"Erreur définie par l'application ou par l'objet"

ça ne marche pas ..

Par ailleurs j'ai déclaré les variables comme il faut ligne par ligne : integer pour les éléments de la boucle, single pour les valeurs cote et string pour les noms d'équipe.

Merci de ton aide car je bloque là dessus depuis hier soir, et je ne peux pas avancer le reste de mon projet si mes boutons ne marchent pas =/

Tu peux déclarer tes variables comme ceci :

Dim Cote1 As String, Cote2 As String, Cote3 As String
Lanfeust a écrit :

"Erreur définie par l'application ou par l'objet"

ça ne marche pas ..

Sur quelle ligne ??!

D'accord merci pour les variables.

Le problème vient toujours de la meme ligne pardi !

C'est la ligne du "If" ...

C'est parce que je n'arrive pas à reproduire l'erreur !

Fais attention à ce que ta variable n ne dépasse pas le nombre d'OptionButton, l'erreur vient peut-être de là.

C'est bien Sheets(3) et non Sheets(2) qu'il faut mettre n'est-ce pas ?

Tu as essayé directement sur mon fichier excel ?

Si oui, vérifie que des option boutons apparaissent dans la feuille 2 (prochains matchs), et qu'au moins un est coché.

"n" commence à 1, et va jusqu'à "Var", c'est à dire le nombre de matchs dans ma feuille 2. Tu regarderas, il y a bien 1 bouton par match. En l'occurrence dans mon cas précis, Il y a 4 matchs, donc Var = 4. Mais demain ça sera peut être 6 ou 7.

Donc non, ce n'est pas Sheets(3) mais ==> Sheets(2)

Je prie pour que tu trouves la solution .. =)

Je n'ai pas le même fichier ??

lanfeust2

Si j'ai bien compris le principe, ton code devrait donner quelque chose comme ça :

Private Sub CommandButton1_Click()
    Dim Cote1 As String, Cote2 As String, Cote3 As String
    Dim Eq1 As String, Eq2 As String
    Dim Cpt As Integer, Var As Integer, ligne As Integer, n As Integer
    'Dim OptionButton As Object

    With Sheets(3)
        ligne = 10
        Cpt = Application.CountA(.Range("B:B"))
        Var = 2 * Cpt + ligne - 1

        For n = 1 To Var

            If .OLEObjects("OptionButton" & n).Object.Value = True Then
                'Sheets(2).OLEObjects

                Eq1 = .Cells(ligne, 1).Value
                Eq2 = .Cells(ligne, 6).Value
                Cote1 = .Cells(ligne, 3).Value
                Cote2 = .Cells(ligne, 4).Value
                Cote3 = .Cells(ligne, 5).Value
            End If
            ligne = ligne + 1
        Next
    End With

End Sub

Attention, dans l'éditeur VBA, le nom d'objet de ton onglet "Prochains matchs" s'appelle Feuil2 mais n'est pas la 2è feuille du classeur !!

Dans le classeur, l'onglet des prochains matchs se trouve en 3è position. C'est pourquoi il faut mettre Sheets(3) et non Sheets(2) (si nous avons bien le même fichier bien entendu...)

Ah d'accord ! Je suis désolé, je pensais que Sheets "Index" faisait référence au n° de la feuille dans l'onglet propriétés ...

Donc oui du coup, si on considère simplement l'ordre des onglets, c'est bien Sheets(3) =)

Bon je me suis entièrement repenché sur mon code, puis ta solution ...

Hourra maintenant ça marche !! Mais avec des modifications apportées à ta solution, et à mon code (les fonctions if n'étaient pas les bonnes pour encadrer toutes les possibilités, et il fallait que je gère la variable ligne et numéro de bouton en meme temps, convenablement).

L'utilisation de la fonction With en précisant "Sheets(3)" n'a pas marché car ça faisait comme si j'étais dans la Sheets(1), là où est placé le Commandbutton et le Sub !! Et j'ai mis du temps à comprendre ce problème ... Idem pour mon Compteur de cellules remplies, je n'avais pas préciser la feuille, du coup il se basait sur les cellules de la Sheets(1) et pas 3 ...

Voici le bon code final :

Private Sub CommandButton1_Click()
Dim Cote1 As String, Cote2 As String, Cote3 As String
Dim Eq1 As String, Eq2 As String
Dim Cpt As Variant
Dim Var As Integer, ligne As Integer, n As Integer

    ligne = 10
    Cpt = Application.CountA(Sheets(3).Range("B:B"))
    Var = 2 * Cpt + ligne - 1
    n = 1
For ligne = 10 To Var

    If Sheets(3).OLEObjects("OptionButton" & n).Object.Value = False And Cells(ligne, 2).Value <> 0 Then
         n = n + 1
            ElseIf Sheets(3).Cells(ligne, 2).Value = 0 Then
            ligne = ligne
                ElseIf Sheets(3).OLEObjects("OptionButton" & n).Object.Value = True Then
                Eq1 = Sheets(3).Cells(ligne, 2).Value
                Eq2 = Sheets(3).Cells(ligne, 6).Value
                Cote1 = Sheets(3).Cells(ligne, 3).Value
                Cote2 = Sheets(3).Cells(ligne, 4).Value
                Cote3 = Sheets(3).Cells(ligne, 5).Value
                Exit For
    End If
Next ligne

Sheets("Affiche du jour").Range("B2").Value = Eq1
Sheets("Affiche du jour").Range("I2").Value = Eq2

End Sub

Je suis super content, maintenant tout marche comme je veux, je vais pouvoir continuer à remplir la feuille "affiche du jour" avec tout pleins de stats et de liens vers les autres onglets

Merci beaucoup pour le temps que tu as passé et pour ce que tu m'as appris !

A très bientôt

Rechercher des sujets similaires à "probleme boucle optionbuttons variable"