[Résolu] Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

dieu08

XLDnaute Occasionnel
Bonjour,

Je me refusais à publier encore une nouvelle demande mais je m'y vois obligé du fait de mon manque de connaissance (et pourtant j'ai essayé de m'en sortir seul). Voici donc mon problème :

Dans le fichier exemple joint, j'ai extrait une partie des données que je récupère d'un formulaire.

Vous constarez que les données sont stockées dans une même cellule avec 8 blocs de données séparés par des "[" et "]".

A l'intérieur de ces blocs, vous avez 5 données entre cotes (ou à "None" si pas de données) qui sont séparés par des virgules.

Le but final est de pouvoir extraire chaque donnée (donc 8 x 5 données pour chaque ligne) séparement et ainsi pouvoir filtrer par les dates (ou autres) par exemple.

J'ai tenté un script qui utilise des "arrays" remplis par l'intermédiaire de "InStr" imbriqués et de "Mid" mais les formules imbriquées à partir du 3ème blocs deviennent trop complexes à gérer :

Code:
Option Base 1
Dim tblo1a() As Variant

Sub test()

nblig1 = Application.CountA(Range("A1:A65536"))

ReDim tblo1a(nblig1, 8)

For i = 2 To nblig1

tblo1a(i, 1) = Mid(Cells(i, 16), (InStr(Cells(i, 16), "[") + 2), (InStr(Cells(i, 16), "]") - 3))
tblo1a(i, 2) = Mid(Cells(i, 16), _
                                    (InStr((InStr(Cells(i, 16), "]")), Cells(i, 16), "[")) + 1, _
                                            (InStr( _
                                                    (InStr( _
                                                        (InStr(Cells(i, 16), "]")) _
                                                        , Cells(i, 16), "[" _
                                                    )), _
                                                Cells(i, 16), "]" _
                                            )) _
                                                     - _
                                                        (InStr(Cells(i, 16), "]") + 4))
                                    
tblo1a(i, 3) = Mid(Cells(i, 16), _
                                    (InStr((InStr((InStr((InStr(Cells(i, 16), "]")), Cells(i, 16), "[")), Cells(i, 16), "]")), Cells(i, 16), "[")) + 1, _
                                        15)

                                            
Next i

End Sub

Je me tourne donc vers vous pour avoir une solution plus simple pour extraire ces données.

Merci d'avance.
 

Pièces jointes

  • exemple.xlsx
    8.3 KB · Affichages: 81
  • exemple.xlsx
    8.3 KB · Affichages: 81
  • exemple.xlsx
    8.3 KB · Affichages: 82
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonsoir,

regarde peut être ceci si cela peut t'aider à avancer :
Code:
Option Explicit
Sub test()
Dim t() As String, t2() As String, i As Integer
t = Split(Replace(Replace(ActiveCell, "[[", ""), "]]", ""), "],")
For i = LBound(t) To UBound(t)
    t2 = Split(Replace(Replace(Replace(t(i), "[", ""), "'", ""), " ", ""), ",")
    'code de traitement de t2
Next i
End Sub

A adapter, pas sûr du résultat que tu attends...

bonne soirée
@+
 

Dranreb

XLDnaute Barbatruc
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonjour.
Écrit dans une Function juste pour tester plus facilement:
VB:
Function DécodéCrochets(ByVal Z As String) As Variant()
Dim TSpl1() As String, TSpl2() As String, TRés(), L As Long, C As Long
TSpl1 = Split(Mid$(Z, 3, Len(Z) - 4), "], [")
ReDim TRés(1 To UBound(TSpl1) + 1, 1 To 5)
For L = 1 To UBound(TRés, 1)
   TSpl2 = Split(Replace(TSpl1(L - 1), "'", ""), ", ")
   For C = 1 To 5: TRés(L, C) = TSpl2(C - 1): Next C
   Next L
DécodéCrochets = TRés
End Function
Alors :
Code:
=DécodéCrochets(A2)
Validé par Ctrl+Maj+Entrée sur 8 lignes 5 colonnes rend :
FridaClara07/03/78NoneNone
PercMick14/09/71NoneNone
PrideOliver20/07/98NoneNone
PrideOrde13/01/98NoneNone
PercJo03/01/14NoneNone
PerceAme13/12/05NoneNone
NoneNoneNoneNoneNone
NoneNoneNoneNoneNone
 

dieu08

XLDnaute Occasionnel
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonjour Dranreb,

Merci de ta réponse.

Première chsose, j'ai appris que l'on pouvait créer une fonction en VB et l'utiliser ensuite en tant que formule dans le classeur. Je ne le savais pas.

J'ai testé sur mon classeur sur la cellule A2 en mettant la formule matricielle et le résultat est "Frida". Je ne parviens pas à obtenir les autres données même en "tirant" la formule. Ai-je oublié qqchose ?

(je souhaiterais pouvoir avoir tous les éléments de la cellule A2 sur la même ligne)

Merci encore.
 

Pièces jointes

  • exemple.xlsm
    15.1 KB · Affichages: 46
  • exemple.xlsm
    15.1 KB · Affichages: 51
  • exemple.xlsm
    15.1 KB · Affichages: 51

Dranreb

XLDnaute Barbatruc
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonjour.
Oui, et en plus, si elle rend un tableau de Variant, cette fonction peut être utilisée dans une formule matricielle.
En sélectionnant tout B2:F2, cliquant dans la barre de formule, la revalider par Ctrl+Shift+Enter on à déjà les 5 1èrs.
Pour pouvoir la valider sur 40 colonnes, (mais est-ce bien souhaitable ?) il faut l'écrire différemment:
VB:
Function DécodéCrochets(ByVal Z As String) As Variant()
Dim TSpl1() As String, TSpl2() As String, TRés(), L As Long, C As Long
TSpl1 = Split(Mid$(Z, 3, Len(Z) - 4), "], [")
ReDim TRés(1 To 1, 1 To 40)
For L = 0 To 7
   TSpl2 = Split(Replace(TSpl1(L), "'", ""), ", ")
   For C = 1 To 5: TRés(1, L * 5 + C) = TSpl2(C - 1): Next C
   Next L
DécodéCrochets = TRés
End Function
 

ChTi160

XLDnaute Barbatruc
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonjour dieu08
Bonjour Dranred
Bonjour le forum

je suis nul en formule et je vous parle pas des Matricielles lol
en pièce jointe une approche
double click dans cellule A1, marquée "Libellé"

Le Fichier : Regarde la pièce jointe exemple(3).xls

Bonne fin de journée
Amicalement
Jean Marie
 

Pièces jointes

  • exemple(3).xls
    53 KB · Affichages: 73
  • exemple(3).xls
    53 KB · Affichages: 75

dieu08

XLDnaute Occasionnel
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonjour Dranreb,

J'ai travaillé sur la base de ton code et cela fonctionne. Je n'ai malheureusement pas le choix, je dois impérativement ramené toutes les informations, soit 40 colonnes...

Par contre, comme j'aime bien comprendre le contenu des codes, je m'interroge sur cette ligne en particulier :

Code:
 For C = 1 To 5: TRés(1, L * 5 + C) = TSpl2(C - 1): Next C

Je n'arrive pas trop à saisir le "TRés(1, L * 5 + C)".

Merci d'avance pour tes éclaicissements.
 

eriiic

XLDnaute Barbatruc
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonjour dieu,

C'est difficile de répondre à chaque intervenant ? C'est la moindre des politesse...
J'ai ouvert ton fil, mais ça me dissuade d'y répondre.
Attend le retour de Dranreb en souhaitant qu'il ne soit pas parti en vacances 4 semaines.

eric
 

dieu08

XLDnaute Occasionnel
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonjour dieu,

C'est difficile de répondre à chaque intervenant ? C'est la moindre des politesse...
J'ai ouvert ton fil, mais ça me dissuade d'y répondre.
Attend le retour de Dranreb en souhaitant qu'il ne soit pas parti en vacances 4 semaines.

eric

Bonjour Eric,

Tu me crois ou pas mais cétait prévu.

Je me suis concentré il est vrai sur la procédure qui convenait le plus à ma demande.

Ta remarque est néanmoins tout à fait justifié.
 

Dranreb

XLDnaute Barbatruc
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Et si au lieu de de 5 colonnes vous en aviez 10, ce serait plus clair ?
Pour les mettre au bout le bout sur une seule ligne, quel rang atteindrait la 2ième colonne de la 3ième ligne par exemple, en supposant que la 1ère ligne porte le n° 0 tandis que la 1ère colonne porte le n° 1 ? Comment calculeriez vous ce rang ?
C'est complètement évident que c'est le nombre de colonnes de chaque ligne multiplié par le nombre de lignes déjà reportées auquel on ajoute le numéro de la colonne dans la dernière ligne en cours de report.
 

dieu08

XLDnaute Occasionnel
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Et si au lieu de de 5 colonnes vous en aviez 10, ce serait plus clair ?
Pour les mettre au bout le bout sur une seule ligne, quel rang atteindrait la 2ième colonne de la 3ième ligne par exemple, en supposant que la 1ère ligne porte le n° 0 tandis que la 1ère colonne porte le n° 1 ? Comment calculeriez vous ce rang ?
C'est complètement évident que c'est le nombre de colonnes de chaque ligne multiplié par le nombre de lignes déjà reportées auquel on ajoute le numéro de la colonne dans la dernière ligne en cours de report.

La logique m'échappait. Je serais bien incapable de faire de même !

Merci beaucoup pour vos explications et le temps que vous y avez passé.
 

dieu08

XLDnaute Occasionnel
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonsoir,

regarde peut être ceci si cela peut t'aider à avancer :
Code:
Option Explicit
Sub test()
Dim t() As String, t2() As String, i As Integer
t = Split(Replace(Replace(ActiveCell, "[[", ""), "]]", ""), "],")
For i = LBound(t) To UBound(t)
    t2 = Split(Replace(Replace(Replace(t(i), "[", ""), "'", ""), " ", ""), ",")
    'code de traitement de t2
Next i
End Sub

A adapter, pas sûr du résultat que tu attends...

bonne soirée
@+

Bonjour Pierrot93,

C'est vrai que ta proposition permet de disposer des éléments dans des "arrays" mais j'ai opté pour la solution de Dranreb car cela me permettait d'alimenter mes colonnes avec les éléments splittés.

Merci en tous les cas de votre proposition.
 

ChTi160

XLDnaute Barbatruc
Re : Utilisation avancée des fonctions Mid, InStr (sur de longues chaines)

Bonsoir dieu08
Bonsoir le fil
Bonsoir le forum

arfff je vois que tu as fait ton choix
mais bon je n'ai pas eu de réponse moi ni même de Bonjour ?????? (#6) moi c'était un peu compliqué fallait Double clicker dans une cellule Lol
c'est pas grave !!!!!!!
un coucou a eriiiic
Bonne continuation.......
Amicalement
Jean Marie
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 213
Messages
2 086 307
Membres
103 174
dernier inscrit
OBUTT