Power Query Extraire chiffre en fonction de leur position power query

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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

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

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Power Query
Réponses
7
Affichages
187
  • Question Question
Microsoft 365 Power Query
Réponses
2
Affichages
81
Réponses
1
Affichages
59
  • Question Question
Microsoft 365 Power Query
Réponses
8
Affichages
134
Réponses
8
Affichages
419
Réponses
2
Affichages
472
Retour