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)
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)
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)
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!
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
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.
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 !!!
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 !)
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 !
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
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é.
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) :