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)