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
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 SubBonjour 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.
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
C'est normal ! Car une variable de type Variant peut par définition accueillir tout type de données !Lanfeust a écrit :et je n'avais jamais rencontré de problèmes ... Bizarre.
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 Thenpar
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 StringSur quelle ligne ??!Lanfeust a écrit :"Erreur définie par l'application ou par l'objet"
ça ne marche pas ..
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 ??
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 SubAttention, 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 SubJe 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