Tracé de segments

knaekes

XLDnaute Occasionnel
Bonjour, et bonne année 2010 !

A partir d'un tableau d'horaires je souhaiterais représenter des dessertes ferroviaires sous forme de segments (=graphicage).

Je souhaite afficher ces segments, dans un repère reprenant en ordonnée les distances entre les différents arrêts et en abscisse les horaires de desserte (de 04:00 à 24:00).

Le segment aura pour orginie (gare de départ/horaire de départ) et s'arrêtera au point de coordonnée (gare d'arrivée/horaired'arrivée).
Si cela est possible je souhaitererais faire apparaître les horaires des arrêts intermédiaires.

Selon le type de desserte (T, SD, O, G) le segment représentant la desserte sera de couleur correspondante (voir fichier excel).

Etant donné que je ne peux afficher que 256 colonnes (excel 2003), le déroulé de 04:00 à 24:00 devra s'effectuer en 5 Parties.

Je n'ai pour l'instant trouvé aucune application sous excel permettant d'extraire des segments dans un repère à partir d'un tableau de valeurs.

Avez-vous des pistes à me conseiller?

Ci joint un exemple de tableau d'horaires accompagné de sa représentation sous forme de graphicage (je n'ai représenté sur le graphe, que quelques segments représentatif)

Merci d'avance pour votre aide :)
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : Graphicage - tracer de segments

Re

Je crois avoir decouvert l'origine du probleme:
Pour le calcul de la colonne (toujours une minute paire) j'ote 1 min si l'heure est impaire
Et comme on fait 2 fois le calcul (pour servir la 2eme tranche) on se retrouve avec une heure amputée d'une minute au second calcul
Remede: rendre sa minute a l'heure
Nouveau code:
Code:
Function colonne(heure, tranche)
hdeb = Array(3, 7, 11, 15, 19)
  If (heure * 1440) Mod 2 = 0 Then
    Impair = False
  Else
    Impair = True
    heure = heure - 1 / 1440
  End If
 colonne = 4 + CInt(heure * 720 - (hdeb(tranche - 1) * 30))
[COLOR=blue]If Impair Then heure = heure + 1 / 1440[/COLOR]
End Function

Si tu le souhaites je peux commenter le code pour t'en faciliter la comprehension
en attendant tes avis je regarde comment se preoccuper des arrets non minutés (a)
 

Pièces jointes

  • Graphicage_v4.zip
    82.5 KB · Affichages: 78
  • Graphicage_v4.zip
    82.5 KB · Affichages: 79
  • Graphicage_v4.zip
    82.5 KB · Affichages: 71

pierrejean

XLDnaute Barbatruc
Re : Graphicage - tracer de segments

Re

Voila avec les points d'arrets
Ils sont en vert et un peu plus petits (comme ils se superposent au tracé ils peuvent paraitre dans une couleur composite)
J'essaie maintenant de commenter le code
PS: je te laisse le soin de la mise en place des 3 dernieres tranches (respecte bien l'ecart entre tranches)
 

Pièces jointes

  • Graphicage_v5.zip
    85.6 KB · Affichages: 78
  • Graphicage_v5.zip
    85.6 KB · Affichages: 75
  • Graphicage_v5.zip
    85.6 KB · Affichages: 81

pierrejean

XLDnaute Barbatruc
Re : Graphicage - tracer de segments

RE

Voila avec le code commenté
Ne pas hesiter a demander si quelque chose reste obscur

Ps : Je te laisse decouvrir un bus qui remonte le temps (un O qui part a 12:21 je crois)
 

Pièces jointes

  • Graphicage_v5.zip
    89.1 KB · Affichages: 157
  • Graphicage_v5.zip
    89.1 KB · Affichages: 120
  • Graphicage_v5.zip
    89.1 KB · Affichages: 164

knaekes

XLDnaute Occasionnel
Re : Graphicage - tracer de segments

Merci pour le code et Merci pour les commentaires qui vont avec ! Je mesure pleinement la qualité du travail, et j'en suis très reconnaissant. Je vais prochainement l'appliquer au tableau entier (sur 24H). Mon objectif est aussi de bien assimiler l'ensemble du code (ce que vont me faciliter, les commentaires). Je te tiens au courant!
 

Staple1600

XLDnaute Barbatruc
Re : Graphicage - tracer de segments

Bonsoir à tous


Juste un petit passage pour saluer pierrejean ;) et de le remercier de nous proposer du bien beau code VBA qui fourmille de trouvailles.

Merci pour m'avoir fourni du code à décortiquer pour ce week-end.
 

pierrejean

XLDnaute Barbatruc
Re : Graphicage - tracer de segments

Re

Salut Staple et Merci pour ton appreciation

Voila une version qui evite les 'bouts' de trajet isolés ça et la
Pour ce faire j'ai reperé les tranches pour chaque trajet et non plus pour chaque segment
Par ailleurs j'ai revu certaines fonctions et sub pour optimiser et rendre plus simples a modifier (Utilisation de Array)
Merci en particulier a Pierrot93 :) :) qui m'a montré la voie pour supprimer les Select
 

Pièces jointes

  • Graphicage_v7.zip
    86.2 KB · Affichages: 68

knaekes

XLDnaute Occasionnel
Re : Graphicage - tracer de segments

Bonjour,

Ok j'ai bien saisi les modifications. A présent le code semble s'exécuter plus rapidement qu'auparavant (moins de "plantages" (excel 2007)).Les morceaux de segments isolés sont effectivement supprimés. Mais le fait d'affecter un trajet "entier" à une tranche rend certains trajets "invisibles sur la zone d'impression".

Par exemples les trajets commençant avant 7H mais qui se prolongent au delà de 8H ne sont pas repris dans la tranche inférieure. inversement les trajets tels que 7H < H départ < 8H ne sont pas repris dans la tranche supérieure.

Je ne sais pas si ma remarque est claire, si ce n'est pas le cas il ne faut pas hésiter à me le faire savoir.

Merci !
 

pierrejean

XLDnaute Barbatruc
Re : Graphicage - tracer de segments

Re

j'ai bien compris le probleme
Dans l'exemple fourni nous avons L'Aller 7h:02 7h:38 qui se trouve dans la partie non imprimable de la tranche 2 et pas dans la tranche 1
Nous avons egalement le retour 6h:07 8h:07 qui devrait figurer en partie en tranche 1 et en tranche 2
Par contre il va me falloir etudier l'algorhitme permettant de resoudre ces cas particuliers et plus generalement les zones non imprimables
Je m'y mets mais je sollicite un petit delai !!!
 

pierrejean

XLDnaute Barbatruc
Re : Graphicage - tracer de segments

Re

Veux-tu tester cette version
Dans un 1er temps j'ai modifié l'affectation a une tranche (la version precedente ne donnait que la derniere): on a donc maintenant des trajets dans 2 tranches
Ensuite j'ai utilisé l'algorhitme suivant: Si un segment a un point dans une zone non imprimable le reporter dans la tranche immediatement superieure s'il s'agit de la zone imprimable inferieure et dans la tranche immediatement inferieure s'il s'agit de la zone imprimable superieure
Par ailleurs j'ai modifié les noms des points et segments dans l'optique eventuelle d'affichage trié (mais la on verra plus tard !)
 

Pièces jointes

  • Graphicage_v8.zip
    95.9 KB · Affichages: 57

knaekes

XLDnaute Occasionnel
Re : Graphicage - tracer de segments

Bonjour,

J'ai testé la dernière version que tu m'as envoyé, elle marche à merveille (Merci). J'essaye petit à petit de construire mon fichier excel (qui inclus le tracé de graphique). J'arrive à comprendre la structure du code, mais cela me prend encore du temps pour assimiler les différentes syntaxes. Je vais essayer de m'inspirer de certains éléments pour compléter les tableaux qui figurent sous les tableaux horaires

Voici quelques points que je souhaite encore améliorer:

1. concernant les éventuels trajets ayant des horaires > minuit
ceux-ci sont affichés par exemple 00:33. Pour cela j'ai rajouté une tranche (elle n'est pas encore déclarée dans le code) afin de tracer un cycle complet de 24H). Il faudrait (je pense) ainsi ajouter une condition "si 04:00 > H > 00:00 alors H=H+24H" et dans ce cas cela nous permettrait de poursuivre le tracé.

2. J'ai ajouté une ligne info "roulement" afin d'identifier plus facilement les lignes de roulements de matériel, et la matérialiser par un code couleur. L'idée est d'afficher soit un tracé des types de desserte, soit un tracé reprenant les roulements de matériel.

un affichage trié serait un "plus" appréciable. J'imagine pour cela un tableau comportant des cases à cocher, où l'on indique la configuration que l'on souhaite tracer (desserte [sd,t,g,c,o]) / (roulement[1,2,3,4,5,6,7,8]) puis il suffirait d'activer le tracé correspondant.

3. Dans le code tu supprimes les chiffres devant le nom de la station
Code:
ach = Right(station, Len(station) - 3)
est-il possible d'ajouter une condition: "si la chaîne de caractère fini par un Ar ou un D alors supprimer les 3 derniers caractères de la chaine (espace + Ar ou Dé); En effet je souhaite différencier dans le tableau d'entrée l'horaire de départ et d'arrivée en rajoutant Ar 'arrivée' ou Dé 'départ' pour les stations concernée (A, K, L, U)

Afin de limiter la taille du fichier
J'ai éppuré les graphiques et limité les données d'entrées.
Je n'ai affiché que 4 cases à cocher (j'essayerai de genéraliser le principe).
J'ai supprimé la bouton "tracer" (je lance la macro directement à partir de visual basic).

Les autres petites modifs concernent les épaisseur de traits

Je ne sais pas si tout cela est réalisable ni dans quel mesure.

Merci encore pour les commentaires, ils m'aident grandement !
 

Pièces jointes

  • Graphicage_v9.zip
    44.8 KB · Affichages: 44

pierrejean

XLDnaute Barbatruc
Re : Graphicage - tracer de segments

Re

Dans un premier temps
Ajout de la 6eme tranche
Mentions Dé et Ar (sur la feuille Aller)
Je jette un oeil sur le tri pendant que tu teste ces modifications
Par ailleurs je te felicite pour le serieux avec lequel tu travailles sur ce fichier et les progres rapides que tu semble faire dans la comprehension du Vba
 

Pièces jointes

  • Graphicage_v120_b.zip
    51.5 KB · Affichages: 83

knaekes

XLDnaute Occasionnel
Re : Graphicage - tracer de segments

Je ne sais pas si on peux parler de progrès rapides ... car j'avoue que ce n'est pas simple, étant donné la complexité à mon point de vue du code. Toutefois, il est certains que le fait de décortiquer (sur papier) ton code, me fait découvrir le langage Vba. Pour le sérieux, je pense que qu'il faut en faire preuve d'un minimum ne serrais-ce qu'en retour de ta remarquable disponibilité.
 

knaekes

XLDnaute Occasionnel
Re : Graphicage - tracer de segments

Bonjour,

Comment faire pour compter le nombre d'éléments différents d'une liste contenant des nombres ex: 1;2;3;4;4;5;6;6;6;8;9;10; (9 éléments)

la liste est:
Code:
arrets = arrets & f.Cells(m, 1) & ";"

Merci
 

pierrejean

XLDnaute Barbatruc
Re : Graphicage - tracer de segments

Re

Une solution:

Code:
Sub test()
arrets = "1;2;3;4;4;5;6;6;6;8;9;10;"
MsgBox (nb_el_diff(arrets, ";"))
End Sub
 
Function nb_el_diff(unstring, separateur)
Set coll = New Collection
 If Right(unstring, 1) = separateur Then
  strg = Left(unstring, Len(unstring) - 1)
 Else
  strg = unstring
 End If
 tablo = Split(strg, separateur)
For n = LBound(tablo) To UBound(tablo)
  On Error Resume Next
   coll.Add tablo(n), CStr(tablo(n))
  On Error GoTo 0
 Next n
 nb_el_diff = coll.Count
End Function

ceci a-t-il un rapport avec ce qui nous occupe ?
Il peut y avoir une methode permettant de n'ajouter a arrets qu'un element qui n'y figure pas encore ce qui donnerait ( a tester) :

Code:
....
If InStr(arrets, f.Cells(m, 1)) & ";" = 0 Then arrets = arrets & f.Cells(m, 1) & ";"
.....
'puis
arrets=left(arrets,len(arrets)-1)
nb_el=ubound(split(arrets,";"))+1
 

Statistiques des forums

Discussions
314 051
Messages
2 105 057
Membres
109 242
dernier inscrit
zaboul2