VB6 - Next sans For !?

Résolu
Fenril'Skanenruf -  
 Fenril'Skanenruf -
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. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
    1. Fenril'Skanenruf
       
      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
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    ajoute après
    Private Sub cmd1Generer_Click()

    Dim Tableau(1 to 26)
    0
    1. Fenril'Skanenruf
       
      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
  4. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. amigo
     
    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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
  7. amigo
     
    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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Oui mais passage est incrémenté de 1 à chaque incrémentation de la variable a. Donc pas de soucis.
      0
  8. amigo
     
    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
  9. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  10. Fenril'Skanenruf
     
    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