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. c'est un GET en web service qui me permet de recuperer cette chaine de caractere

      cordialement
      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. Bonjour a vous tous
        Question:
        Votre chaine de caracteres provient de quoi? un fichier ou...?

        Merci
        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. 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. 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. Bonjour et merci de ton aide

              je vais essai et l'adapter a mon cas

              merci

              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 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. 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