VB6 - Next sans For !?

Résolu
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.
Configuration: Windows XP
Internet Explorer 6.0

9 réponses

  1. Contributeur
    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+
    1. Contributeur
      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
      
      1. 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.
    2. Contributeur
      ajoute après
      Private Sub cmd1Generer_Click()

      Dim Tableau(1 to 26)
      1. 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 ^^
    3. Contributeur
      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
      1. 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
        1. Contributeur
          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
      2. 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+.
        1. Contributeur
          Oui mais passage est incrémenté de 1 à chaque incrémentation de la variable a. Donc pas de soucis.
      3. 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+.
        1. Contributeur
          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.
          1. 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.