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 :

Problème sur boucle


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Février 2014
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 319
    Points : 158
    Points
    158
    Par défaut Problème sur boucle
    Bonjour,

    je cherche a extraire des valeurs comprise entre 2 chaines.

    Mon souci est le suivant : actuellement il bloque sur le fait de ne pas trouver la balise de fin.

    Merci pour votre aide

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Dim DebutOu, FinOu
    Dim BaliseDebut, BaliseFin
    Dim RechercherDans, textRecupe
     
     
    For cp = 2 To 345
    Cells(cp, 13) = Trim(Cells(cp, 13))
     
    RechercherDans = Cells(cp, 13)
     
    BaliseDebut = "- Cause de l incident:"
    BaliseFin = " - Détailler"
    DebutOu = 1
     
    Do
        DebutOu = InStr(DebutOu, RechercherDans, BaliseDebut)
        If DebutOu = 0 Then Exit Do
     
        DebutOu = DebutOu + Len(BaliseDebut)
        FinOu = DebutOu
        FinOu = InStr(FinOu, RechercherDans, BaliseFin)
        Cells(cp, 5) = Mid(RechercherDans, DebutOu, FinOu - DebutOu)
        DebutOu = FinOu + Len(BaliseFin) ' pour passer à la suite
    Loop
     
     
    RechercheraDans = Cells(cp, 13)
     
    BaliseaDebut = "cadre de ce ticket:"
    BaliseaFin = "- FM :"
    DebutaOu = 1
     
    Do
        DebutaOu = InStr(DebutaOu, RechercheraDans, BaliseaDebut)
        If DebutaOu = 0 Then Exit Do
     
        DebutOu = DebutaOu + Len(BaliseaDebut)
        FinaOu = DebutaOu
        FianOu = InStr(FinaOu, RechercheraDans, BaliseaFin)
        Cells(cp, 6) = Mid(RechercheraDans, DebutaOu, FinaOu - DebutaOu)
        DebutaOu = FinaOu + Len(BaliseaFin) ' pour passer à la suite
    Loop
     
    If Cells(cp, 13) Like "*FM : OUI*" Then Cells(cp, 3) = "OUI"
    If Cells(cp, 13) Like "*FM : NON*" Then Cells(cp, 3) = "NON"
    If Cells(cp, 3) = "" Then Cells(cp, 3) = "-"
     
    Next

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    Tu pourrais peut-être simplement remplacer tes balises de début et de fin par du vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      Dim BaliseDeb As String, BaliseFin As String
      Dim Chaine As String
     
      BaliseDeb = "-Début:"
      BaliseFin = "-Fin"
     
      Chaine = "-Début:Hello World-Fin"
      Chaine = Replace(Replace(Chaine, BaliseDeb, ""), BaliseFin, "")
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre habitué
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Février 2014
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 319
    Points : 158
    Points
    158
    Par défaut
    je ne pense pas ma chaine serait plutot "bonjour ca va - début : test - FIN : test2 - FM OUI"

    Dans le cadre du remplacement, je ne vais pas avoir " test " comme resultat

    ce que je cherche a faire :

    mettre dans une colonne la valeur comprise entre " - debut :" et " -FIN :"
    mettre dans une colonne la valeur comprise entre " - FIN :" et " -FM :"
    mettre dans une colonne la valeur se trouvant après " -FIN :"

    Avec une valeur disant "A FAIRE" si une valeur est non trouvée

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Avant de modifier ton code, pourrais-tu expliquer ce que tu souhaites faires, avec un ou deux exemples?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre habitué
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Février 2014
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 319
    Points : 158
    Points
    158
    Par défaut
    le complement a été fait en parallele a ton dernier commentaire

  6. #6
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    Bonjour laurent27530,

    Avec ton exemple du Post3 :
    bonjour ca va - début : test - FIN : test2 - FM OUI

    mettre dans une colonne la valeur comprise entre " - debut :" et " -FIN :"
    c'est la chaine : test
    mettre dans une colonne la valeur comprise entre " - FIN :" et " -FM :"
    c'est la chaine test2
    mettre dans une colonne la valeur se trouvant après " -FIN :"
    je pense que c'est plutôt après "- FM" donc la chaine "OUI"


    Si c'est bien ça voila un code possible :
    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
    Sub test()
        Dim s$, t$(), sTempo$, s1$, s2$, s3$
        s = "bonjour ca va - début : test - FIN : test2 - FM OUI"
     
        sTempo = Split(s, "- début :")(1)
        s1 = Trim(Split(sTempo, "- FIN :")(0))
     
        sTempo = Split(s, "- FIN :")(1)
        s2 = Trim(Split(sTempo, "- FM")(0))
     
        sTempo = Split(s, "- FM")(1)
        s3 = Trim(sTempo)
     
        MsgBox s1 & vbCr & s2 & vbCr & s3
    End Subb
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  7. #7
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par laurent27530 Voir le message
    Mon souci est le suivant : actuellement il bloque sur le fait de ne pas trouver la balise de fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        FinOu = DebutOu
        FinOu = InStr(FinOu, RechercherDans, BaliseFin)
    Si l'on excepte le fait que ceci pourrait être simplifié en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        FinOu = InStr(DebutOu, RechercherDans, BaliseFin)
    [/QUOTE]
    Ta syntaxe est correcte.

    As-tu vérifié si ça ne pourrait pas venir d'une simple faute de frappe dans le texte de ton critère de recherche ou du contenu des cellules dans lesquelles tu cherches ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim DebutOu, FinOu
    Dim BaliseDebut, BaliseFin
    Dim RechercherDans, textRecupe
    Je te conseille aussi d'indiquer les type de variables dans les déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim DebutOu As Long, FinOu As Long
    Dim BaliseDebut As String, BaliseFin As String
    Dim RechercherDans As String, textRecupe As String
    Et déclare aussi les variables de ta seconde boucle.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Je suppose qu'il fallait comprendre

    mettre dans une colonne la valeur comprise entre " - debut :" et " -FIN :"
    mettre dans une colonne la valeur comprise entre " - FIN :" et " -FM :"
    mettre dans une colonne la valeur se trouvant après " -FM :"

    Vu que tu as le même traitement pour tes deux premières recherches, tu as intérêt à utiliser une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function RetourChaine(Chaine As String, Debut As String, Fin As String) As String
      Dim PosDebut As Integer
      Dim posfin As Integer
      Dim Result As String
     
      PosDebut = InStr(1, Chaine, Debut)
      If PosDebut <> 0 Then
        posfin = InStr(1, Chaine, Fin)
        Result = Mid(Chaine, PosDebut + Len(Debut), posfin - (PosDebut + Len(Debut)))
      Else
        Result = "A faire"
      End If
      RetourChaine = Result
    End Function
    EDIT: Code adapté pour tenir compte de la longueur de la chaine Debut.
    A toi d'adapter pour trouver ce qui se trouve après -FM :

    Complément: Travaillez TOUJOURS avec des fonctions que vous pouvez tester et essayez TOUJOURS de voir si un processus se répète. S'il se répète, créez une fonction et testez-là. Vous aurez du code beaucoup plus maintenable qu'en développant des procédures kilométriques impossibles à tester...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre habitué
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Février 2014
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 319
    Points : 158
    Points
    158
    Par défaut
    Merci ton code est plus simple mais je rencontre toujours mon probleme si s = "bonjour ca va - début : test "

    Le code est en erreur

  10. #10
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par laurent27530 Voir le message
    Merci ton code est plus simple mais je rencontre toujours mon probleme si s = "bonjour ca va - début : test "

    Le code est en erreur
    Le code de qui?

    Je viens d'adapter le mien pour que la fonction tienne compte du fait que la chaine de fin pourrait ne pas être trouvée
    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
    Function RetourChaine(Chaine As String, Debut As String, Fin As String) As String
      Dim PosDebut As Integer
      Dim posfin As Integer
      Dim Result As String
     
      PosDebut = InStr(1, Chaine, Debut)
      If PosDebut <> 0 Then
        posfin = InStr(1, Chaine, Fin)
        If posfin <> 0 Then
          Result = Mid(Chaine, PosDebut + Len(Debut), posfin - (PosDebut + Len(Debut)))
        Else
          Result = "A faire"
        End If
      Else
        Result = "A faire"
      End If
      RetourChaine = Result
    End Function
    C'est cela l'intérêt de travailler avec une fonction indépendante du reste du code. Tu la testes, la retestes et la reretestes encore. Lorsqu'elle est bonne, tu l'appelles dans ton code...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Problème sur boucle
    Par maf dans le forum R
    Réponses: 2
    Dernier message: 30/04/2014, 11h10
  2. [MySQL] Problème sur boucle WHILE
    Par t671 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 19/09/2012, 22h37
  3. [XL-2010] Problème sur boucle
    Par xdoreau dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 29/07/2011, 16h04
  4. [MySQL] Problème sur Boucle While après un LEFT JOIN
    Par matperino dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 28/05/2007, 17h43
  5. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55

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