Boucle For Next limitée

Résolu
otermal
Messages postés
5
Date d'inscription
mardi 14 novembre 2006
Statut
Membre
Dernière intervention
15 novembre 2006
- 14 nov. 2006 à 20:30
otermal
Messages postés
5
Date d'inscription
mardi 14 novembre 2006
Statut
Membre
Dernière intervention
15 novembre 2006
- 15 nov. 2006 à 15:51
Salut à tous, et merci d'être là pour aider les autres (dont moi même) à se dépatouiller.


j'ai créé une boucle For Next avec une variable de type integer, cette boucle est supposée compter jusque 10000,
elle doit s'interrompre à la 1ere cellule vide soit la 7050 pour ce qui concerne mon test.
Or il s'avère qu'elle s'arrête à la cellule 6825 et donne comme message d'erreur 'Argument ou appel de procédure incorrect".
Je pense qu'il doit s'agir d'une définition de variable incorrecte, mais je pédalle plutôt dans le cirage.

Y aurait-il quelqu'un pour me dire où je foire?

Merci

13 réponses

JessicaR44
Messages postés
116
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
29 septembre 2013

14 nov. 2006 à 22:47
' identifie la position du characters correspondant au séparateur
For n = Debut To fin 'Step Saut
    Comptespace = Comptespace + 1
If Mid(LeTexte, n, 1) = Separateur Then
    Point1 = Comptespace - 4
    If Mid(LeTexte, Comptespace - 1, 1) = " " Or _
       ( Mid(LeTexte, Comptespace - 1, 1) > = "0" And _
       Mid(LeTexte, Comptespace - 1, 1) <= "9" ) Then
       present = 1
       Exit For
    End If
End If
Next n

Petite remarque en passant; c'est probablement pas à cause de ça que ça foire, mais perso, j'aurais ajouté une paire de parenthèses pour éviter toute équivoque. Sinon, ???
3
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
14 nov. 2006 à 23:06
Et essaye de remplacer ta boucle bleu par ce code :

Point1 = InStr (1, LeTexte, Separateur)
If Point1 > 4Then
If Mid(LeTexte, Point1 - 1, 1) = " "Or _
(Mid(LeTexte, Point1 - 1, 1) >= "0" And _
Mid(LeTexte, Point1 - 1, 1) < = "9") Then
Point1 = Point1 - 4
present = 1
Else
present = 0
End If
End If

Plus on peut éviter les boucles mieux c'est

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
15 nov. 2006 à 09:34
A ce moment là, tu peux commencer la recherche du séparateur à partir de 2eme ou 3eme caractère au lieu du premier, comme ça tu sautera le premier X de la chaine :

Point1 = InStr (2, LeTexte, Separateur)

---- Sevyc64  (alias Casy) ----<hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
14 nov. 2006 à 20:40
Désolé, panne de boule de cristal. Impossible de deviner

Le bout de ton code qui plante se déjà une aide précieuse pour espérer avoir ne serait-ce qu'un début de soupçon de piste à explorer.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0

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

Posez votre question
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
14 nov. 2006 à 20:45
Salut
En VB6, les Integer permettent des valeurs de -32768 à +32767, donc pas de problème de ce côté.
Il faudrait que tu nous copie/colle l'instruction sur laquelle il plante.
Fait l'essai d'exécuter une boucle simple sans rien entre le For et le Next entre 1 et 10000 et tu verras qu'il n'y a qucun problème.
A tout hasard, vérifie que les lignes de programmes entre le For et le Next ne modifie pas la valeur de la variable qui te sert dans la boucle, ça arrive de se tromper.
Tu parles de cellules ... tu travailles sous Excel ?
Dans ce cas, c'est du VBA, pas du VB6.
Pour rechercher la première cellule vide sous Excel, il existe des fonctions toutes faites (de mémoire).
Regarde aussi si la fonction que tu utilises entre le For et le Next acceptent des valeurs aussi grande, on ne sait jamais.
Une feuille Excel n'a pas un nombre de cellules illimité ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on
0
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
14 nov. 2006 à 20:48
Décidément, chaque fois que je parle de boule de crystal, tu arrive Jack.

Tu dois avoir des antennes c'est pas possible

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
Charles Racaud
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
14 nov. 2006 à 21:00
C'est grâce à sa boule de cristale. Elle lui indique tout sujet qui parle de cristale.
Et faut pas oublier qu'il champion pour ca.




__________________

Kenji
0
otermal
Messages postés
5
Date d'inscription
mardi 14 novembre 2006
Statut
Membre
Dernière intervention
15 novembre 2006

14 nov. 2006 à 21:03
Désolé, il s'agissait bien du VBA et d'Excel.


Voici ci dessous la sub qui pose problème, en l'abscence de la boucle en bleu, l'erreur n'apparaît pas :

Sub Extrait()


' Cette subroutine va balayer la 2ème colonne contenant la quantité de médicaments
' par emballage, séparé par le nom du médicament et le caractère "X",
' extraire 4 caractères avant le 'X', en soutirer le nombre,
' et l'écrire dans la colonne 7.


Dim LongTexte As Integer, n As Integer, Comptespace As Integer, LeTexte As String
Dim Debut As Integer, fin As Integer, Saut As Integer, Point1 As Integer
Dim chmp As Integer


' Définition du separateur
Separateur = "X"
For chmp = 2 To 10000 Step 1
' Détermine si le champ est le dernier donc vide
    If Workbooks("SAMY").Sheets("Triés").Cells(chmp, 2).Value = "" Then
        Exit For
    End If
  LeTexte = Workbooks("SAMY").Sheets("Triés").Cells(chmp, 2).Value
  LongTexte = Len(LeTexte)
 
' Détermine les bornes du texte examiné
Debut = 1
fin = LongTexte
Saut = 1
Comptespace = 0
present = 0



' identifie la position du characters correspondant au séparateur
For n = Debut To fin 'Step Saut
    Comptespace = Comptespace + 1
If Mid(LeTexte, n, 1) = Separateur Then
    Point1 = Comptespace - 4
    If Mid(LeTexte, Comptespace - 1, 1) = " " Or _
       Mid(LeTexte, Comptespace - 1, 1) >= "0" And _
       Mid(LeTexte, Comptespace - 1, 1) <= "9" Then
       present = 1
       Exit For
    End If
End If
Next n


If present = 1 Then
    qté = Mid(LeTexte, Point1, 4)
    For n = 1 To 4
        If Mid(qté, n, 1) >= "0" And _
           Mid(qté, n, 1) <= "9" Then
            Point2 = 4 - (n - 1)
            qté = Right(qté, Point2)
            Exit For
        End If
    Next n
    Workbooks("SAMY").Sheets("Triés").Cells(chmp, 7).Value = qté
End If
Next chmp
End Sub
0
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
14 nov. 2006 à 21:55
Et que te donne alors comme valeurs le debugger pour les varibles LeTexte, Comptespace et n ? (bon débujt)
0
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
14 nov. 2006 à 22:56
Le problème peut venir effectivement de la partie que tu a mis en bleu

Lorsque le séparateur est trouvé sur le tout premier caractère, Comptespace =1, or dans tes tests tu fais Mid(...,Comptespace-1,...), c'est à dire Mid(...,0,...). C'est déjà une première erreur.

Je regarde si j'en vois d'autre

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
otermal
Messages postés
5
Date d'inscription
mardi 14 novembre 2006
Statut
Membre
Dernière intervention
15 novembre 2006

15 nov. 2006 à 09:25
Merci encore,



Avec la proposition de "sevyc64", l'erreur disparraît.
Le compteur s'arrête tout de même à 6824, et c'est normal mon caractère séparateur, que je n'ai pas choisit, est le 'X' or à 6825 commence la lettre 'X' de ma liste, vous ne pouviez-pas le savoir.
Il faut que le test continue sur la 'string' tant que le séparateur n'est pas précédé ou suivit d'un espace ou d'un chiffre.

Mais vous n'êtes pas là pour résoudre tous mes problèmes, aussi je vais m'ateler à celà.

Et pour terminer sur une épanadiplose, encore merci.
0
otermal
Messages postés
5
Date d'inscription
mardi 14 novembre 2006
Statut
Membre
Dernière intervention
15 novembre 2006

15 nov. 2006 à 14:52
A Jessica R44, le rajout de ces parenthèses résoud bien le problème.






Otermal
0
otermal
Messages postés
5
Date d'inscription
mardi 14 novembre 2006
Statut
Membre
Dernière intervention
15 novembre 2006

15 nov. 2006 à 15:51
Effectivement en commencant par le 2 ème caractère, le test visite tout le tableau.

Bravo
0