IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA-E]Depassement de capacité


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut [VBA-E]Depassement de capacité
    coucou,

    j'essaye d'ecrire un code de 2 facon différentes voici la premiere qui ne fonctionne pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Open NomFic For Input As #1    ' Ouvre le fichier.
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, TextLine        ' Lit la ligne dans la variable.
        Do While Trouve = False
            If (Mid(TextLine, i, 8) = "INDICBAT") Then
                stLu = TextLine
                Debug.Print "<" & stLu & ">"   
                Trouve = True
                Exit Do
            Else
                i = i + 1
            End If
        Loop
    Loop
    et voici la seconde qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Open NomFic For Input As #1    ' Ouvre le fichier.
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, TextLine        ' Lit la ligne dans la variable.
        For i = 1 To 200
            If (Mid(TextLine, i, 8) = "INDICBAT") Then
                stLu = TextLine
                Debug.Print "<" & stLu & ">"    ' Affiche dans la fenêtre Exécution.
            End If
        Next
    Loop
    pour le premier cas j'initialise mon i à 1 et mon Trouve à false et pourtant j'ai une erreur là :

    "depassement de capacité". Je comprend pas pourquoi, je voudrais utiliser le premeir cas car je ne sait pas combien de caractere a la ligne dans laquelle je cherche "indicbat"

    Une idée la dessus?

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Dans le premier cas, tu fais i = i + 1 et je suppose que tu ne sors jamais de ta boucle. Auquel cas, cela dépend de i... ou de sa déclaration.
    Reste à voir pourquoi tu ne sors pas de ta boucle mais là j'ai une idée.
    Plutôt que te l'exposer, comme ta solution ne me semble pas orthodoxe, plutôt que ton mid, j'utiliserais instr(TextLine,"INDICBAT") qui te donnerait la position de INDICBAT dans Textline
    En outre, une autre façon d'utiliser les boolean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Trouve = instr(TextLine,"INDICBAT") <> 0
    A+

  3. #3
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Citation Envoyé par Elstak
    coucou,

    j'essaye d'ecrire un code de 2 facon différentes voici la premiere qui ne fonctionne pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Open NomFic For Input As #1    ' Ouvre le fichier.
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, TextLine        ' Lit la ligne dans la variable.
        Do While Trouve = False
            If (Mid(TextLine, i, 8) = "INDICBAT") Then
                stLu = TextLine
                Debug.Print "<" & stLu & ">"   
                Trouve = True
                Exit Do
            Else
                i = i + 1
            End If
        Loop
    Loop
    et voici la seconde qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Open NomFic For Input As #1    ' Ouvre le fichier.
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, TextLine        ' Lit la ligne dans la variable.
        For i = 1 To 200
            If (Mid(TextLine, i, 8) = "INDICBAT") Then
                stLu = TextLine
                Debug.Print "<" & stLu & ">"    ' Affiche dans la fenêtre Exécution.
            End If
        Next
    Loop
    pour le premier cas j'initialise mon i à 1 et mon Trouve à false et pourtant j'ai une erreur là :

    "depassement de capacité". Je comprend pas pourquoi, je voudrais utiliser le premeir cas car je ne sait pas combien de caractere a la ligne dans laquelle je cherche "indicbat"

    Une idée la dessus?
    Salut,

    Alors le problème vient certainement du fait que tu dépasses la longueur de la ligne avec la première méthode... Et en plus tu as une boucle infinie car tu boucles toujours sur la même ligne tant que tu n'as pas trouvé "indicbat"... et si tu ne l'as pas sur la 1ère ligne : c'est rapé.

    La solution serait d'utiliser la fonction len pour calculer la longueur de la ligne que tu récupères.

    D'autre part, tu as de la chance de ne pas avoir d'erreur pour la 2ème méthode car c'est le même problème. Là tu dois avoir une ligne de plus de 208 caractères ... donc le code passe...

    Alors voilà un début de solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Open NomFic For Input As #1    ' Ouvre le fichier.
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, TextLine        ' Lit la ligne dans la variable.
        Do While Trouve = False
           If i+8<len(TextLine) Then 'Contrôle de non dépassement de la limite
                If (Mid(TextLine, i, 8) = "INDICBAT")Then
                    stLu = TextLine
                    Debug.Print "<" & stLu & ">"   
                    Trouve = True
                    Exit Do
                Else
                    i = i + 1
                End If
           Else
               Exit Do 'Sortie de la boucle pour commencer une nouvelle ligne
           End If
        Loop
    Loop
    +

    Théo

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Ok pour ta solution Théo

    à part un ptit truc que j'ai du rajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Open NomFic For Input As #1    ' Ouvre le fichier.
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, TextLine        ' Lit la ligne dans la variable.
        Do While Trouve = False
           If i + 8 < Len(TextLine) Then 'Contrôle de non dépassement de la limite
                If (Mid(TextLine, i, 8) = "INDICBAT") Then
                    stLu = TextLine
                    Debug.Print "<" & stLu & ">"
                    Trouve = True
                    Exit Do
                Else
                    i = i + 1
                End If
           Else
               Exit Do 'Sortie de la boucle pour commencer une nouvelle ligne
           End If
        Loop
        i = 1
    Loop
    le "i=1" sinon jaurai une petite question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If i + 8 < Len(TextLine) Then
    J'ai toujours du mal avec les < et les <= là y faut que la ligne fasse au moins 8 caracteres non? enfin qu'il y ai encore 8 caracteres apres le "i" donc j'aurais mis un <=

  5. #5
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Re,

    En y réfléchissant bien, je mettre plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if i+7 <= len(TextLine) Then
    car tu lis 8 caractères mais tout bien considéré c'est 1 caractère que tu repères et les 7 suivants... surtout il faut que ton i soit bien initialisé à 1.

    +

    Théo

  6. #6
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Et quand je pense qu'Ouskel'n'or a parfaitement répondu... et de façon simple et claire... j'en pleurerais !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Citation Envoyé par jmfmarques
    Et quand je pense qu'Ouskel'n'or a parfaitement répondu...
    Possible mais j'ai pas reussi à adapter ce qu'il m'a dit (ca bouclait )
    Et la solution de theo est en fait ce que je pensait faire à la base sauf que je l'avait mal ecrite

  8. #8
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    ça bouclait ?
    çà, alors !
    Inoui !
    ça remplaçait, au contraire, toute ta boucle de recherche à la ... et non seulement allégeait ton code, mais encore l'agilisait considérablement !
    Mais, ma foi... si tu passes par Tokyo pour aller de Paris à Asnières, c'est ton choix .......


    EDIT :
    Voilà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Open NomFic For Input As #1    ' Ouvre le fichier.
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, TextLine        ' Lit la ligne dans la variable.
         If (instr(TextLine, "INDICBAT") > 0 Then
             Debug.Print "<" & textline & ">"
               Trouve = True
           Exit Do
         End If
      Loop
    msgbox trouve & "   " & textline

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je m'absente un moment et qu'est-ce que je retrouve ? la pagaille ! Z'avez pas fini tous de vous tirer dans les pattes ? ? Oui, ma solution était la meilleure. Elle évitait une boucle et un test inutiles. Pas là peine d'en faire un placard.
    Maintenant, quand une chose n'est pas comprise, on demande.
    Ensuite, inutile d'être susceptible, on a tous notre façon de réagir.

    Erzatz,
    Ce que je donnais était le principe, tu pouvais tout de même essayer de comprendre mon code ou demander une explication.
    Bien que "je sois pas aussi bon que ça" tu sais que je vais généralement au bout de mes explications. Je vais finir par croire que tu n'as pas la souplesse d'esprit que je te prêtais

    Nos moutons
    Trouve = instr(TextLine, "INDICBAT") <> 0 ' = true si INDICBAT est trouvé dans TextLine
    Plus besoin de if ceci then cela, ici
    et la ligne suivante aurait été
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If trouve then exit do
    Pas besoin de connaître la longueur de la chaîne TextLine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Open NomFic For Input As #1    ' Ouvre le fichier.
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, TextLine        ' Lit la ligne dans la variable.
        Trouve = instr(TextLine, "INDICBAT") <> 0  'trouve si INDICBAT y est
        If trouve then Exit Do
     Loop
    illight,
    C'est sympa de vouloir aider. J'ai souvent proposé des solutions moins bonnes que celles proposées ensuite par d'autres (tels que SilkyRoad, bbil, jmfmarques, etc...) mais dans ces cas-là j'ai toujours adopté la meilleure. Y'a pas de déshonneur à faire ça et ça permet de progresser.

    Maintenant, pour les règlements de compte, passez de préférence par mp.
    Enfin, je préviens tout le monde que je vais faire le ménage et supprimerai tous les message ne traitant pas strictement le sujet qui nous occupe.

    Erzatz, tu dis

    A+

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    ok ouskel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Open NomFic For Input As #1    ' Ouvre le fichier.
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, TextLine        ' Lit la ligne dans la variable.
        Trouve = instr(TextLine, "INDICBAT") <> 0  'trouve si INDICBAT y est
        If trouve then Exit Do
    Loop
    ca fonctionne bien

    Pas besoin de connaître la longueur de la chaîne TextLine
    C'est justement ce que je voulais !
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VBA : depassement de capacité.
    Par Jeanluc17 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 06/03/2013, 12h24
  2. [VBA-E] erreur 1004 et depassement de capacité dans une boucle
    Par lio62 dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 11/02/2007, 13h37
  3. [VBA Excel] pb depassement de capacité
    Par DiverSIG dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/12/2006, 14h06
  4. [VB6] Hex(Double) - depassement de capacite
    Par SErhio dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 18/05/2005, 17h09
  5. depassement de capacité
    Par jpg dans le forum ASP
    Réponses: 2
    Dernier message: 19/08/2004, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo