Extraction liste de numéros en fonction d'une tranche de numéros

undo74

XLDnaute Nouveau
:confused::confused:Bonjour,
Je souhaite savoir comment faire un macro VB sous Excel afin avoir une liste de numéro en fonction d’une tranche donné (Début et Fin) voir l’exemple en Pj pour plus de détails.
l'objectif final avoir le résultat de la table3 "voir le fichier".
Merci par avance pour votre aide.
 

Pièces jointes

  • Exemple.xls
    19.5 KB · Affichages: 74
  • Exemple.xls
    19.5 KB · Affichages: 75
  • Exemple.xls
    19.5 KB · Affichages: 75

undo74

XLDnaute Nouveau
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Bonsoir,
Parceque l'application que j'utilise vérifie de xxxxxxxxx0 à xxxxxxxxx9 et si il me manque un numero dans la tranche il faut que je laisse les numéros origine c'est a dire pour mon exemple: 0201066001,0201066002,0201066003,0201066004,0201066005,0201066006,0201066007,0201066008,0201066009.
merci pour ton aide.
@+
 

ROGER2327

XLDnaute Barbatruc
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Bonjour à tous


Un essai dans le classeur joint, avec la procédure tata :​
VB:
Sub tata()
Dim i&, j&, k&, l&, n&, d$, f$, p$, s$(), t$()
    d = [A3].Value 'borne inférieure
    f = [C3].Value 'borne supérieure
    n = CLng(f) - CLng(d)
    ReDim s(0 To n, 1 To 1)
    ReDim t(0 To n, 1 To 1)
    p = Left$(String(15, "0"), Len(d))
    j = CLng(d)
    For i = 0 To n
        s(i, 1) = Format(j + i, p)
    Next
    p = Left$(s(0, 1), Len(s(0, 1)) - 1)
    l = -1
    For i = 0 To n
        If s(i, 1) Like p & "*" Then
            k = k + 1
        Else
            If k = 10 Then
                l = l + 1
                t(l, 1) = p
            Else
                For j = 1 To k: t(l + j, 1) = s(i + j - k - 1, 1): Next
                l = l + k
            End If
            k = 1
            p = Left$(s(i, 1), Len(s(i, 1)) - 1)
        End If
    Next
    If k = 10 Then
        l = l + 1
        t(l, 1) = p
    Else
        For j = 1 To k: t(l + j, 1) = s(i + j - k - 1, 1): Next
        l = l + k
    End If
    With [G3] 'première cellule de résultat
        .Resize(2, 1).Value = t
        Range(.Cells, Cells(Rows.Count, .Column).End(xlUp)).ClearContents
        .Resize(l + 1, 1).Value = t
    End With
End Sub



ROGER2327
#6054


Dimanche 22 Gidouille 139 (Fête de Gidouille - fête Suprême Seconde)
18 Messidor An CCXX, 3,7225h - gesse
2012-W27-5T08:56:03Z
 

Pièces jointes

  • XLD_188041_extraction_bizarre.xls
    39.5 KB · Affichages: 50

undo74

XLDnaute Nouveau
Re : Extraction liste de numéros en fonction d'une tranche de numéros

:)Bonjour ROGER2327,
Merci infiniment car c'est exactement la macro que je voulais.

Une dernière petite question pour allée encore plus loin c'est de rajout a la macro un regroupement une tranche de centaine exemple :0235066100-0235066199 > resultat 02350661

Merci encore pour votre aide.
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Bonjour à tous


:)Bonjour ROGER2327,
Merci infiniment car c'est exactement la macro que je voulais.

Une dernière petite question pour allée encore plus loin c'est de rajout a la macro un regroupement une tranche de centaine exemple :0235066100-0235066199 > resultat 02350661

Merci encore pour votre aide.
Je me doutais bien qu'on n'en resterait pas là... (Une question peut en cacher une autre.)
Le code précédent est aménageable pour prendre en compte votre nouvelle demande. On va même anticiper un peu en regroupant non seulement par dizaines et centaines complètes mais aussi par milliers, dizaines de milliers, etc.​
VB:
Sub tata()
Dim i&, j&, n&, d$, f$, p$, s$(), x()
    d = [A3].Value 'borne inférieure.
    f = [C3].Value 'borne supérieure.
    With [G3] 'première cellule de résultat.
        .Resize(2, 1).Value = 1
        Range(.Cells, Cells(Rows.Count, .Column).End(xlUp)).ClearContents
        j = CLng(d)
        n = CLng(f) - j
        ReDim s(0 To n, 1 To 1)
        p = Left$(String(15, "0"), Len(d))
        For i = 0 To n: s(i, 1) = Format(j + i, p): Next
        x = tutu(s)
        Do
            n = x(1)
            ReDim s(0 To n, 1 To 1)
            For i = 0 To n: s(i, 1) = x(0)(i, 1): Next
            x = tutu(s)
        Loop Until x(1) = n
        .Resize(x(1) + 1, 1).Value = x(0)
    End With
End Sub

Private Function tutu(s)
Dim i&, j&, k&, l&, n&, p$, t$()
    n = UBound(s)
    ReDim t(0 To n, 1 To 1)
    p = Left$(s(0, 1), s(0, 1) - 1)
    l = -1
    For i = 0 To n
        If s(i, 1) Like p & "?" Then
            k = k + 1
        Else
            If k = 10 Then
                l = l + 1
                t(l, 1) = p
            Else
                For j = 1 To k: t(l + j, 1) = s(i + j - k - 1, 1): Next
                l = l + k
            End If
            k = 1
            p = Left$(s(i, 1), Len(s(i, 1)) - 1)
        End If
    Next
    If k = 10 Then
        l = l + 1
        t(l, 1) = p
    Else
        For j = 1 To k: t(l + j, 1) = s(n + j - k, 1):  Next
        l = l + k
    End If
    tutu = Array(t, l)
End Function
(Mise en œuvre dans le classeur joint.)

Est-ce convenable ?​



ROGER2327
#6056


Lundi 23 Gidouille 139 (Saint Ombilic, gymnosophiste - fête Suprême Quarte)
19 Messidor An CCXX, 6,8798h - cerise
2012-W27-6T16:30:42Z
 

Pièces jointes

  • XLD_188041_extraction_bizarre_v2.xls
    36.5 KB · Affichages: 39

undo74

XLDnaute Nouveau
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Bonjour a tous,
ROGER2327 je vous remercie de votre aide précieuse c'est vraiment la macro qui me fallait.
chapeau bas ROGER2327 images.jpg.
a bientôt sur le forum ;)
 

Pièces jointes

  • images.jpg
    images.jpg
    6.2 KB · Affichages: 91
  • images.jpg
    images.jpg
    6.2 KB · Affichages: 92
Dernière édition:

undo74

XLDnaute Nouveau
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Bonjour,
ROGER2327,:confused:
Est-il possible de rajouter a ton code une condition si j'ai ce numéro de la cellule [A6] dans la tranche de me l'affiché en rouge dans la liste Résultat final.
Merci d'avance encore pour ton aide.
cdlt
 

Pièces jointes

  • XLD_188041_extraction_bizarre_v2.1.xls
    38 KB · Affichages: 43

ROGER2327

XLDnaute Barbatruc
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Re...


(...)
Est-il possible de rajouter a ton code une condition si j'ai ce numéro de la cellule [A6] dans la tranche de me l'affiché en rouge dans la liste Résultat final.
(...)
Tout est possible, excepté ce qui ne l'est pas.

Serait-il possible d'avoir une vue de l'ensemble du problème plutôt que des demandes en tranche ? On perd beaucoup de temps à bricoler des bidouilles sur un code existant : il serait bien plus facile d'avoir un code propre si on savait dès le début ce qu'on cherche réellement à faire.

Ceci dit, pour cette nouvelle tranche du problème, on peut s'en tirer ainsi :
  1. Exécuter le code existant.
  2. Ajouter le numéro à isoler à la liste obtenue.
  3. L'écrire en rouge.
  4. Ordonner la liste complétée en ordre croissant.
  5. Éventuellement, supprimer le doublon.

Bien sûr, ces manipulations peuvent être intégrées au code existant :​
VB:
Sub tata()
Dim i&, j&, n&, d$, f$, g$, p$, s$(), x(), cl As Sort
    d = [A3].Value 'borne inférieure.
    f = [C3].Value 'borne supérieure.
    g = [A6].Value 'valeur insérée.
    With [G3] 'première cellule de résultat.
        .Resize(2, 1).Value = 1
        With Range(.Cells, Cells(Rows.Count, .Column).End(xlUp)): .ClearContents: .Font.ColorIndex = xlAutomatic: End With
        j = CLng(d)
        n = CLng(f) - j
        ReDim s(0 To n, 1 To 1)
        p = Left$(String(15, "0"), Len(d))
        For i = 0 To n: s(i, 1) = Format(j + i, p): Next
        x = tutu(s)
        Do
            n = x(1)
            ReDim s(0 To n, 1 To 1)
            For i = 0 To n: s(i, 1) = x(0)(i, 1): Next
            x = tutu(s)
        Loop Until x(1) = n
        .Value = "'" & g
        .Font.Color = -16776961
        .Resize(x(1) + 1, 1).Offset(1).Value = x(0)
        Set cl = Me.Sort
        cl.SortFields.Clear
        cl.SortFields.Add Key:=.Resize(x(1) + 2, 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        cl.SetRange .Resize(x(1) + 2, 1)
        cl.Header = xlNo
        cl.MatchCase = False
        cl.Orientation = xlTopToBottom
        cl.Apply
        .Resize(x(1) + 2, 1).RemoveDuplicates Columns:=1, Header:=xlNo
    End With
End Sub
C'est ce que j'ai fait dans le classeur joint.
Mais je ne possède plus la version 2003 d'Excel. Je livre donc une version écrite sous Excel2010. Elle ne fonctionnera probablement pas sous Excel2003 : il faudra modifier la syntaxe du tri (dont j'ai oublié l'écriture depuis que j'ai perdu Excel2003) et traiter autrement une éventuelle suppression du doublon. Il s'agit de cette partie du code de la procédure tata :​
VB:
        Set cl = Me.Sort
        cl.SortFields.Clear
        cl.SortFields.Add Key:=.Resize(x(1) + 2, 1) _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        cl.SetRange .Resize(x(1) + 2, 1)
        cl.Header = xlNo
        cl.MatchCase = False
        cl.Orientation = xlTopToBottom
        cl.Apply
        .Resize(x(1) + 2, 1).RemoveDuplicates Columns:=1, Header:=xlNo
Comme il y a encore beaucoup d'adeptes d'Excel2003, vous avez une chance que l'un d'entre eux vous guide pour les modifications à apporter.​


Bonne nuit.


ROGER2327
#6073


Mercredi 25 Gidouille 139 (Saint Bouffre, pontife - fête Suprême Quarte)
21 Messidor An CCXX, 9,7290h - menthe
2012-W28-1T23:20:58Z
 

Pièces jointes

  • XLD_188041_extraction_bizarre_v3.xlsm
    30.8 KB · Affichages: 54
  • XLD_188041_extraction_bizarre_v3.xls
    48.5 KB · Affichages: 41

undo74

XLDnaute Nouveau
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Bonjour,
Merci pour ton aide effectivement le code ne fonctionne pas sous Excel 2003 :(.
Malheureusement je suis débutant sous VB:confused: je vais essayer le fichier .xlsm au boulot voir si ça marche je te tien au courant.
Merci encore pour ton support.
Et a bientôt j'espère ;)
.
 

ROGER2327

XLDnaute Barbatruc
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Bonjour,


(...) effectivement le code ne fonctionne pas sous Excel 2003 (...)
Comme prévu, hélas...
Essayez celui-ci :​
VB:
Sub tata()
Dim i&, j&, n&, d$, f$, g$, p$, s$(), x(), cl As Sort
    d = [A3].Value 'borne inférieure.
    f = [C3].Value 'borne supérieure.
    g = [A6].Value 'valeur insérée.
    With [G3] 'première cellule de résultat.
        .Resize(2, 1).Value = 1
        With Range(.Cells, Cells(Rows.Count, .Column).End(xlUp)): .ClearContents: .Font.ColorIndex = xlAutomatic: End With
        j = CLng(d)
        n = CLng(f) - j
        ReDim s(0 To n, 1 To 1)
        p = Left$(String(15, "0"), Len(d))
        For i = 0 To n: s(i, 1) = Format(j + i, p): Next
        x = tutu(s)
        Do
            n = x(1)
            ReDim s(0 To n, 1 To 1)
            For i = 0 To n: s(i, 1) = x(0)(i, 1): Next
            x = tutu(s)
        Loop Until x(1) = n
        For i = 0 To n
            If g = x(0)(i, 1) Then
                j = -1: Exit For
            ElseIf g < x(0)(i, 1) Then
                j = -2: Exit For
            End If
        Next
        .Resize(x(1) + 1, 1).Value = x(0)
        Select Case j
            Case -1
                .Offset(i).Font.Color = -16776961
            Case -2
                .Offset(i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
                .Offset(i + (i = 0)).Value = "'" & g
                .Offset(i + (i = 0)).Font.Color = -16776961
            Case Else
                .Offset(i).NumberFormat = "General"
                .Offset(i).Value = "'" & g
                .Offset(i).Font.Color = -16776961
        End Select
    End With
End Sub



ROGER2327
#6079


Jeudi 26 Gidouille 139 (Sainte Goulache, odalisque - fête Suprême Quarte)
22 Messidor An CCXX, 4,4606h - cumin
2012-W28-2T10:42:19Z
 

Pièces jointes

  • XLD_188041_extraction_bizarre_v4.xls
    61 KB · Affichages: 38

undo74

XLDnaute Nouveau
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Re ROGER2327,
Merci pour ton retour rapide;)le fichier V4 ne fonctionne toujours pas avec Excel 2003 ce n'est pas grave voir le message ci-dessous :
too.jpg
Par compte j'ai testé au boulot le fichier v3 .xlsm sous Excel 2010 pas de problème :D mais un petit souci sur le fonctionnement suite a ma dernière demande "l'ajout du numéro à isoler" le principe c'est quand le numéro ce trouve dans la tranche il s'affiche en rouge pas problème mais dans le cas le numéro se situe dans la tranche. exemple : la tranche (0477808000-0477808199) et numéro à isoler 0477808080 logiquement le résultat finale=
047780800
047780801
047780802
047780803
047780804
047780805
047780806
047780807
0477808080
0477808081
0477808082
0477808083
0477808084
0477808085
0477808086
0477808087
0477808088
0477808089
047780809
04778081

J’obtiens avec ton code le résultat suivant:
04778080
0477808080
04778081
Peux-tu m'aider a resoudre cette anomalie ?:eek:
Merci encore d'avance pour ton aide.
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Re...


Pour le problème de compilation sous Excel2003 : supprimez ", cl As Sort". C'est un résidu de la version précédente que j'ai oublié de virer... Ceci fait, peut-être qu'Excel2003 acceptera la chose.

Pour le problème de "logique", il m'échappe. Avec la tranche 0477808000 à 0477808199 (exactement 200 valeurs), vous serez je pense d'accord pour dire que la première étape (regroupement des dizaines complètes) donne les vingt valeurs qui suivent :
047780800
047780801
047780802
047780803
047780804
047780805
047780806
047780807
047780808
047780809
047780810
047780811
047780812
047780813
047780814
047780815
047780816
047780817
047780818
047780819​


Vous admettrez que la deuxième étape (regroupement des centaines complètes) donne les deux valeurs qui suivent :
04778080
04778081​


À ce stade, le boulot que vous demandiez au message #5 est fait.

Vous complétez la demande comme suit au message #8 :
Bonjour,
ROGER2327,
Est-il possible de rajouter a ton code une condition si j'ai ce numéro de la cellule [A6] dans la tranche de me l'affiché en rouge dans la liste Résultat final.
Merci d'avance encore pour ton aide.
cdlt
Je comprends qu'il faut adjoindre une valeur isolée supplémentaire à la liste, et l'écrire en rouge. J'ai beau le relire attentivement, je ne comprends pas comment ce texte peut signifier qu'il faut supprimer un des éléments obtenus à l'étape 2 (04778080), ajouter 9 éléments qui avaient disparus dès l'étape 1, et 8 autres extraits de la liste de l'étape 1...

Dans l'exemple présent, j'adjoins 0477808080. J'en déduis le résultat final , à partir du résultat de l'étape 2 :
04778080
0477808080
04778081
Il me semble que j'ai suivi pas à pas vos instructions... Et je ne vois pas en quoi il serait "logique" de réintroduire une foultitude de valeurs qu'on avait pris soin d'éliminer à la deuxième étape. Franchement, ça devient trop compliqué pour moi. Désolé...


Bonne nuit.



ROGER2327
#6092


Vendredi 27 Gidouille 139 (Sainte Gandouse, hygiéniste - fête Suprême Quarte)
23 Messidor An CCXX, 0,2281h - haricot
2012-W28-3T00:32:50Z
 

ROGER2327

XLDnaute Barbatruc
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Suite...


À force d'observer le résultat que vous attendez, il me semble deviner quelles sont les conditions à remplir.

Si, à la place du message #8, on avait :


Il y a deux conditions supplémentaires à respecter :
  1. La tranche (dizaine, centaine, ...) à laquelle appartient la valeur en A6 ne doit pas être supprimée.
  2. Cette valeur doit être affichée en rouge.


on obtiendrait le résultat que vous souhaitez.
Est-ce correct ?

(Si c'est cela, il ne sera pas difficile de modifier le code.)


ROGER2327
#6093


Vendredi 27 Gidouille 139 (Sainte Gandouse, hygiéniste - fête Suprême Quarte)
23 Messidor An CCXX, 0,9431h - haricot
2012-W28-3T02:15:49Z
 

undo74

XLDnaute Nouveau
Re : Extraction liste de numéros en fonction d'une tranche de numéros

Suite...

À force d'observer le résultat que vous attendez, il me semble deviner quelles sont les conditions à remplir.

Si, à la place du message #8, on avait :

Il y a deux conditions supplémentaires à respecter :
La tranche (dizaine, centaine, ...) à laquelle appartient la valeur en A6 ne doit pas être supprimée.
Cette valeur doit être affichée en rouge.

on obtiendrait le résultat que vous souhaitez.
Est-ce correct ?

(Si c'est cela, il ne sera pas difficile de modifier le code.)

ROGER2327
#6093


Oui tu as tout compris:

Bonjour ROGER2327,
Je conmprend que c'est pas si simple le but c'est de vérifié si la valeur isolée exist dans la tranche si oui je dois le savoir car elle est importante !!! elle ne dois pas être supprimer. Dans mon exemple le faite que la valeur est entre xxxxxxxx00 et xxxxxxxx09 la nous reprenons la condition de gardé les valeurs d'origine qui sont avant et après 0477808080 c'est dire de avant 047780800 a 047780807 et après de 0477808081 a 0477808089
sinon si la valeur isolée n'existe pas
le fichier de la version du message #5 est très bien.

merci pour ton implication

bonne journee
 
Dernière édition:

Discussions similaires

Réponses
8
Affichages
444

Statistiques des forums

Discussions
312 304
Messages
2 087 067
Membres
103 451
dernier inscrit
Souleymane