Excel vba recherche

Résolu/Fermé
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 - Modifié par amine69500 le 7/09/2012 à 11:46
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 - 11 sept. 2012 à 18:24
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

Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 949
10 sept. 2012 à 17:29
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
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
10 sept. 2012 à 17:45
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
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 949
10 sept. 2012 à 18:41
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
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
Modifié par amine69500 le 11/09/2012 à 17:32
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
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 949
11 sept. 2012 à 18:24
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
Morgothal Messages postés 1236 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 183
7 sept. 2012 à 12:30
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
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
Modifié par amine69500 le 7/09/2012 à 14:24
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

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

Posez votre question
Morgothal Messages postés 1236 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 183
7 sept. 2012 à 14:45
0
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
7 sept. 2012 à 15:11
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
Morgothal Messages postés 1236 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 183
7 sept. 2012 à 15:28
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
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
7 sept. 2012 à 16:05
Re,
Eh Oui, des fois l'arbre cache la foret.......!!
Merci
0
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
7 sept. 2012 à 15:22
Bonjour et merci de ton aide

je vais essai et l'adapter a mon cas

merci

cordialement
0
Morgothal Messages postés 1236 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 183
7 sept. 2012 à 15:50
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
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
10 sept. 2012 à 15:57
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
Morgothal Messages postés 1236 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 183
10 sept. 2012 à 16:12
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
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
10 sept. 2012 à 16:54
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
Morgothal Messages postés 1236 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 183
10 sept. 2012 à 19:24
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
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
10 sept. 2012 à 20:54
Ok super merci pour cette explication

Cordialement
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 778
7 sept. 2012 à 16:13
Bonjour,

Peut-être :
https://www.cjoint.com/?BIhqngZ22vR
0
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
7 sept. 2012 à 16:28
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
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
10 sept. 2012 à 15:55
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
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
10 sept. 2012 à 16:53
Bonjour a vous tous
Question:
Votre chaine de caracteres provient de quoi? un fichier ou...?

Merci
0
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
10 sept. 2012 à 20:53
c'est un GET en web service qui me permet de recuperer cette chaine de caractere


cordialement
0