Excel vba recherche

Résolu
Bonjour,

voila j'ai une chaine de caractere et je souhaiterais créer une fonction qui me permet de recuperer quelques données

voila ma chaine de caractere

[test,"id":"12345","name":"données1","lead","name":"xxxx",test,"id":"12345","name":"données2","lead","name":"yyyy",test,"id":"12345","name":"données3","lead","name":"zzzzz"]

mon but est de recuperer ce qu'il se trouve entre lead et name donc donnée1,données2,donnée3.

et construire un tableau dans lequel je trouve :
donnée1
donnée2
donnée3

merci de votre aide

Cordialement

13 réponses

  1. Contributeur
    Salut le forum

    A tester
    Option Explicit
    
    Sub Extraire()
    Dim i As Byte, Lig As Byte
    Dim Chaine As Variant
    
        Chaine = Split(Replace([A1], """", ""), "name:")
        Lig = 2
        For i = 0 To UBound(Chaine)
            If InStr(Chaine(i), "lead") Then
                Cells(Lig, 1) = Split(Chaine(i), ",")(0)
                Lig = Lig + 1
            End If
        Next i
        
    End Sub
    

    Mytå
    3
    1. Salut,
      C'est pas exactement le même souci que dans ce sujet ?
      La même solution fonctionne avec le même problème...
      0
      1. Bonjour et merci de votre aide
        non c'est pas excatement ca, ce que je cherche la, c'est un code qui me permet d'extraire une chaine de caratere entre deux chaine de caractere, ici c'est donnée1 qui est entre lead et name.

        merci de votre aide

        Cordialement
        0
        1. Bonjour,

          Un exemple en VBA (donnees1, etc ne sont peut-etre pas de longueurs fixes)

          Sub rechchaine()
            '123456789012345678901234567890123456789
            '[test,"id":"12345","name":"données1","lead","name":"xxxx",test,"id":"12345","name":"données2","lead","name":"yyyy",test,"id":"12345","name":"données3","lead","name":"zzzzz"]
          
          
            Entete = "5" & Chr(34) & "," & Chr(34) & "name"
            Suffix = "lead"
            chaine = Worksheets("feuil2").Range("A1")
            
            y = InStr(1, chaine, Entete) + 11
            x = InStr(1, chaine, Suffix) - 3
            D1 = Mid(chaine, y, x - y)
            
            y = InStr(x + 6, chaine, Entete) + 11
            a = InStr(x + 6, chaine, Suffix) - 3
            D2 = Mid(chaine, y, a - y)
          
            y = InStr(a + 6, chaine, Entete) + 11
            b = InStr(a + 6, chaine, Suffix) - 3
            D3 = Mid(chaine, y, b - y)
            
          End Sub
          


          L'exemple de Morgothal peut etre modifie de meme, si le coeur lui en dit

          Bonne suite
          0
          1. Salut,
            Le coeur m'en dit volontiers, je suis en train de voir ;)
            Cependant, dans ton code il faut que l'ID finisse toujours par "5" ?
            0
          2. Re,
            Eh Oui, des fois l'arbre cache la foret.......!!
            Merci
            0
        2. Bonjour et merci de ton aide

          je vais essai et l'adapter a mon cas

          merci

          cordialement
          0
          1. Cette macro fonctionne également :

            Sub recherchedechaine()
            Dim colonne As Integer
            Dim D1, tabl(3) As String
            
                Range("A1").Select
                Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
                    Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
                    :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
                    Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
                    ), Array(14, 1), Array(15, 1)), TrailingMinusNumbers:=True
            
                    
            D1 = ""
            i = 1
            For colonne = 1 To 15
                If Left(Cells(1, colonne), 4) = "name" And Cells(1, colonne + 1) = "lead" Then
                    tabl(i) = Mid(Cells(1, colonne).Value, 7, Len(Cells(1, colonne).Value) - 7)
                    i = i + 1
                End If
            Next
            
            For i = 1 To 3
            Cells(i + 2, 1) = tabl(i)
            Next
            
            End Sub 

            0
            1. Salut et merci de ton aide

              j'ai essayé ta solution, mais il met l'erreur "le texte est trop long" es normale?

              Cordialement
              0
            2. Aha "est-ce qu'une erreur est normale"
              Bonne question de réthorique ;)

              Mais en l'occurrence non ce n'est pas normal... En exécutant le programme pas à pas avec F8, où est l'erreur? Pour ma par je n'ai pas cette erreur...

              Dans l'attente de te lire,
              0
            3. pouvez vous m'expliquer un peu votre code SVP, j'ai voulu le testé avec ma chaine de caractere car celle donnée avec la question est juste un exemple. et ca ne marche pas

              je souhaiterai comprendre un peu plus votre code pour l'appliquer a ma chaine de caractere.

              merci de votre aide

              Cordialement
              0
            4. Toute la première partie (avant le D1="") sert a mettre chaque partie de la chaîne de caractères entre "," dans plusieurs cellules.
              La seconde partie détermine si le contenu d'une cellule se trouve entre "name" et "lead", et si oui le met dans le tableau tabl(i).
              0
            5. Ok super merci pour cette explication

              Cordialement
              0
          2. Re,

            Code modifie, en effet "12345" doit etre un nombre sur 5 caracteres.

            Sub rechchaine()
              '123456789012345678901234567890123456789
              '[test,"id":"12345","name":"données1","lead","name":"xxxx",test,"id":"12345","name":"données2","lead","name":"yyyy",test,"id":"12345","name":"données3","lead","name":"zzzzz"]
            
              test = "test"
              Entete = "name"
              Suffix = "lead"
              
              'Chaine en Feuil2 A1 pour exemple
              chaine = Worksheets("feuil2").Range("A1")
              'recherche pour D1
              y = InStr(1, chaine, Entete) + 7
              x = InStr(1, chaine, Suffix) - 3
              D1 = Mid(chaine, y, x - y)
              'recherche test poour D2
              a = InStr(x, chaine, test)
              y = InStr(a, chaine, Entete) + 7
              x = InStr(a, chaine, Suffix) - 3
              D2 = Mid(chaine, y, x - y)
              'recherche test poour D3
              a = InStr(x, chaine, test)
              y = InStr(a, chaine, Entete) + 7
              x = InStr(a, chaine, Suffix) - 3
              D3 = Mid(chaine, y, x - y)
              
            End Sub
            0
            1. Super merci a tous,

              j'ai essayé vos solutions ca marche super mais avec une chaine de caractere fixe alors ma chaine de caractere peut varier exemple : aujourdhui elle la 3000 caractere demain elle aura 3500 caractere et ainsi de suite.

              merci de m'aider si vous pouvez

              merci encore de votre aide

              Cordialement
              0
              1. Bonjour a vous tous
                Question:
                Votre chaine de caracteres provient de quoi? un fichier ou...?

                Merci
                0
                1. Trop trop fort ou forte ca marche super meme sur ma chaine de caractere direct sans rien changer au code, trop trop fort ou forte

                  merci mille fois a tous ce qui m'ont aidé

                  merci encore

                  Cordialement

                  Myta, tu peut m'expliquer un peu ton code? STP merci
                  1
                  1. Contributeur
                    Re le forum

                    Sub Extraire()
                    Dim i As Byte, Lig As Byte
                    Dim Chaine As Variant
                    
                        Chaine = Split(Replace([A1], """", ""), "name:")
                        Lig = 2
                        
                        If UBound(Chaine) = -1 Then Exit Sub
                        
                        For i = 0 To UBound(Chaine)
                            If InStr(Chaine(i), "lead") Then
                                Cells(Lig, 1) = Split(Chaine(i), ",")(0)
                                Lig = Lig + 1
                            End If
                        Next i
                    
                    End Sub
                    

                    Suppression des guillemets et découpage de la Chaine avec l'expression name:
                    Chaine = Split(Replace([A1], """", ""), "name:")

                    Si le Tableau (Chaine) est vide on quitte la procédure
                    If UBound(Chaine) = -1 Then Exit Sub

                    On boucle sur le Tableau (Chaine) à la recherche de l'expression lead
                    Si l'expression est trouvé on écrit le premier élément du découpage avec la virgule
                        For i = 0 To UBound(Chaine)
                            If InStr(Chaine(i), "lead") Then
                                Cells(Lig, 1) = Split(Chaine(i), ",")(0)
                                Lig = Lig + 1
                            End If
                        Next i

                    Mytå
                    0
                  2. Bonjour Myta,

                    Je souhaterais utilisé ta fonction mais au lieu d'avoir le resultat dans les cellules je souhaite les avoir dans une listbox ou combobox qui sont dans un userform

                    est-il possible et si oui

                    tu peu m'aider STP

                    Merci

                    Cordialement
                    0
                  3. Contributeur
                    Re le forum

                    Modifie le code comme ceci
                    ' . . .
                    For i = 0 To UBound(Chaine)
                            If InStr(Chaine(i), "lead") Then
                                UserfForm1.ListBox1.AddItem Split(Chaine(i), ",")(0)
                            End If
                        Next i
                    ' . . .

                    Mytå
                    0
                2. c'est un GET en web service qui me permet de recuperer cette chaine de caractere

                  cordialement
                  0