Afficher uniquement les lignes sous condition d'intervalle

bonjour à tous

je vous soumets un cas peu ordinaire pour moi pour lequel je suis certain que vous aurez (je l'espère) une ou plusieurs solutions :)

j'ai un tableau avec en colonne A des arguments (Eléments) et en colonne B des rangs d'une suite de 1 à 9999

les rangs sont compris entre deux symboles [ et ] et sont définis pour des intervalles

exemple [1-4] veut dire que tous les nombres entre 1 et 4 sont compris cad 1, 2, 3, 4

nota parfois aucun rang n'est indiqué alors le symbole "-" est mentionné

==> je souhaite, à partir afficher (et donc filtrer) seulement les lignes pour lesquelles un nombre (exemple rang 28) est compris dans les intervalles de la colonne B

j'ai pris l'exemple de ces 4 lignes pour illustrer (tableau ci-dessous)

précisez moi si ce n'est pas clair et vous souhaitez avoir d'autres explications

Cordialement

Romain

image

Bonjour,

Pour un rang 28, j'ai ce résultat. Est-ce qu'on est dans la bonne direction ? (Rapide utilisation de PowerQuery) :

oui c'est parfait comment puis-je utiliser power query?

Bonjour,

Une autre version, toujours avec Power Query.

Mettre dans la cellule F2 (Tableau Structuré nommé "Inter") l'intervalle souhaité.

Et dans le ruban "Données", cliquer sur "Actualiser tout" pour mettre à jour

Nota, il y a des doublons dans la colonne "Elements", faut-il les conserver?

Le code de la requête principale :

let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    Fract = Table.ExpandListColumn(Table.TransformColumns(Source, {{"Rang", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Rang"),
    Filtre = Table.SelectRows(Fract, each ([Rang] <> "-") and List.NonNullCount(List.Intersect({{Number.From(Text.BetweenDelimiters([Rang],"[","-"))..Number.From(Text.BetweenDelimiters([Rang],"-","]"))},Inter}))>0)
in
    Filtre

Le fichier :

Bonjour à tous,

Il y a effectivement des doublons. J'ai effectué de nouvelles opérations pour retourner la table d'origine.

J'ai également multiplié les étapes pour une meilleure compréhension.

merci beaucoup JB tu m'as énormément aidé c'est parfait

cdlt

Romain

Bonsoir à tous !

Une autre approche Power Query ?

let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    Traitt = Table.AddColumn(Source, "Personnalisé", each 
                let 
                ts=Text.Split([Rang]," "),
                tsr=List.Transform(ts, each Text.Remove(_,{"[","]"})),
                tsn=List.Combine(List.Transform(tsr, each {Number.From(Text.BeforeDelimiter(_,"-"))..Number.From(Text.AfterDelimiter(_,"-"))}))
                in try List.Contains( List.Transform(tsn, each Number.From(_)),28) otherwise false),
    Filtre = Table.SelectRows(Traitt, each ([Personnalisé] = true)),
    ColSupp = Table.RemoveColumns(Filtre,{"Personnalisé"})
in
    ColSupp

Bonsoir à tous,

Du VBA pour changer et une fonction personnalisée

Function Appartient_Intervalles(intervalle As String, nombre As Integer) As Byte
    Dim intervalles() As String
    Dim i As Integer, posTiret As Byte, minVal As Integer, maxVal As Integer

    ' Si la cellule contient uniquement un tiret, renvoyer 2
    If Trim(intervalle) = "-" Then
        Appartient_Intervalles = 2
        Exit Function
    End If

    ' Séparer les différents intervalles par l'espace
    intervalles = Split(intervalle, " ")

    ' Parcourir chaque intervalle
    For i = LBound(intervalles) To UBound(intervalles)
        ' Supprimer les crochets dans l'intervalle
        intervalles(i) = Replace(Replace(intervalles(i), "[", ""), "]", "")

        ' Trouver la position du tiret pour extraire les bornes min et max
        posTiret = InStr(intervalles(i), "-")
        minVal = Int(Left(intervalles(i), posTiret - 1))
        maxVal = Int(Mid(intervalles(i), posTiret + 1))

        ' Vérifie si le nombre appartient à l'intervalle actuel
        If nombre >= minVal And nombre <= maxVal Then
            Appartient_Intervalles = 1    ' Le nombre appartient à cet intervalle
            Exit Function    ' Arrêter la boucle dès qu'on trouve un intervalle valide
        End If
    Next i

    ' Si aucun intervalle n'a été trouvé, renvoyer 0
    Appartient_Intervalles = 0
End Function

En C2 à recopier vers le bas :

=Appartient_Intervalles(B2;28)

Y'a plus qu'à filtrer sur la colonne C.

klin89

Rechercher des sujets similaires à "afficher uniquement lignes condition intervalle"