Combinaison de deux nombres

  • Initiateur de la discussion Initiateur de la discussion FXL
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

F

FXL

Guest
Bonjour à tous,

J'ai cherché dans les précédentes discussions une solution pour répondre à mon problème, mais étant toute débutante en excel je n'arrive pas à adapter les réponses à mon cas..

Voici la situation :
J'ai des numéros de lignes de bus.
Chaque ligne traverse des zones.
Mon objectif est d'obtenir, pour chaque ligne, toutes les combinaisons possibles de deux zones traversées par cette ligne.

Par exemple :
Ligne 106 passe par les zones 232, 233 et 236.
Je souhaite obtenir les résultats
232 232
232 233
232 236
233 233
233 236
236 236

je laisse mon fichier excel joint pour mieux visualiser la situation.

A toute bonne âme pouvant m'aider...... Merci beaucoup beaucoup !
 

Pièces jointes

Re : Combinaison de deux nombres

Bonsoir.
Voyez si cela vous convient.

P.S. je l'ai re-joint sans 2 instructions inutile et bug corrigé dû à mauvaise comparaison de fin.
Remarque: Je me suis conformé au modèle, où seul le nombre de zone traversées n'est indiqué que sur la 1ère ligne de chaque numéro de ligne de bus. Mais il me paraitrait plus logique et plus lisible de ne répéter non plus les numéro eux même sur les suivantes. La modif serait très simple à faire.
À +
 

Pièces jointes

Dernière édition:
Re : Combinaison de deux nombres

Bonjour à tous,

Tout d'abord un GRAND GRAND merci pour votre aide qui m'a été trèèès précieuse.

J'ai essayé de reprendre le principe de vos scripts + des aides VBA sur internet pour résoudre mon nouveau problème, mais je n'y arrive définitivement pas....!

Cette fois-ci, j'ai :
- des zones (A1, A2, ... U ) et des communes comprises dans ces zones. (Tableau à entête orange)
- des combinaisons des zones ( par exemple : A1;A1 A4;B14 ... ). (tableau à entête jaune)

Mon objectif est d'afficher dans le tableau à entête rose toutes les combinaisons de communes qui correspondent à ces combinaisons de zones.

Par exemple, de la Zone A1 à A1, il y a 29 * 29 communes concernées, ce qui donne donc 841 combinaisons de communes possibles.

Je laisse le fichier en pièce jointe pour être mieux comprise, et si vous avez une solution, je vous en serais très reconnaissante !
 

Pièces jointes

Re : Combinaison de deux nombres

Ca fonctionne, c'est parfait !

Je vois que vous avez écrit la "traduction" de chaque étape en vert dans le code. Je dois m'y pencher plus longuement pour bien comprendre la méthode, car ça me parait assez complexe à première vue.
En tout cas c'est vraiment gentil de l'avoir détaillée.

Encore un grand merci !

Cordialement,
 
Re : Combinaison de deux nombres

Bonjour.
Le détail est peut être complexe, mais pas le principe général. On classe la liste (ou plus exactement on établit la liste des numéros de lignes dans l'ordre des argument, on ne déplace pas ceux-ci) puis on l'explore par ordre croissant, et à chaque rupture de séquence sur un argument on envoie ce qui y était attaché comme item dans un Dictionary.
De toute façon ce n'est pas comme s'il fallait l'adapter pour chaque utilisation spécifique: c'est un module à usage général. À l'utilisation, la fabrication du dictionnaire arborescent c'est juste une fonction à paramétrer convenablement. Pour son exploitation derrière, bien s'instruire de ses particularités expliquées en tête du module MDictionnArbo, après avoir commencé, s'il y a lieu, par étudier dans l'aide ce qu'est déjà un Dictionary ordinaire.
Cordialement.
 
Re : Combinaison de deux nombres

Bonjour,

Au risque d'abuser de tes compétences, j'ai une nouvelle question.

Le fichier joint présente 4 feuilles :
- le 1er : dans la 1ere colonne la ligne de transport et dans la 2e le nombre de villes traversées
- le 2e : le détail des communes par ligne
- le 3e : des données par lignes
- le 4e : mon onglet de résultats

Mon objectif est d'obtenir de transformer les données par lignes en données par communes.
Pour ce faire, je sais combien de communes sont traversées par chaque ligne, et à combien de combinaisons de communes cela correspond.

J'ai donc commencé à écrire un code dans la macro1 mais je ne m'en sorts pas:

A. Je prends la troisième ligne du 3e onglet, je la colle dans la 2e ligne du 4e onglet en la divisant par le nombre de combinaisons (chiffre de la 3e colonne).
Ensuite, je copie colle cette nouvelle ligne autant de fois qu'il n'y a de combinaisons (donc 169x pour la première ligne).

B. Mon soucis c'est ensuite d'écrire les combinaisons de communes dans les 4e et 5e colonnes.
Il faut que je cherche toutes les combinaisons de communes qui sont traversées par la ligne. Je dois donc avoir 169 combinaisons à écrire, par ex :
D2 : 68147 E2 : 68147
D3 : 68147 E3 : 68383
etc...

Et ensuite, il faut que je réitère l'étape A et l'étape B pour toutes les lignes.
Je devrais donc avoir à la fin 8703 lignes.

Merci encore pour votre aide,

Cordialement,
 

Pièces jointes

Re : Combinaison de deux nombres

Je suis désolée, comme j'y planche depuis longtemps je n'ai pas été très claire.

L'onglet "freq_lignes" présente des données par ligne de transports. Chaque ligne du tableau correspond donc à une ligne de transport (106,109...)

Ces lignes de transports traversent des communes. L'onglet "nb_com_par_ligne" donne le nombre de communes traversées par chacune des lignes, et l'onglet "communes_par_lignes" nous donne les numéros identifiants de ces communes. (la ligne 106 passe donc par les communes 68383, 68147, 68005, 68026, 68009..)

Je souhaite diviser les données de chaque ligne de transports par itinéraires possibles entre les communes deux à deux.
Par exemple, une ligne de transport L1 qui traverse les communes A, B et C donnera 9 itinéraires possibles : A-A ; A-B ; A-C ; B-A ; B-B ; B-C ; C-A ; C-B ; C-C.

Mon hypothèse est que les données relatives à chaque itinéraires entre 2 communes traversées par la ligne L1 seront égales aux données de la ligne de transport L1 / 9 ( le nombre d'itinéraires possibles entre les communes de la ligne L1)

Il y a donc selon moi deux boucles imbriquées à construire :

- La première : Diviser les données de chaque ligne de transport par le nombre n d'itinéraires possibles entre communes de la ligne ; et les réécrire n fois pour conserver le même total

- La deuxième : Écrire les itinéraires de communes correspondants sur les n lignes du tableur.
Ces itinéraires correspondent à des combinaisons trouvées grâce à l'onglet "communes_par_ligne". Pour la ligne de transport 106, les itinéraires possibles seront donc au nombre de 13 * 13, à savoir 68147 - 68147 ; 68147 -
68383 ; etc.

Je ne sais pas si c'est plus explicite..

Merci pour votre aide.

Cordialement,
 
Re : Combinaison de deux nombres

Bon, je m'y suis remis.
Je n'arrive qu'à 8568 combinaisons car il manque les informations de fréquences des bus 831 et 832.
Là encore, ça ne vaut pas le coup de réinventer la poudre: pour stocker des table entières de numéros d'ordres de communes accessibles en une fois par numéro de bus: ce sera le dictionnaire arborescent !
VB:
Private Sub Worksheet_Activate()
Dim Dico As Dictionary, Communes() As Variant, FréqBus() As Variant, FréqIti() As Double, _
   Le As Long, TNuC() As Long, NbComm As Long, NbOD As Long, C As Long, _
   Ts() As Variant, N1 As Long, N2 As Long, Ls As Long
Communes = Feuil2.Range("G2:G" & Feuil2.[A65536].End(xlUp).Row).Value
Set Dico = DictionnArbo(Feuil2.[A2].Resize(UBound(Communes)))
FréqBus = Feuil3.Range("A3:Y" & Feuil3.[A65536].End(xlUp).Row - 1).Value
ReDim FréqIti(1 To UBound(FréqBus, 2) - 1)
ReDim Ts(1 To 60000, 1 To 29)
For Le = 1 To UBound(FréqBus)
   TNuC = Dico(CStr(FréqBus(Le, 1))): NbComm = UBound(TNuC): NbOD = NbComm ^ 2
   For C = 1 To UBound(FréqIti): FréqIti(C) = FréqBus(Le, C + 1) / NbOD: Next C
   For N1 = 1 To NbComm: For N2 = 1 To NbComm
      Ls = Ls + 1
      Ts(Ls, 1) = FréqBus(Le, 1)
      Ts(Ls, 2) = NbComm
      Ts(Ls, 3) = NbOD
      Ts(Ls, 4) = Communes(TNuC(N1), 1)
      Ts(Ls, 5) = Communes(TNuC(N2), 1)
      For C = 1 To UBound(FréqIti): Ts(Ls, 5 + C) = FréqIti(C): Next C
      Next N2: Next N1
   Next Le
Me.[A2:AC65536].ClearContents
Me.[A2].Resize(UBound(Ts, 1), UBound(Ts, 2)) = Ts
End Sub
À mettre dans le module "Feuil4 (Résultat)"
S'il s'agit d'un autre classeur que les précédents, n'oubliez pas d'y adjoindre le module MDictionnArbo, le module de classe TableIndex et d'ajouter ou projet la référenc "Microsoft Scripting Runtime"
 
Re : Combinaison de deux nombres

Le dictionnaire arborescent est donc encore la clé !

Merci encore beaucoup d'y avoir repassé du temps et de l'énergie, effectivement il manque les infos pour certaines lignes c'est donc normal d'arriver à ce nombre de combinaisons.

Merci merci merci à vous 🙂
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
6
Affichages
327
Réponses
2
Affichages
533
Réponses
6
Affichages
1 K
R
Réponses
3
Affichages
832
Retour