XL 2019 Changer valeur boucle for par valeur range

Hoareau

XLDnaute Occasionnel
Bonjour

J'ai une boucle for, dans laquelle, je veux changer les valeurs e m et n par les valeurs du ange
Actuellement seulement le couplé 100,200 apparait
dans le range se trouve 100,200,300,400,500,600,700,800,900,1000

100 200 qui en fait est le couplé 1 2

Sub test()
Dim Tab_couple_a_supprimer(1 To 20, 1 To 1)

Set plage = Sheets("feuil2").Range("Y4:Y23")

Tab_couple_a_supprime = plage.Value

For m = 1 To 17
For n = m + 1 To 18

m = Tab_couple_a_supprime(m, 1)
n = Tab_couple_a_supprime(n, 1)

Next n, m

merci
 

Hoareau

XLDnaute Occasionnel
effectivement
j'ai trié le résultat et comparé avec mes combinaisons de référence, le compte y est
pas d'erreur 9, quand la macro est isolée, à première vue
Je vais aussi mettre le range en relatif, parce que le nombre de chiffre peut changer, je ne pense pas que cela change quelque chose au fonctionnement de la macro
ça me déstabilise un peut de les voir dans cette configuration
en supposant que veuille faire la même chose avec des combinaisons de trois ou plus; quelles lignes faut-il modifier
merci
 

Pièces jointes

  • Resultats test macro _2.xlsm
    23.2 KB · Affichages: 11

Dranreb

XLDnaute Barbatruc
Bonjour.
Je n'ai pas actuellement de fonction permettant de simuler des tableaux pyramideaux voire hyper-pyramideaux, autrement dit de linéariser des assemblages de plus de 2 numéros, leur attribuant un indice permettant de ranger des informations à leur associer dans un tableau à une seule dimension. Mais je pense que ça devrait pouvoir s'écrire si vous me montriez que vous en auriez besoin. Ce n'est pas sûr parce que ce n'est pas la même chose que de collecter des caractéristiques de toutes les confrontations de 2 contenues dans des groupes de plus de 2 par exemple.
 
Dernière édition:

Hoareau

XLDnaute Occasionnel
Je me posais la question de savoir si vous dormiez; j'ai posté mon message vers 2h (+2 ou 3 heures décalage métropole), réponse arrivée tôt ce matin

ce n'est pas la peine, trop compliqué, je me demandais; juste si en utilisant ce procédé on pouvait le faire pour des associaions de 3,4, ou5
En connaissant là,il faut modifier, j'aurrais essayé

sur autre sujet, je ne pense pas ouvrir un fil pou cela

J'essai de modifier la sub communs de Boisgonthier, pour en faire une fonction
Je bute sur le transfert du dico sur la feulle car dans la sub c'est une réference absolue
j'ai essayé location en troisième paramêtre, mais cela ne pas, location devant être c.offfset

Function Communs(ByVal Plage_1 As Range, ByVal Plage_2 As Range, Location)
A = Plage_1
Set MonDico1 = CreateObject("Scripting.Dictionary")
For Each c In A
MonDico1(c) = ""
Next c
b = Plage_2
Set MonDico2 = CreateObject("Scripting.Dictionary")
For Each c In b
If MonDico1.exists(c) Then If Not MonDico2.exists(c) Then MonDico2(c) = ""
Next c
Location.Resize(MonDico2.Count, 1) = Application.Transpose(MonDico2.keys)
End Function
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne sais pas. Personnellement je n'utilise jamais = CreateObject("Scripting.Dictionary"), je préfère = New Dictionary, la variable ayant été déclarée et typée As Dictionary, après avoir coché la référence "Microsoft Scripting Runtime" (fichier scrrun.dll, alors chargé en tant que bibliothèque Scripting). C'est très légèrement plus performant, et surtout ça offre une assistance à la programmation en suggérant les membres de l'objet sélectionnables dans une liste dès qu'on tape un point derrière le nom de la variable.
 

Hoareau

XLDnaute Occasionnel
Différence entre 2 listes
Dans un module (alt+F11 Insertion/Module)
Function Diff(champ1 As Range, champ2 As Range)
Set MonDico1 = CreateObject("Scripting.Dictionary")
a = champ1.Value
b = champ2.Value
For Each c In b: MonDico1(c) = c: Next c
Set mondico2 = CreateObject("Scripting.Dictionary")
For Each c In a
If Not MonDico1.Exists(c) Then mondico2(c) = c
Next c
Dim d()
ReDim d(1 To Application.Caller.Rows.Count)
i = 1
For Each c In mondico2.items
d(i) = c
i = i + 1
Next c
Diff = Application.Transpose(d)
End Function
 

Dranreb

XLDnaute Barbatruc
Le problème depuis le début, c'est que la bonne solution est si évidente qu'on ne peut même plus comprendre ce que vous vouliez en voyant ce que que vous avez essayé, qui ne peut jamais rien donner de cohérent. Comment voudriez vous qu'on le comprenne mieux que le compilateur ?
 

Hoareau

XLDnaute Occasionnel
Bonjour

Après test, je me suis aperçu, qu'il n'est pas posible d'incorporer le code dans ma boucle principale

Donc, je récupère, le résultat dans un dico, pour le mettre sur la feuille d'où je pourrai récupérer le resultat
Mais le code donne les couplés dans un seul bloc d'éléments, alors que j'ai besoin d'élément séparés
comment faire pour séparer les diférents élements du résultat, car il ne sont pas utilisables en l'état à savoir les comparer
merci
 

Pièces jointes

  • Resultats test macro _3.xlsm
    29 KB · Affichages: 22

Dranreb

XLDnaute Barbatruc
Bonjour.
Ben si c'est pour l'envoyer dans une plage ne prenez plus comme TRés un tableau String mais Variant et ne faites plus de concaténation, au Redim spécifiez lui 2 colonnes en plus des lignes.
J'ai ouvert votre classeur après avoir avoir commencé cette réponse. Je vois que vous n'avez toujours pas compris que la fonction VersusJA est justement faite pour ne plus avoir besoin d'un Dictionary avec comme clé la concaténation des indices. Elle donne directement un indice dépendant des deux numéros.
 

Hoareau

XLDnaute Occasionnel
Que ce soit avec dico ou pas, le but depuis le début, c'est récupérer les couplés et pouvoir les injecter dans ma boucle pour pouvoir les comparer

- Pas possible de mettre votre macro dans ma boucle, pour en récupérer le résultat, du moins moi, je ne sais pas
Il reste quoi comme choix, moi je ne sais pas c'est pour cela que je passe par le dico
 

Dranreb

XLDnaute Barbatruc
Mais ils sont où ces couplés à récupérer ? Dans quelle plage de 2 colonnes ? Et les comparer à quoi ? Deux couplés sont identique s'ils ont le même indice versus donné par VersusJA.
Vous voulez le nombre de fois que chacun apparait ? Facile tout ça !
Ce sont les colonnes A et B ? Ben non, puisqu'ils y sont tous une seule fois. Alors quoi ?
Il serait même très facile de compter tous les couplés contenus dans un ensemble de groupes de x chevaux par exemple. Mais c'est à faire en amont de la sortie du résultat. Et il s'agirait alors peut être de ne plus sortir les couplés de tous les versus possibles, mais seulement de ceux qui ont été trouvés par exemple. C'est pour ça qu'il existe aussi la Sub CalcJAVersus, secondaire, qui permet de reconstituer, en sortie, les deux numéros en fonction de leur indice versus. Mais en réalité on en a rarement besoin.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Réponse au poste #41.
Dim … TS() As Variant, …

ReDim TS(1 To VersusJA(UBound(T, 1) - 1, UBound(T, 1)) + 1, 1 To 2)

TS(LS, 1) = T(L1, 1)
TS(LS, 2) = T(L2, 1)

Feuil1.[X4].Resize(UBound(TS, 1), 2).Value = TS
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
328

Statistiques des forums

Discussions
312 248
Messages
2 086 593
Membres
103 248
dernier inscrit
Happycat