VB6 - Next sans For !?

Résolu/Fermé
Fenril'Skanenruf - 2 juil. 2008 à 22:17
 Fenril'Skanenruf - 3 juil. 2008 à 16:00
Bonjour,

J'ai un petit problème. Je pense que soit j'ai besoin de lunette soit c'est mon visual basic qui en a besoin.
Je possède un petit programme qui sert à générer aléatoirement des pseudonymes,
Le programme commence par attribuer à une variable tableau() une valeur généréee par Rnd() entre 0 et 26,
Puis le programme convertie selon un gros lot de condition cette valeur en lette (if tableau(a) = 1 then tableauLettre(a) = "a"...). Une fois cela fait, une dernière condition permet à l'ordinateur de revenir de deux cas en arrière pour vérifier si il en est à la 3ième consonne consécutive de retirer pour espérer une voyelle (dans le lot de condition j'attribue une variable tableau lettre() avec 1 pour un voyelle et 0 pour consonne).
Le tout est dans une simple boucle For...Next qui va de 1 à une valeur rentrée par l'utilisateur via un textbox.

Or, j'ai un petit problème. La boucle est ouverte en haut d'un gros sub et fermée en bas de celui ci... Or lors de l'exécution VB me previent par pop-up de ceci : "Next sans for" or les deux y sont !!
Voici la partie du code décrite :
Dim tableau(1 To 16) As Long
Dim tableauLettre(1 To 16) As String
Dim lettre(1 To 16) As Long

Private Sub cmd1Generer_Click()

If Val(txt1PrenomNbr) > 15 Then
 txt1Prenom.Text = "Euh, ça fait pas un peu beaucoup de lettre ça !?"
 Exit Sub
 End If
If Val(txt1PrenomNbr) < 3 Then
 txt1Prenom.Text = "Désolé mais ça ne fera pas asser pour un nom scandinave."
 Exit Sub
 End If
 
For a = 1 To Val(txt1PrenomNbr)

Randomize

10  tableau(a) = Rnd * 26
 If tableau(a) = 0 Then GoTo 10
 
If tableau(a) = 1 Then
 tableauLettre(a) = "a"
 lettre(a) = 0
If tableau(a) = 2 Then
 tableauLettre(a) = "b"
 lettre(a) = 1
If tableau(a) = 3 Then
 tableauLettre(a) = "c"
 lettre(a) = 1
If tableau(a) = 4 Then
 tableauLettre(a) = "d"
 lettre(a) = 1
If tableau(a) = 5 Then
 tableauLettre(a) = "e"
 lettre(a) = 0
If tableau(a) = 6 Then
 tableauLettre(a) = "f"
 lettre(a) = 1
If tableau(a) = 7 Then
 tableauLettre(a) = "g"
 lettre(a) = 1
If tableau(a) = 8 Then
 tableauLettre(a) = "h"
  lettre(a) = 1
If tableau(a) = 9 Then
 tableauLettre(a) = "i"
 lettre(a) = 0
If tableau(a) = 10 Then
 tableauLettre(a) = "j"
 lettre(a) = 1
If tableau(a) = 11 Then
 tableauLettre(a) = "k"
 lettre(a) = 1
If tableau(a) = 12 Then
 tableauLettre(a) = "l"
 lettre(a) = 1
If tableau(a) = 13 Then
 tableauLettre(a) = "m"
 lettre(a) = 1
If tableau(a) = 14 Then
 tableauLettre(a) = "n"
 lettre(a) = 1
If tableau(a) = 15 Then
 tableauLettre(a) = "o"
 lettre(a) = 0
If tableau(a) = 16 Then
 tableauLettre(a) = "p"
 lettre(a) = 1
If tableau(a) = 17 Then
 tableauLettre(a) = "q"
 lettre(a) = 1
If tableau(a) = 18 Then
 tableauLettre(a) = "r"
 lettre(a) = 1
If tableau(a) = 19 Then
 tableauLettre(a) = "s"
 lettre(a) = 1
If tableau(a) = 20 Then
 tableauLettre(a) = "t"
 lettre(a) = 1
If tableau(a) = 21 Then
 tableauLettre(a) = "u"
 lettre(a) = 0
If tableau(a) = 22 Then
 tableauLettre(a) = "v"
 lettre(a) = 1
If tableau(a) = 23 Then
 tableauLettre(a) = "w"
 lettre(a) = 1
If tableau(a) = 24 Then
 tableauLettre(a) = "x"
 lettre(a) = 1
If tableau(a) = 25 Then
 tableauLettre(a) = "y"
 lettre(a) = 0
If tableau(a) = 26 Then
 tableauLettre(a) = "z"
 lettre(a) = 1
 
passage = passage + 1
If passage = 2 Then
 If lettre(a - 1) And lettre(a - 2) And lettre(a) = 1 Then GoTo 10
 End If
 
txt1Prenom.Text = txt1Prenom & tableauLettre(a)
Next a

End Sub


Comprenez-vous quelque chose à ce problème ?
Merci beaucoup d'avance.
Cordialement, Fenril'Skanenruf.
A voir également:

9 réponses

lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
2 juil. 2008 à 22:22
Bonjour,
Tout tes If sont sans End IF

If tableau(a) = 26 Then
tableauLettre(a) = "z"
lettre(a) = 1
End IF
Mais vu le code tu ferais mieux d'employer un Select Case
A+
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
2 juil. 2008 à 22:56
Salut

Ca fait bien longtemps que j'ai pas fait de VB, mais il me semble que tu peux faire beaucoup plus court lol.
Du genre :
 tableauLettre(a) = chr(asc("a")+tableau(a)-1)
Select case tableau(a)
Case 1,5,9,15,21,25
      lettre(a)=0
Case else
      lettre(a)=1
End select
0
Fenril'Skanenruf
3 juil. 2008 à 11:46
Bonjour à tous les deux,

Merci beaucoup pour vos réponses, j'ai commencé par remettre les end if en fin de bloc, puis en fait j'ai utilisé ton code fiddy pour transposer en Select Case. Ca marche mais j'ai encore un problème que je n'arrive pas à comprendre.

voici le sub :
Private Sub cmd1Generer_Click()

txt1Prenom.Text = ""
passage = 0

If Val(txt1PrenomNbr) > 15 Then
 txt1Prenom.Text = "Euh, ça fait pas un peu beaucoup de lettre ça !?"
 Exit Sub
 End If
If Val(txt1PrenomNbr) < 3 Then
 txt1Prenom.Text = "Désolé mais ça ne fera pas asser pour un nom scandinave."
 Exit Sub
 End If
 
For a = 1 To Val(txt1PrenomNbr)
10  tableau(a) = Rnd * 26
 If tableau(a) = 0 Then GoTo 10

tableauLettre(a) = Chr(Asc("a") + tableau(a) - 1)
Select Case tableau(a)
Case 1, 5, 9, 15, 21, 25
      lettre(a) = 0
Case Else
      lettre(a) = 1
End Select

passage = passage + 1
If passage > 2 Then
 If lettre(a - 1) & lettre(a - 2) & lettre(a) = 1 Then GoTo 10
 End If
 
txt1Prenom.Text = txt1Prenom & tableauLettre(a)

Next a

End Sub


Au second clic sur le bouton cmdGenerer, l'ordinateur prend en compte la dernière condition et il plante dessus.
If lettre(a - 1) & lettre(a - 2) & lettre(a) = 1 Then GoTo 10
il surligne cette ligne en me parlant d'indice en dehors de la plage.

Je voulais savoir comment faire pour que si les deux lettres précédentes + la lettres tirée actuellement sont des consonnes de retirer une lettre et de rejouer l'opération en attendant que cela soit une voyelle.

Pouvez-vous m'aider encore ?
Merci beaucoup d'avance.

PS.
Ce programme servira à tirer aléatoirement de spseudonyme et la fin qui bug actuellement servira à éviter les noms avec 3 consonnes de suite.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
3 juil. 2008 à 12:17
ajoute après
Private Sub cmd1Generer_Click()

Dim Tableau(1 to 26)
0
Fenril'Skanenruf
3 juil. 2008 à 13:37
Non la condition ne marche pas j'ai des rendus avec plus de 2 consonnes alignées.
Je crois que tu confonds, le tableau ne doit pas aller jusqu'à 26 mais jqu'à 16 car c'est le "a".
26 c'est la table de caractère, 16 c'est le nombre maximum de caractère et par conséquent la boucle.
Mais j'avais oublié de copier la déclaration des variables :

Dim Tableau(1 To 16) As Long
Dim tableauLettre(1 To 16) As String
Dim lettre(1 To 16) As Long
Dim passage As Integer

Private Sub cmd1Generer_Click()

txt1Prenom.Text = ""
passage = 0

If Val(txt1PrenomNbr) > 15 Then
 txt1Prenom.Text = "Euh, ça fait pas un peu beaucoup de lettre ça !?"
 Exit Sub
 End If
If Val(txt1PrenomNbr) < 3 Then
 txt1Prenom.Text = "Désolé mais ça ne fera pas asser pour un nom scandinave."
 Exit Sub
 End If
 
For a = 1 To Val(txt1PrenomNbr)
10  Tableau(a) = Rnd * 26
 If Tableau(a) = 0 Then GoTo 10

tableauLettre(a) = Chr(Asc("a") + Tableau(a) - 1)
Select Case Tableau(a)
Case 1, 5, 9, 15, 21, 25
      lettre(a) = 0
Case Else
      lettre(a) = 1
End Select

passage = passage + 1
If passage > 2 Then
 If lettre(a - 1) & lettre(a - 2) & lettre(a) = 1 Then GoTo 10
 End If
 
txt1Prenom.Text = txt1Prenom & tableauLettre(a)

Next a

End Sub



Une autre idée ?
Merci quand même ^^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 juil. 2008 à 13:45
Re,

Pourquoi Val(txtPrenomNbr) ? C'est pas plutôt la longueur que tu souhaites avoir ? => Fonction len
Ensuite Ta variable "passage" est inutile. Pourquoi ne ferais-tu pas le contrôle sur la variable a ? If a > 2 Then

Cdt
0

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

Posez votre question
Bonjour,

Tu as déclaré
Dim lettre(1 To 16) As Long

Donc les indices du tableau lettre() doivent etre dans l'intervalle 1 à 16
or si a=1

If lettre(a - 1) & lettre(a - 2) & lettre(a) = 1 Then GoTo 10

serait équivalent à

If lettre(0) & lettre(-1) & lettre(1) = 1 Then GoTo 10

Les indices du tableau sont en dehrs de la plage.

De plus, l'opérateur & sert a à concatener les valeurs texte de plusieurs expressions, à ne pas confondre avec l'opérateur logique AND.
If lettre(a - 1) AND lettre(a - 2) AND lettre(a) = 1 Then GoTo 10


Salut
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 juil. 2008 à 13:52
Salut,

Bien vu pour & au lieu de AND. Par contre, il ne va pas avoir de problème d'indices négatifs grâce à sa variable passage. ^^

Cdt
0
Re,

La variable passage est initialisée à 0 puis incréméntée de 1 à chaque tour.
Donc pour passage = 3 le test est exécuté, et si a < 3 alors ERREUR

A+.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 juil. 2008 à 14:14
Oui mais passage est incrémenté de 1 à chaque incrémentation de la variable a. Donc pas de soucis.
0
RE,

Possible, j'ai du mal à suivre l'exécution du code, il faudrait afficher le valeur de a à chaque tour de boucle.

En tout cas le message d'erreur est bien explicite, à un momment donné l'indice du tableau inferieur à 1 ou supérieur à 16.

A+.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 juil. 2008 à 14:50
Oui, je suis d'accord avec toi. Le message est explicite. Mais en lisant le code, je pense que la variable "a" ne prend pas de valeurs négatives ou nulles, mais qu'il passera par une valeur supérieure à 16. Et ceci est probablement dû à l'utilisation de la fonction Val au lieu de len. A voir.
C'est vrai qu'un joli breakpoint serait idéal :p.
0
Fenril'Skanenruf
3 juil. 2008 à 16:00
Bonjour,

Merci beaucoup à tous pour vos aides éfficaces et rapides.
Mon problème est reglé et mon code à divisé de volume.
Le sujet est [Résolu].

Merci.
0