XL 2013 encore un truc chelou

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
j'ai une simple macro qui me permet de faire la liste de toute les combinaisons de 4 nombre sur 10
alors
oui elle fonctionne
oui elle ne me fait pas de doublons
oui elle est rapide

mais il y a un petit soucis
c'est qu'elle ne devrait pas
en effet j' ai 4 boucle imbriquées
chacune démarrant a l'index + 1 de la précédente et allant jusqu'au ubound c'est a dire à 10
arrivé a un moment la boucle a,b,c,d devrait me donner par exemple x 10 10 10 ce qui serait une combinaison erronée bien sur
mais voyez vous elle ne le fait pas
alors par quel miracle vbaistique divinatoire magical évènementiel mon résultat est correct
pour info je contrôle avec une fonction combin qui me donne bien 210 combinaisons possible et mes boucle me donnent la même chose

ais-je raté un épisode ?
VB:
Sub test()
[A:E].ClearContents
Dim tbl, tblFinal(), a&, b, c&, d&
ReDim tblFinal(1 To NbCombi(10, 4), 1 To 4)
tbl = Application.Index(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 1, 0)
For a = 1 To UBound(tbl)
For b = a + 1 To UBound(tbl)
For c = b + 1 To UBound(tbl)
For d = c + 1 To UBound(tbl)
q = q + 1
'Cells(q, 1).Resize(, 4) = Array(tbl(a), tbl(b), tbl(c), tbl(d))
tblFinal(q, 1) = tbl(a)
tblFinal(q, 2) = tbl(b)
tblFinal(q, 3) = tbl(c)
tblFinal(q, 4) = tbl(d)


Next d, c, b, a
Cells(1, 1).Resize(UBound(tblFinal), 4) = tblFinal

End Sub
Function NbCombi(Base#, N#)
'FORMULE PATRICKTOULON Developpez.com
    NbCombi = WorksheetFunction.Combin(Base, N)    ' avec worksheetfunction
End Function

y a que moi pour venir se plaindre que ça marche bien 🤣 ;) 🤣🤣🤣🤣🤣🤣🤣
 

patricktoulon

XLDnaute Barbatruc
Incroyable qu'un truc aussi simple m'ai échappé

diabolo.gif
 

patricktoulon

XLDnaute Barbatruc
re
@job75 voilà c'est ça
et c'est toofatboy qui a mis le doigt dessus
là tout de suite c'est plus clair
comme quoi des fois la comm....

@mapomme
pas mal ta fonction
cependant car il y a toujours un mais avec moi tu sais bien
cette fonction ne fait qu'utiliser les index des boucles
sur le mien c'est 1,2,3,4,5,6,7,8... mais ca peut être 12,54,82,67,19,64.....
a,b,c,d ne sont que les indexs
voir si on peut mettre ca en place dans la tienne ;)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
pas mal ta fonction
cependant car il y a toujours un mais avec moi tu sais bien
cette fonction ne fait qu'utiliser les index des boucles
sur le mien c'est 1,2,3,4,5,6,7,8... mais ca peut être 12,54,82,67,19,64.....
a,b,c,d ne sont que les indexs
voir si on peut mettre ca en place dans la tienne
Ben voyons !

Une fois qu'on a le tableau des combinaisons, il suffit de faire un adressage indirect entre les combinaisons de 1 à n et les n éléments du tableau source !

Et d'autre part, ma fonction n'utilise pas de boucle. C'est ce qui la rend paramétrable.
 

patricktoulon

XLDnaute Barbatruc
re

@mapomme
oui je m'en doute mais ça fait des actions en plus
certainement des boucles

quoi que !!!!
y aurait il pas moyen de mettre une variable tableau MAP du tableau d'index obtenu ?
en même temps que le remplissage du tableau d'index ;)
un argument suplémentaire dans la fonction injectant le tableau de valeur a combiner
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @patricktoulon ;),

On peut l'intégrer dans la fonction. Je ne l'avais pas fait pour rester dans le cas le plus général.
Sinon dans le fichier joint, une démo pour revenir aux éléments sources.
Une seule (longue ligne) suffit pour passer dans le tableau résultat res aux éléments du tableau source.

VB:
For i = 1 To UBound(res): For j = 1 To UBound(res, 2): res(i, j) = source(res(i, j), 1): Next j, i

Voir le fichier joint.
 

Pièces jointes

  • mapomme- demo combi- v1.xlsm
    74.9 KB · Affichages: 15
Dernière édition:

CB70170

XLDnaute Nouveau
Bonjour à tous
j'ai une simple macro qui me permet de faire la liste de toute les combinaisons de 4 nombre sur 10
alors
oui elle fonctionne
oui elle ne me fait pas de doublons
oui elle est rapide

mais il y a un petit soucis
c'est qu'elle ne devrait pas
en effet j' ai 4 boucle imbriquées
chacune démarrant a l'index + 1 de la précédente et allant jusqu'au ubound c'est a dire à 10
arrivé a un moment la boucle a,b,c,d devrait me donner par exemple x 10 10 10 ce qui serait une combinaison erronée bien sur
mais voyez vous elle ne le fait pas
alors par quel miracle vbaistique divinatoire magical évènementiel mon résultat est correct
pour info je contrôle avec une fonction combin qui me donne bien 210 combinaisons possible et mes boucle me donnent la même chose

ais-je raté un épisode ?
VB:
Sub test()
[A:E].ClearContents
Dim tbl, tblFinal(), a&, b, c&, d&
ReDim tblFinal(1 To NbCombi(10, 4), 1 To 4)
tbl = Application.Index(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 1, 0)
For a = 1 To UBound(tbl)
For b = a + 1 To UBound(tbl)
For c = b + 1 To UBound(tbl)
For d = c + 1 To UBound(tbl)
q = q + 1
'Cells(q, 1).Resize(, 4) = Array(tbl(a), tbl(b), tbl(c), tbl(d))
tblFinal(q, 1) = tbl(a)
tblFinal(q, 2) = tbl(b)
tblFinal(q, 3) = tbl(c)
tblFinal(q, 4) = tbl(d)


Next d, c, b, a
Cells(1, 1).Resize(UBound(tblFinal), 4) = tblFinal

End Sub
Function NbCombi(Base#, N#)
'FORMULE PATRICKTOULON Developpez.com
    NbCombi = WorksheetFunction.Combin(Base, N)    ' avec worksheetfunction
End Function

y a que moi pour venir se plaindre que ça marche bien 🤣 ;) 🤣🤣🤣🤣🤣🤣🤣


voilà une analyse :

Le code fourni est un macro VBA qui remplit un tableau 2D avec toutes les combinaisons de 4 nombres choisis parmi les nombres de 1 à 10. Le résultat final est stocké dans la variable tblFinal, qui est ensuite affichée dans les cellules de la feuille de calcul à partir de la cellule A1.

Le code commence par effacer le contenu des cellules dans la plage A:E en utilisant la méthode ClearContents.

Ensuite, la macro crée un tableau tbl qui contient les nombres de 1 à 10 à l'aide de la fonction Index de l'objet Application. Les variables a, b, c et d sont utilisées pour itérer à travers les éléments du tableau tbl en utilisant quatre boucles imbriquées.

Dans chaque itération, la macro stocke les quatre nombres choisis dans le tableau tblFinal. La variable q est utilisée pour suivre le nombre de combinaisons stockées dans le tableau tblFinal.

Finalement, la macro utilise la plage de cellules A1:Dn pour afficher le contenu de tblFinal, où n est le nombre total de combinaisons stockées.

La fonction NbCombi est utilisée pour calculer le nombre total de combinaisons possibles, qui est le nombre de combinaisons de 10 éléments pris 4 à la fois, en utilisant la fonction Combin de l'objet WorksheetFunction. Cette fonction retourne le nombre total de combinaisons possibles et est utilisée pour dimensionner le tableau tblFinal.
 

CB70170

XLDnaute Nouveau
voilà une analyse :

Le code fourni est un macro VBA qui remplit un tableau 2D avec toutes les combinaisons de 4 nombres choisis parmi les nombres de 1 à 10. Le résultat final est stocké dans la variable tblFinal, qui est ensuite affichée dans les cellules de la feuille de calcul à partir de la cellule A1.

Le code commence par effacer le contenu des cellules dans la plage A:E en utilisant la méthode ClearContents.

Ensuite, la macro crée un tableau tbl qui contient les nombres de 1 à 10 à l'aide de la fonction Index de l'objet Application. Les variables a, b, c et d sont utilisées pour itérer à travers les éléments du tableau tbl en utilisant quatre boucles imbriquées.

Dans chaque itération, la macro stocke les quatre nombres choisis dans le tableau tblFinal. La variable q est utilisée pour suivre le nombre de combinaisons stockées dans le tableau tblFinal.

Finalement, la macro utilise la plage de cellules A1:Dn pour afficher le contenu de tblFinal, où n est le nombre total de combinaisons stockées.

La fonction NbCombi est utilisée pour calculer le nombre total de combinaisons possibles, qui est le nombre de combinaisons de 10 éléments pris 4 à la fois, en utilisant la fonction Combin de l'objet WorksheetFunction. Cette fonction retourne le nombre total de combinaisons possibles et est utilisée pour dimensionner le tableau tblFinal.


Une autre version :

Sub GenerateCombinations()
Dim tbl As Variant, tblFinal() As Variant
Dim a As Long, b As Long, c As Long, d As Long
Dim q As Long, numCombinations As Long

' Clear previous contents of cells
Range("A:E").ClearContents

' Create an array of numbers from 1 to 10
tbl = Application.Transpose(Application.Evaluate("ROW(1:10)"))

' Determine the number of combinations
numCombinations = WorksheetFunction.Combin(UBound(tbl), 4)

' Resize tblFinal to hold all the combinations
ReDim tblFinal(1 To numCombinations, 1 To 4)

' Generate all possible combinations
For a = 1 To UBound(tbl) - 3
For b = a + 1 To UBound(tbl) - 2
For c = b + 1 To UBound(tbl) - 1
For d = c + 1 To UBound(tbl)
q = q + 1
tblFinal(q, 1) = tbl(a)
tblFinal(q, 2) = tbl(b)
tblFinal(q, 3) = tbl(c)
tblFinal(q, 4) = tbl(d)
Next d
Next c
Next b
Next a

' Output the results to the worksheet
Range("A1:D" & numCombinations) = tblFinal
End Sub

Les améliorations apportées incluent :
  • Utilisation de l'objet Range pour effacer le contenu des cellules au lieu de la méthode ClearContents.
  • Utilisation de l'objet Variant pour les tableaux pour plus de flexibilité.
  • Utilisation de la fonction Evaluate pour créer le tableau de nombres au lieu de la fonction Index.
  • Détermination du nombre de combinaisons en utilisant la formule de combinaison directement au lieu d'une fonction personnalisée.
  • Utilisation d'une variable numCombinations pour stocker le nombre de combinaisons au lieu de l'appeler à chaque itération.
  • Modification de l'ordre des boucles pour itérer à travers le tableau une seule fois.
  • Utilisation de la plage de cellules "A1:D" & numCombinations pour afficher les résultats, ce qui permet d'éviter la nécessité de dimensionner le tableau après sa création.
 

CB70170

XLDnaute Nouveau
Une autre version :

Sub GenerateCombinations()
Dim tbl As Variant, tblFinal() As Variant
Dim a As Long, b As Long, c As Long, d As Long
Dim q As Long, numCombinations As Long

' Clear previous contents of cells
Range("A:E").ClearContents

' Create an array of numbers from 1 to 10
tbl = Application.Transpose(Application.Evaluate("ROW(1:10)"))

' Determine the number of combinations
numCombinations = WorksheetFunction.Combin(UBound(tbl), 4)

' Resize tblFinal to hold all the combinations
ReDim tblFinal(1 To numCombinations, 1 To 4)

' Generate all possible combinations
For a = 1 To UBound(tbl) - 3
For b = a + 1 To UBound(tbl) - 2
For c = b + 1 To UBound(tbl) - 1
For d = c + 1 To UBound(tbl)
q = q + 1
tblFinal(q, 1) = tbl(a)
tblFinal(q, 2) = tbl(b)
tblFinal(q, 3) = tbl(c)
tblFinal(q, 4) = tbl(d)
Next d
Next c
Next b
Next a

' Output the results to the worksheet
Range("A1:D" & numCombinations) = tblFinal
End Sub

Les améliorations apportées incluent :
  • Utilisation de l'objet Range pour effacer le contenu des cellules au lieu de la méthode ClearContents.
  • Utilisation de l'objet Variant pour les tableaux pour plus de flexibilité.
  • Utilisation de la fonction Evaluate pour créer le tableau de nombres au lieu de la fonction Index.
  • Détermination du nombre de combinaisons en utilisant la formule de combinaison directement au lieu d'une fonction personnalisée.
  • Utilisation d'une variable numCombinations pour stocker le nombre de combinaisons au lieu de l'appeler à chaque itération.
  • Modification de l'ordre des boucles pour itérer à travers le tableau une seule fois.
  • Utilisation de la plage de cellules "A1:D" & numCombinations pour afficher les résultats, ce qui permet d'éviter la nécessité de dimensionner le tableau après sa création.
 

Discussions similaires

Statistiques des forums

Discussions
315 098
Messages
2 116 189
Membres
112 679
dernier inscrit
Yupanki