onix64
Messages postés23Date d'inscriptionvendredi 7 août 2009StatutMembreDernière intervention 7 août 2011
-
16 mai 2010 à 18:08
onix64
Messages postés23Date d'inscriptionvendredi 7 août 2009StatutMembreDernière intervention 7 août 2011
-
17 mai 2010 à 09:10
Voici mon bout de programme :
Private Sub cmdvaliderstats_Click()
Dim m As Integer
Dim n As Integer
Dim i As Integer
Dim nblign As Integer
Dim ligne As String
qqnr = FreeFile
qqr = FreeFile
For n = 0 To 13
If Optclubs(n).Value = True Then
Open IIf(Right(App.Path, 1) = "", App.Path, App.Path & "") & "\Données Rugby Top 14" & Optclubs(n).Caption & ".txt" For Input As #qqnr
' boucle pour compter le nombre de ligne du fichier
nblign = 0
Do While Not EOF(qqnr)
nblign = nblign + 1
Line Input #qqnr, ligne
Loop
Close #qqnr
For m = 1 To 4
qr = FreeFile
Open IIf(Right(App.Path, 1) = "", App.Path, App.Path & "") & "\Données Rugby Top 14\Composition joueur" & m & "_stats.txt" For Output As #qr
For i = 0 To nblign
If Lblindice(i).Caption = m Then
Print #qqr, Lblplayers(i).Caption
Print #qqr, Txtessais(i).Text
Print #qqr, Txtpieds(i).Text
End If
Next i
Close #qr
Next m
Else
End If
Next n
End Sub
Je vous explique : j'ai les noms des 14 clubs de rugby du TOP 14 dans des "Optclubs.value". Quand je clique sur l'un des OptionButton pour choisir un club j'ouvre un fichier texte qui a pour nom "nom du club choisi.txt" et qui contient les noms des joueurs de ce club.
J'ai ensuite des noms de joueurs (Lblplayers.caption) pris aléatoirement avec leurs statistiques (nombre d'essais Txtessais.txt et nombre de points aux pieds Txtpieds). Chacun de ses joueurs est affecté d'un indice (Lblindice) qui va de 1 à 4.
Ce programme ouvre donc ensuite un fichier texte "Composition joueur1_stats.txt" et y recopie tous les joueurs dont l'indice vaut 1 (Lblindice.caption=1) puis ouvre un fichier texte "Composition joueur2_stats.txt" et y recopie tous les joueurs dont l'indice vaut 2 (Lblindice.caption=2) et ainsi de suite jusqu'à 4.
Les boucles semblent marcher mais j'ai une erreur "Type Mismatch" sur la ligne "If Lblindice(i).Caption m Then". Est-ce le type de déclaration de "m" qui pose problème ? pourtant m 1 à 4 est bien un integer non ? Dois-je plutôt utiliser un Txtindice.text à la place d'un Lblindice.Caption ? Si vous avez des idées ? je sais pas pourquoi mais ça semble être tout simple comme problème.
Merci d'avance
A voir également:
Typemismatch
Visual basic type mismatch error 13 - Meilleures réponses
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 17 mai 2010 à 00:01
Re
Oui, Philippe734 te propose la meilleure solution pour imposer un type de conversion "générique" sans génération d'erreur : Si le contenu de ton Label n'est pas conforme à un chiffre, Val renverra 0 (alors que CInt provoquera une erreur programme)
'i' au moment de l'erreur : ce n'est pas compliqué à lire --> Ctrl-G puis ? i
Pendant que tu es dans la fenêtre de debug, demande à visualiser le contenu de ton Lblindice(i) avec
? Lblindice(i).Caption
Si la fenêtre de debug provoque elle aussi une erreur, c'est qu'il y a un problème sur le type du composant ...
+
Il y a encore une erreur ici :
Tu ouvres ton fichier sous le numéro qr :
... For Output As #qr
et tu écris avec l'identifiant qqr
Print #qqr, Lblplayers(i).Caption
Je te conseillerais vivement :
- Lancer ton application avec Ctrl-F5 et pas F5 tout seul --> Corriger toutes les erreurs mises en évidence.
Ctrl-F5 provoque une compilation complète alors que F5 n'analysera le programme qu'au moment où il passera dessus.
- Ajouter Option Explicit en t^te de chaque page de code --> Cela va t'obliger à dimensionner chacune de tes variables et ainsi éviter les erreurs entre qqr et qr
Cet Option Explicit peut être inséré dans chaque nouvelle page de code en réglant l'option "Déclaration obligatoire des variables"
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
onix64
Messages postés23Date d'inscriptionvendredi 7 août 2009StatutMembreDernière intervention 7 août 2011 16 mai 2010 à 18:34
Bonjour,
Désolé j'ai pas mis "bonjour" précédemment je m'en excuse. Je l'ai toujours mis dans mes précédents mails par ailleurs. J'avais déjà essayé la fonction "Cint" puisque j'ai déjà parcouru une bonne demi heure le forum au cas où le même problème existerait (comme le dit le règlement) et que j'ai trouvé des exemples de ce même message résolus avec "Cint". J'ai aussi utilisé d'autres exemples trouvés dans ce forum (comme le dit le règlement) mais sans réussite. C'est pourquoi je pose la question dans un nouveau message. Pour "Cint" ça fait la même erreur "Type Mismatch" et à la même ligne "If Cint(Lblindice(i).Caption) = m Then ".
onix64
Messages postés23Date d'inscriptionvendredi 7 août 2009StatutMembreDernière intervention 7 août 2011 16 mai 2010 à 20:54
Salut !
Que vaut 'i' au moment des faits ? Au moment des faits la valeur de i varie donc je pense que le problème viendrait de "m" mais j'en suis pas sûr. En fait, il semblerait que le programme m'affiche cette erreur quand "m" passe à 2 car le fichier "Composition joueur1_stats.txt" est créée et se remplit avec les noms des joueurs ayant pour Lblindice 1 puis le message arrive. Alors que quand les indices sont 1, 3 et 4 (cad les valeurs de "m") ça marche c'est plutôt bizarre. J'ai essayé d'écrire la boucle à la main avec m 1 puis m = 2 etc... mais c'est pareil donc il semblerait que le fait que "m" soit un chiffre le gêne.
Existe t-il un Label nommé Lblindice et portant cet Index ? Il existe bien un Label Lblindice portant cet Index.
Aurais-tu malencontreusement nommé une variable Lblindice comme le nom de tes Labels ? Non j'ai bien regardé je pense pas.
Tu te retrouves avec un double \\ après App.Path C'est vrai mais même avec un seul "" j'ai la même erreur.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 17 mai 2010 à 00:03
Rectif :
... Option Explicit peut être inséré automatiquement lors de la génération d'une nouvelle page de code ...
(si la page existe déjà, il te faudra le mettre toi même à la main)
onix64
Messages postés23Date d'inscriptionvendredi 7 août 2009StatutMembreDernière intervention 7 août 2011 17 mai 2010 à 09:10
Bonjour à tous!
J'ai trouvé d'où venait le problème grâce à vos indications. En fait, vous avez tous raison je m'explique :
La solution de Philippe734 ("If Val(Lblindice(i).Caption) = m Then") fonctionne et m'enlève l'erreur donc merci Philippe734 mais en fait ça me dit pas quel erreur j'ai faite dans mon code mais ça la corrige et fait en sorte que ça marche donc merci encore! je m'en souviendrai à l'avenir.
Ensuite grâce aux conseils de DARKSIDIOUS et de Jack, j'ai quand même voulu chercher où se situait le problème. Et oui, même quand ça marche je suis têtu je veux pas seulement résoudre le problème mais le comprendre pour éviter de le reproduire. En regardant la valeur de "i" au moment de l'erreur puis en regardant le contenu des lblindices j'ai trouvé.
En fait, j'ai en tout 33 Lblplayers (qui ont chacun leurs Lblindices) et que je rempli avec les noms de joueurs qui sont au nombre de nblign (nombre de ligne du fichier correspondant car un nom par ligne). Donc en fait il y a des Lblplayers qui restent vide quand nblign < 33 par conséquent les Lblindices correspondant sont vides eux-aussi et indiquent " ". C'est ce vide qui me renvoi le message d'erreur : en mettant zéro au lieu du vide tout marche nickel. C'est logique en y pensant mais je pensais que le vide était considéré comme valeur nulle.
Merci encore pour votre aide à tous et bonne continuation !