Power Query Extraire chiffre en fonction de leur position power query

Maverick59264

XLDnaute Nouveau
Bonjour,

Par power query est il possible de récupérer les chiffres que j'ai mis en rouge
Compliqué de trouvé une solution, merci d'avance

Cordialement,
 

Pièces jointes

  • TEST.xlsx
    9.3 KB · Affichages: 13
Solution
Bonsoir à tous,


PowerQuery:
let
A = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
B = Table.TransformColumns(A, {"Column1", each
[
a = Text.Split(_," "),
b = List.PositionOf(List.Transform(a, (x)=> Text.Length(x)), 7, Occurrence.Last),
c  = List.Range(a,b + 1, 2),
d  = if Text.Length(c{0}) = 1 then Text.Combine(c, " ") else c{0}
] [d]
})
in
B

Bonne soirée à tous.

alexga78

XLDnaute Occasionnel
Bonsoir à tous,


PowerQuery:
let
A = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
B = Table.TransformColumns(A, {"Column1", each
[
a = Text.Split(_," "),
b = List.PositionOf(List.Transform(a, (x)=> Text.Length(x)), 7, Occurrence.Last),
c  = List.Range(a,b + 1, 2),
d  = if Text.Length(c{0}) = 1 then Text.Combine(c, " ") else c{0}
] [d]
})
in
B

Bonne soirée à tous.
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Avec cette fonction VBA c'est classique et très simple :
VB:
Function Extract$(c As Range)
Dim i%
For i = 1 To Len(c)
    With c.Characters(i, 1)
        If .Font.Color <> vbBlack Then Extract = Extract & .Text
    End With
Next
End Function
A+
 

Pièces jointes

  • TEST.xlsm
    15.9 KB · Affichages: 1

job75

XLDnaute Barbatruc
Hello @job75
je crois que la coloration rouge des nombres à extraire a été mise par le demandeur pour montrer ce qu'il souhaitait récupérer ;)
Bon d'accord alors utilisez ceci mais c'est bien moins compréhensible :
VB:
Function Extract$(x$)
Dim i%, j%
i = InStrRev(x, ",", Len(x) - 3)
For j = i - 1 To 1 Step -1
    If Not IsNumeric(Mid(x, j, i - j + 1)) Then Extract = Mid(x, j + 7, i - j - 4): Exit For
Next
End Function
 

Pièces jointes

  • TEST.xlsm
    16 KB · Affichages: 2

jurassic pork

XLDnaute Occasionnel
Hello,
En VBA en utilisant les expressions régulières :
VB:
Function ExtractNum$(n$)
Dim regex As Object
Dim matches As Object
ExtractNum = ""
On Error Resume Next
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "\d* \d+,\d+"
regex.Global = True
Set matches = regex.Execute(n)
If matches.Count > 1 Then
   ExtractNum = Trim(matches(matches.Count - 2).Value)
End If
End Function
Explication du motif "\d* \d+,\d+"
on capture ce qui commence par 0 ou plus chiffre suivi d'un espace suivi d'un ou plus chiffres suivi d'une virgule suivi d'un ou plus chiffre. Le Global à True c'est pour capturer toutes les occurrences.
le matches(matches.Count - 2).Value c'est pour capturer l'avant-dernière occurrence.
Je trouve les mêmes résultats que le VBA de job75.
Ami calmant, J.P
 

job75

XLDnaute Barbatruc
Bonjour le forum,

J'explique quand même comment fonctionne la fonction de mon post #10.

Elle recherche les positions de l'avant dernière virgule (i) et de l'avant-avant dernière virgule (j).

Ensuite on constate que le texte recherché commence toujours 7 caractères à droite de j et se termine toujours 2 caractères à droite de i.

Ce n'est pas un hasard bien sûr mais il faut avouer que sur le plan logique c'est assez capillotracté.

A+
 

job75

XLDnaute Barbatruc
Ah mais il n'y a même pas besoin de VBA, c'est très simple par formule.

Sélectionner B1 et définir les 3 noms :

i =TROUVE(",";TEST!$A1)
j =TROUVE(",";TEST!$A1;i+1)
k =TROUVE(",";TEST!$A1;j+1)

Formule très simple en B1, à tirer vers le bas =STXT(A1;j+7;k-j-4)
 

Pièces jointes

  • TEST.xlsx
    10.2 KB · Affichages: 1

Discussions similaires

Réponses
8
Affichages
358

Statistiques des forums

Discussions
315 088
Messages
2 116 088
Membres
112 657
dernier inscrit
jpb3