Réservations groupées - Next level

Bonjour,

Je reviens vers vous concernant un sujet que je pensais réglé. Malheureusement j’ai mal pensé mon fichier, on me demande maintenant de choisir moi-même mes tranches tarifaires selon des classes de service (5 au niveau standard, 5 au niveau premium, et s’il s’agit d’un voyage en train ou en avion il faut composer une tranche tarifaire en liant l’aller et le retour ; le prix sera en stendard ou en premium mais jamais les deux, aussi l’opérateur ne remplira que les cases utiles soit de B5 à C9 ou de B10 à C14 ainsi que de B2 à D2)

J’essaie de créer une macro qui remplisse les cases oranges du tableau vert sur la base d’une ligne = une tranche tarifaire, puis reporte ces lignes du tableau vert au tableau bleu, puis remplisse les cases oranges dudit tableau.

J’ai mis un exemple concret (voyage en train pour 80 personnes) ; Le premier onglet représente mon fichier à l’ouverture et le deuxième ce que je souhaite obtenir dans mon exemple.

J’ai tenté d’adapter la solution proposée par FFO dans ma première version mais j’ai dû louper une étape :sweat:

Je vous joins ma démo ainsi que la solution proposée par FFO dont le code source de la macro est particulièrement bien détaillé

Merci de votre aide

Je précise que je n’ai pas mis les vrais noms de classes de service, aussi dois-je pouvoir les modifier sans bousiller la macro :slight_smile:

Démo.xlsm (33,6 Ko) Solution FFO.xlsm (32,4 Ko)

Bonjour

Pas facile à comprendre

Sur ta démo je ne comprends pas pourquoi tu as un résultat sur 3 lignes alors que sur 2 lignes c’est suffisant compte tenu des disponibilités offertes :

106 places offertes
63 places souhaitées
18+38+7 = 63

Pourquoi 2 lignes ?

Il me faut des explications

Autre points

Ou trouves tu tes références mis en colonne A dans la partie résultat à partir de la ligne 17 :
Ligne5
Ligne6
Ligne7

A moins que cela soit à titre d’information pour donner les numéros de lignes en correspondance mais alors que doit on mettre dans ces cellules en tant que Référence ?

Je te joint une proposition
Onglet « Vue à l’ouverture » bouton « Traitement » relié à une macro « Traitement2 »
Pour la Tranche Tarifaire de chaque ligne j’ai considéré les disponibilités de la ligne traité concernant le retour si celle-ci est insuffisante j’inclus les disponibilités de la ligne suivante
Maintenant je ne cumule pas les besoins

A cette fin il faudra trouver une colonne pour les écrémenter et se servir du résultat

A toi de me dire ce que tu attends

Démo.xlsm (42,1 Ko)

Bonjour FFO,

Merci pour ta proposition

Je comprends pourquoi tu n’as eu besoin que de deux lignes : quand tu prends des places dans les classes de service pour un premier dossier, elles ne sont plus disponibles.

Autrement dit, avant la réservation, on a 17 places en standard 1 à l’aller mais on n’en a pas au retour, il faut donc prendre du standard 2 pour le retour. Du coup, on se retrouve avec les disponibilités suivantes pour le deuxième dossier : 169 places en standard 2 à l’aller, 73 - 17 = 56 places en standard 2 au retour. Il reste donc 7 places à réserver, d’où le 3ème dossier, pour lequel on n’a plus de standard 2 au retour…

Le premier tableau m’indique qu’il faut que je réserve mes 80 places en 3 fois :

  • 17 places en standard 1 à l’aller, 17 places en standard 2 au retour
  • 56 places en standard 2 à l’aller et au retour
  • 7 places en standard 2 à l’aller, 7 places en standard 3 au retour.

Ensuite et pour optimiser ma réservation (j’entends faire payer le moins possible aux participants), il faut distribuer ces places selon la tranche d’âge. Les places les moins chères doivent aller en priorité aux adultes, puis aux jeunes et enfin aux enfants.
Standard 1 est le moins cher, standard 5 le plein tarif. Le premier dossier (S1 - S2) contient 17 places et on a 15 adultes, donc il reste 2 places à attribuer à des jeunes. le deuxième dossier (S2 - S2) contient 56 places et il reste 18 jeunes à placer, donc les 38 places restantes vont aux enfants. Le dernier dossier va aux enfants aussi.

J’espère être le plus clair possible (c’est dur de condenser 3 semaines de formation en une demi-page), dis-moi si tu as tous les éléments en main :slight_smile:

Encore merci pour ton implication

Je viens de voir sur ton screenshot que je m’étais trompé, pour le dossier 2 il fallait lire st2 - st3 :sweat_smile:

Pour les références, j’ai effectivement fait référence au premier tableau - Il n’est pas nécessaire de les nommer, je compte d’ailleurs virer cette colonne qui ne me sert à rien

Je ne vois pas comment un seul tableau peut clairement établir les besoins en aller et en retour
Il y a des chiffres mais rien n’indique leur fonction : aller ou retour
Si toi tu y arrives chapeau bas moi c’est à ce niveau inintelligible
Je pense que 2 tableaux distincts un pour l’aller un pour le retour avec le même traitement seraient l’idéale et nettement plus compréhensible et d’avoir dans celui aller pour la ligne en litige 18 jeunes et 45 enfants ligne Standart2 et pour celui retour 18 jeunes 38 enfants en Standard2 et 7 enfants en Standard3
Ce serait bien plus compréhensible
Ton tableau en l’état je n’y ai rien compris

De plus le traitement est déjà opérationnel il suffit de le dédoubler et de prendre les disponibilités correspondantes

Maintenant à toi de voir

Il s’agit d’une contrainte inhérente au logiciel de réservation : il crée des voyages aller-retour dans un seul dossier.

Aussi mon tableau s’efforce de ressembler le plus possible à ce logiciel.

Crois-moi, s’il était possible de créer les réservations aller et retour séparément, je ne me casserais pas la tête à créer un fichier Excel car il est tout à fait capable de répartir les places convenablement sur un aller simple.

Aussi je vais regarder le code de ta macro et tenter de l’adapter à mes contraintes techniques…

Merci pour ton aide

Très bien je te laisse faire mais tu risques d avoir du fil à retordre car avec un seul tableau si déjà c est pas simple à apréhander soi même bonjour la macro !!!
A toi de voir

Oui je comprends ton point de vue.

De toute façon aucune machine n’est capable d’appréhender la complexité du raisonnement humain.

Je vais essayer quand même. Je suis en train de plancher sur un logigramme qui me permettra de programmer ma macro pas à pas.

Ce qu’il y a c’est que je ne programme pas manuellement depuis longtemps et je n’ai pas vraiment appris, je pioche des commandes par-ci, par là dans des macros existantes et j’essaie de comprendre ce que le programmeur a voulu faire

C’est fastidieux car comme je n’ai pas les bases il me faut une éternité pour comprendre mon erreur quand une macro plante ou ne fait pas ce que je voudrais mais j’y arrive

Je te montrerai mon fichier, si tu veux bien j’aimerais que tu corriges mes erreurs de profane…

Ca y est, j 'ai réussi !

Voici le fichier final, si tu voulais bien analyser ma macro et me dire s’il y avait plus simple (par exemple, s’il existe une commande pour comparer n valeurs et sélectionner la plus petite)

Je suis toujours partant pour m’améliorer

Démo.xlsm (38,7 Ko)

Après analyse de ton code
Première impression c’est sa complexité dans son déroulement indépendamment du nombre de lignes qui malgré tout n’est pas anodin
Je pense que mes 2 tableaux utilisant de surcroit le même déroulement aurait gagné en simplicité
Tu dis que tu n’es pas maitre de ce que l’on te transmet certes mais tu es celui de ce que tu en fais et de scinder la source en 2 tableaux aurait très bien pu se réaliser

J’ai plusieurs remarque sur ton code proprement dit
Bien construit je dois l’admettre on sent une certaine expérience dans le domaine
Toute fois cette ligne inutile :

For i = 5 To derligne
If Range(« B » & i) <> 0 Then
Range(« D » & ligne) = Range(« A » & i)
'Ces données servent plus loin
CSA = Range(« B » & i)
LigA = i
Exit For

    Else 'INUTILE

    End If
Next

Idem pour la 2° partie identique qui suit :

For i = 5 To derligne
If Range(« C » & i) <> 0 Then
Range(« E » & ligne) = Range(« A » & i)
'Ces données servent plus loin
CSR = Range(« C » & i)
LigR = i
Exit For

    Else 'INUTILE

    End If
Next

Tu n’as pas traité tes tableaux de manière dynamique ciblant les lignes de manière figée

exemple :

For i = 5 To 14

LigneB = 17

etc…

Je t’ai construit une variable qui cible la ligne colonne A de la donnée « Référence » et de déterminer celle juste avant

Ainsi quelque soit l’ampleur du premier tableau ton code reste opérationnel sans aucune intervention
La variable :

derligne

et d’adapter ces lignes de code qui en font appel :

For i = 5 To derligne

LigneB = derligne + 2

Regardes mes modifications dans cet esprit

Si cela ne te convient pas mets au moins en début de code cette variable par exemple avec sa valeur au quelle tu fait appel dans les lignes qui en ont besoin
L’intérêt et de n’avoir qu’à retoucher qu’un paramètre si besoin été car le premier tableau peu fluctuer avec le temps
Donc en début de procédure tu mets :

derligne = 17

Puis les lignes qui doivent en bénéficier :

For i = 5 To derligne

LigneB = derligne + 2

le jour ou il faut traiter jusqu’à la ligne 27 simplement à adapter la ligne du début :

derligne = 27

et le reste suit

Une autre interrogation ici avec tes commentaires :

'Il y a assez de places au retour mais pas à l’aller : on prend toutes les places de l’aller et autant au retour

Alors quid du restant du retour ???

Dans ton traitement tu analyses en fonction des besoins celles de l’aller ou du retour qui ne rentre pas dans le moule des disponibilités d’établir le nombre de places en fonction de ce que la disponibilité lui permet et ce pour les deux ce qui revient à amputer celui qui était dans le moule des places non prises

Ces places perdues dans ton traitement ne sont pas considérées

Pour un prix « X1 » j’ai 10 aller 15 retour
Disponibilité 8 aller 20 retour
Ton traitement prends 8 aller 8 retour soit 16 trajets au prix X1
les 7 retours manquant seront prix sur la ligne suivante au prix « X2 »
Donc pour les retour 8 au prix X1 7 au prix X2
Il aurait été plus économiques pour le retour de tout prendre au prix « X1 » soit les 15 retour
Car si je ne me trompe pas au fur et à mesure des lignes les tarifs augmentent donc Tarif « X2 » plus élevé que tarif « X1 »

Mais ton traitement ne gère pas dans ce sens

Voilà ce que je peux dire sur ta réalisation

Je te joins ton fichier avec mes petites évolutions et annotations

A ta disposition pour échanger

Démo2.xlsm (35,9 Ko)

OK je prends bonne note pour une construction plus dynamique de ma macro, je vais tester.

En revanche pour mon commentaire… Malheureusement c’est la réalité du fonctionnement de mon logiciel de réservations.

Les disponibilités aller et retour sont totalement indépendantes, et c’est ça qui crée la difficulté. Evidemment, la solution la plus économique serait de réserver séparément l’aller et le retour mais là, c’est mon CRM qui bloque (impossible de lier les dossiers s’ils ne sont pas rattachés électroniquement entre eux :exploding_head:)

Les tranches tarifaires fonctionnent sur le modèle du « meuble à tiroirs » : imagine un bureau avec 5 tiroirs à gauche (pour l’aller) et 5 à droite (pour le retour). Lors de ma demande de réservation, l’opérateur « ouvre les tiroirs » et prend les coupons qui s’y trouvent. Dans mon exemple, le premier tiroir de gauche contient 17 coupons « standard 1 », soit pas assez pour le total. Il prend tout et s’occupe du retour. Il ouvre le premier tiroir de droite et ne trouve rien. Il ouvre le deuxième tiroir et trouve 73 coupons « standard 2 ». Comme il a commencé une réservation pour 17 personnes, il prend 17 coupons et referme le tiroir. Il crée un premier dossier avec les places réservées de cette façon. Si le contingent souhaité n’est pas atteint, il recommence l’opération, et ainsi de suite jusqu’à ce que toutes les places soient prises.

Evidemment on ne voit pas de tiroirs, mais deux suites de chiffres matérialisant le nombre de dispos à l’aller puis au retour, c’est un bo…el sans nom. Un bon opérateur va créer l’ensemble de ses dossiers puis les dispatcher par tranche d’âge en 10 minutes environs. Je te laisse imaginer un nouveau tout droit sorti du centre de formation…

Merci en tout cas pour ton aide, précieuse comme toujours

Merci pour tes explications
L’essentiel avant tout autres considérations c’est que tu soit satisfait
Si donc tu l’es moi je le suis
Bon courage pour la suite et peut être à bientôt