Bonjour,
J'ai un tableau contenant plusieurs informations dans une cellule. Est-ce qu'il y a un truc pour être capable d'extraire les informations d'un tableau. Voir pièce jointe.
Merci
Aimey
Bonjour,
J'ai un tableau contenant plusieurs informations dans une cellule. Est-ce qu'il y a un truc pour être capable d'extraire les informations d'un tableau. Voir pièce jointe.
Merci
Aimey
Salut.
Dans la mesure où il n'y a pas d'autres cellules qui contiennent le "code" que tu recherches...
"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...
---------------
hello,
Pierre, ta formule ne fonctionne pas dans tous les cas de figure. Par exemple si dans les codes j'ai 17 , la formule le prend en compte.
J'ai créé une fonction personnalisée en vba qui devrait remplir la fonction :
recherchecode(<code à chercher>,<plage qui englobe les codes et la colonne à afficher>,<colonne à afficher>)
par exemple recherchecode(7,B2:D8,3) recherche le code 7 de la ligne 2 à la ligne 8 de B et affiche ce qu'il y a en colonne D (3ème colonne de la plage)
les codes sont extraits des cellules par un split avec séparateur la virgule.
Voici le code :
Pour éviter de transférer les cellules une par une on transfère en une seule fois la plage dans un tableau ( arr = PlageRecherche)
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 Public Function RechercheCode(NumCode As String, PlageRecherche As Range, ColonneAffichée) As String Dim arr() As Variant Dim Ligne As String Dim TableauValeurs As Variant arr = PlageRecherche Dim R As Long RechercheCode = "Pas trouvé" For R = 1 To UBound(arr, 1) ' première dimension = lignes Ligne = arr(R, 1) ' 1 = première colonne TableauValeurs = Split(Ligne, ",") If IsInArray2(NumCode, TableauValeurs) >= 0 Then RechercheCode = arr(R, ColonneAffichée) ' une seule colonne Next R End Function Function IsInArray2(stringToBeFound As String, arr As Variant) As Long Dim i As Long ' default return value if value not found in array IsInArray2 = -1 For i = LBound(arr) To UBound(arr) If StrComp(stringToBeFound, arr(i), vbTextCompare) = 0 Then IsInArray2 = i Exit For End If Next i End Function
Ami calmant, J.P
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
En effet. Mais en fait, l'utilisation de VBA est rendue obligatoire par le fait que le tableau est mal formé au départ. C'est donc un problème de conception du classeur et il est préférable de résoudre le problème de conception plutôt que de mettre des rustines
Dès lors, tant qu'à faire du VBA, je propose de laisser la source telle quelle et de créer un nouveau tableau dans lequel on remet en VBA les données sous une forme permettant un traitement des données avec Excel. Si on ne procède pas ainsi, on va devoir "pondre" du VBA pour tous les traitements futurs des données alors que si on reforme le tableau, on se donne la possibilité d'utiliser tous les outils d'Excel, par exemple un INDEX/EQUIV, mais aussi un TCD, des fonctions d'ensemble, ...).
Je propose donc le code suivant, dans lequel il suffira d'exécuter la procédure TraiterDonnees après avoir adapté les variables SourceCell et TableauFinal à la réalité du classeur
On obtient alors un beau tableau et il n'y a plus qu'à utiliser toute la puissance d'Excel.
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 ' Adapte le tableau reçu pour le normaliser ' permettre l'utilisation correcte d'Excel Private Sub AdapterTableau(SourceCell As Range, TableauFinal As ListObject) Dim Cellule As Range ' Cellule d'itération Dim Cible As Range ' Première cellule de la ligne Cible Dim Codes ' Tableau des codes récupérés dans Cellule Dim Counter As Long ' compteur d'itérations Dim Source As Range ' Plage source mal formée ' Initialisation Set Source = Range(SourceCell, SourceCell.End(xlDown)) ' Calcul de la plage source en fonction de sa première cellule Set Cible = TableauFinal.Range.Cells(1)(2) ' On détermine la première cellule du tableau final ' Vidange du tableau final If Not TableauFinal.DataBodyRange Is Nothing Then TableauFinal.DataBodyRange.Delete ' Boucle sur les cellules de la colonne A For Each Cellule In Source Codes = Split(Cellule(1, 2).Value, ",") For Counter = 0 To UBound(Codes) Cible.Value = Cellule.Value Cible(1, 2).Value = Codes(Counter) Cible(1, 3).Value = Cellule(1, 3).Value Cible(1, 4).Value = Cellule(1, 4).Value Set Cible = Cible(2) Next Counter Next Cellule End Sub ' Procédure de traitement des données ' Il suffit d'adapter SourceCell et TableauFinal à la configuration ' du classeur réel utilisé Sub TraiterDonnees() Dim SourceCell As Range Dim TableauFinal As ListObject Set SourceCell = Range("a2") Set TableauFinal = Feuil1.ListObjects(1) AdapterTableau SourceCell, TableauFinal End Sub
Pièce jointe 209471
"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...
---------------
Bonjour,
Voici une solution un peu décalée basée sur une fonction personnalisée matricielle.
Cette fonction générique est basée sur les expressions régulières et est réutilisable pour d'autres traitements; il suffit d'utiliser le bon motif ("pattern") en paramètre pour l'adapter à ce cas particulier:
Dans un module VBA:
Et dans une case Excel, la fonction matricielle suivante:
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 Public Function RegExTest(sourceRg As Range, patternTxt As String) Dim reg Dim i As Long, j As Long Dim tempTab() tempTab = sourceRg.Value Set reg = CreateObject("VBScript.RegExp") reg.pattern = patternTxt For i = LBound(tempTab, 1) To UBound(tempTab, 1) For j = LBound(tempTab, 2) To UBound(tempTab, 2) tempTab(i, j) = reg.test(tempTab(i, j)) Next j Next i RegExTest = tempTab End Function
A valider par Ctrl+Maj+Entrée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part =INDEX(Tableau1[Numéro de pièces]; MIN(SI(RegExTest(Tableau1[Numéro eq]; "(^|,)7(,|$)"); LIGNE(Tableau1[Numéro eq]) - LIGNE(Tableau1[[#En-têtes];[Numéro eq]]); 1000000000)))
A la lecture des réponses fournies et en regardant de plus près le tableau des données, je ne suis pas convaincu que nos réponses sont correctes, puisque le code 7 est présent deux fois dans code_EQ... Dès lors, ce sera normalement le premier qui sera trouvé (et donc, selon l'organisation du tableau), le code renvoyé ne sera pas VON_...
Il me semble qu'il sera intéressant que la demandeuse précise ce qu'elle souhaite obtenir...
Et quoi qu'il en soit, au risque de paraître têtu, je persiste à dire qu'il faut d'abord préparer les données pour qu'elles soient conformes à une utilisation optimale des outils natifs d'Excel, sans quoi il faudra pondre des fonctions personnelles, certes intellectuellement intéressantes, mais très difficilement adaptables à d'autres cas.
"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...
---------------
hello,
en effet nous n'avons pas traité le cas où il y a plusieurs fois le même code. Afficher alors la première , la dernière ou toutes les solutions ?
Au fait c'est toi Pierre qui a déplacé le message ici ? as-tu prévenu Aimey?
Ami calmant, J.P
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
"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...
---------------
Bonsoir,
Pour toutes les solutions, cette formule matricielle placée à partir de G2:
Pour la dernière solution:
Code : Sélectionner tout - Visualiser dans une fenêtre à part =INDEX(Tableau1[Numéro de pièces]; PETITE.VALEUR(SI(RegExTest(Tableau1[Numéro eq]; "(^|,)7(,|$)"); LIGNE(Tableau1[Numéro eq]) - LIGNE(Tableau1[[#En-têtes];[Numéro eq]]); 1000000000); LIGNE()-LIGNE($G$2)+1))
Code : Sélectionner tout - Visualiser dans une fenêtre à part =INDEX(Tableau1[Numéro de pièces]; MAX(SI(RegExTest(Tableau1[Numéro eq]; "(^|,)7(,|$)"); LIGNE(Tableau1[Numéro eq]) - LIGNE(Tableau1[[#En-têtes];[Numéro eq]]); 0)))
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager