XL 2013 Carnet de zone

davy76

XLDnaute Nouveau
Bonjour à tous,

Je fais appel a vous. Car je dispose d'un tableau Excel comprenant une liste de voies par commune. Et j'aimerais avoir un carnet qui regroupe les voies, jusque la je savais faire avec un filtre avancé.
Ce qui me pose problème ce sont les numéros de voie en colonne C, J'aimerais pouvoir regrouper mes numéros en indiquant les bornes pair et impair (du plus petit au plus grand) comme dans l'exemple de l'onglet résultat voulu.
J'espère avoir été clair.

Merci de votre aide.
 

Pièces jointes

  • zone.xlsx
    462.8 KB · Affichages: 32

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @davy76 :),

Un essai dans le fichier joint.
Le code est dans module1.
Cliquez sur Hop! dans la feuille "Résultat voulu"



Notez bien :
Pour des bornes du style 1-123, tous les numéros impairs entre 1 et 123 ne sont pas forcément existants dans votre fichier source.
On ne retient que la borne inférieure et la borne supérieure des impairs de la rue.
S'il ne faut que des intervalles avec tous les numéro impairs existants entre la borne inf. et la borne sup., alors c'est un autre exercice et il faudra le demander. Mais ce n'était pas précisé dans l'énoncé.


Un exemple de ce cas :
ARNAVILLEGRANDE RUE29-225S323S323
ARNAVILLEGRANDE RUE30-222S323S323
il manque entre autres les numéros 37, 43, 53, 55, 57, 59, 65, ...
 

Pièces jointes

  • davy76- regroupement- v1a.xlsm
    506 KB · Affichages: 26
Dernière édition:

Paf

XLDnaute Barbatruc
Bonjour @davy76, @mapomme,

Un essai par tableau et dictionary...
avec exactement les mêmes limites signalées par @mapomme

VB:
Sub Davy76()
Dim T, i As Long, Dico, Parité As String, TT, DL As Long, TFin(), x As Integer
Set Dico = CreateObject("Scripting.Dictionary")

With Worksheets("Zone") ' tri alphabetique de la feuille
    DL = .Range("A" & Rows.Count).End(xlUp).Row
    .Sort.SortFields.Clear
    .Sort.SortFields.Add Key:=Range("A8:A" & DL) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .Sort.SortFields.Add Key:=Range("B8:B" & DL) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .Sort.SortFields.Add Key:=Range("C8:C" & DL) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With .Sort
        .SetRange Range("A8:E" & DL)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

T = .Range("A8:E" & DL)
End With

For i = LBound(T, 1) To UBound(T, 1)  'création dictionnaire
    If Not IsNumeric(T(i, 3)) Then
        Parité = T(i, 3)
    Else
        Parité = IIf((T(i, 3) Mod 2) > 0, "I", "P")
    End If
    clé = T(i, 1) & "|" & T(i, 2) & "|" & Parité
    If Not Dico.Exists(clé) Then
        TT = Array(10000, 0, T(i, 4), T(i, 5))
    Else
        TT = Dico(clé)
    End If
    If IsNumeric(T(i, 3)) Then
        TT(0) = WorksheetFunction.Min(TT(0), T(i, 3))
        TT(1) = WorksheetFunction.Max(TT(1), T(i, 3))
    Else
        TT(0) = ""
        TT(1) = ""
    End If
    Dico(clé) = TT
Next


ReDim TFin(1 To Dico.Count, 1 To 5)
For Each clé In Dico.keys  ' report dictionnaire dans un tableau
    x = x + 1
    TT = Split(clé, "|")
    TFin(x, 1) = TT(0)
    TFin(x, 2) = TT(1)
    TT = Dico(clé)
    If IsNumeric(TT(0)) Then
        TFin(x, 3) = TT(0) & Chr(150) & TT(1)
    Else
        TFin(x, 3) = ""
    End If
    TFin(x, 4) = TT(2)
    TFin(x, 5) = TT(3)
Next

'copie du tableau dans une feuille
Worksheets("Feuil1").Range("A2").Resize(Dico.Count, 5) = TFin
End Sub

A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour Paf :),

D'une part, en regardant à nouveau les données, j'ai vu que des lignes en double existaient dans les données sources. Avec la méthode employée, cela peut fausser les résultats.

D'autre part, je rappelle que je crée une nouvelle ligne de résultat pour un changement de commune ou un changement de voie, ou un changement Pair/Impair. Mais aussi pour un changement de Secteur P ou secteur C.
Ceci explique le résultat suivant :
1621161228644.png

à comparer avec le résultat de @Paf
1621163894187.png


L'énoncé n'étant pas assez clair, on ne sait pas :
  • Si le changement de Secteur (P ou C) doit justifier une nouvelle ligne dans le résultat
  • Si la rupture d'une séquence de numération doit justifier de nouvelles lignes dans le résultat pour n'avoir que des lignes de résultat à séquence continue (de deux en deux bien sûr)
  • On pourrait aussi considérer les quadruplets triés selon (secteur P, secteur C, commune , voie) comme étant une clef
  • et bien d'autres combinaisons de cas possibles...
En attendant des précisions de la part du demandeur, voici une version v1b qui tient compte des doublons.
 

Pièces jointes

  • davy76- regroupement- v1b.xlsm
    507.2 KB · Affichages: 10
Dernière édition:

davy76

XLDnaute Nouveau
Bonjour,

Merci a tous pour vos recherches, je remercie mapomme pour son travail qui se rapproche de ce que je cherche et pour sa demande de précision.
Effectivement, le changement de secteur P ou C doit générer une nouvelle ligne.
Le rupture de séquence dans la numérotation ne justifie pas une nouvelle ligne sauf s'il y a changement de secteur.
Si la commune a le même secteur P et C ont ne génère qu'une ligne Communes.
Et le dernier résultat attendu : si une même voie a le secteur P et C identique en pair et impair, cela ne génère qu'une ligne.

Exemple,
1621230979887.png

devient,
1621231025596.png


Merci de votre aide.
 

Paf

XLDnaute Barbatruc
@mapomme : Bien vu ! Je n'avais pas fait attention au changement possible de secteur....
ce ne serait pas difficile de rectifier ( inclure dans la clé les 2 secteurs et modifier la "distribution" des données dans le tableau final).
Mais avec cette demande d'aménagement, j'en resterai là.

@davy76 : bonne suite
 

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16