Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
 

job75

XLDnaute Barbatruc
Bonjour patricktoulon,

Ecrire plutôt :
VB:
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)
mais le résultat sera le même.

A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous ,

@patricktoulon :

J'avais commis une fonction assez rapide et paramétrée qui renvoie un tableau comportant les combinaisons P parmi N :
VB:
Function TableauCombiPparmiN(p As Long, n As Long)
Dim i&, Inc&, base&, ncombi&, nres&, k&

   'initialisation
   ReDim Combi&(1 To p)    'tableau de la combinaison en cours d'édition
   ReDim Max&(1 To p)      'tableau des maximums autorisés pour chaque colonne
   ncombi = Application.WorksheetFunction.Combin(n, p)   'nombre de combinaisons (P parmi N)
   ReDim res(1 To ncombi, 1 To p) 'tableau de toutes les combinaisons
   'la première combinaison est (1, 2 , 3, ... , P)
   For i = 1 To p: Combi(i) = i: Next
   'les maximums autorisés par colonnes sont (N-P+1, N-P+2, N-P+3, ... , N-2, N-1, N)
   For i = 0 To p - 1: Max(p - i) = n - i: Next
   'stockage de la première combinaison
   nres = nres + 1: For i = 1 To p: res(nres, i) = Combi(i): Next
 
   'boucle pour les autres combi
   Inc = p     'la colonne à incrémenter est la dernière
   Do
      If Combi(Inc) + 1 > Max(Inc) Then
         'si l'élément de combi en colonne Inc incrémenté de 1
         'dépasse le maximun autorisé, on décrémente Inc
         Inc = Inc - 1
         'si Inc arrive à zéro, on est à la fin de la boucle
         If Inc = 0 Then Exit Do
      Else
         'si l'élément de combi en colonne Inc incrémenté de 1
         'ne dépasse pas le maximun autorisé, on incrémente cet élément
         Combi(Inc) = Combi(Inc) + 1
         'les éléments suivants sont chacun égaux à la somme du précédent + 1
         For i = Inc + 1 To p: Combi(i) = Combi(i - 1) + 1: Next
         'on stocke la nouvelle combinaison
         nres = nres + 1: For i = 1 To p: res(nres, i) = Combi(i): Next
         Inc = p
      End If
   Loop
   TableauCombiPparmiN = res
End Function
 

patricktoulon

XLDnaute Barbatruc
Bonjour patricktoulon,

Ecrire plutôt :
VB:
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)
mais le résultat sera le même.

A+
oui j'avais écrit comme ça au départ ( car c'est logique) mais par curiosité croyant tomber sur une erreur du genre " indice...." juste pour l'expérience j'ai enlever les limites
je n'ai pas eu d'erreur et les 4 boucles filent et mon résultat est la
étonnant non ?
si la boucle a est a 10 :b=a+1 donc 11 tbl(11) n'existe pas je devrais donc avoir une erreur d'indice

mais non.........
 

mapomme

XLDnaute Barbatruc
Supporter XLD
alors par quel miracle vbaistique divinatoire magical évènementiel mon résultat est correct

y a que moi pour venir se plaindre que ça marche bien


[mode humour]
Çà me rappelle quelque peu l'étude des pièces de Molière.

Extrait du Bourgeois gentilhomme de Molière, scène VI, acte II (adaptation libre)
Dans le rôle de Monsieur Jourdain le grand codeur XListe international @patricktoulon et dans celui du Maître de philosophie la modeste pomme.

[/mode humour]
 

TooFatBoy

XLDnaute Barbatruc
ok bien vu @TooFatBoy en effet je comprends mieux en effet le step est positif donc elle ne part pas
ok pigé
Merci d'avoir mis ma réponse #9 comme solution, mais en fait c'est pierre-jean en #6 qui, même si je n'avais pas compris ce qu'il voulait dire (d'où ma réponse #9), a donné la solution en premier.



en effet je comprends mieux en effet le step est positif donc elle ne part pas
ok pigé
Oui, tu as tout pigé, c'est exactement ça.
 

patricktoulon

XLDnaute Barbatruc
re
@TooFatBoy
ben tu vois c'est pas pour critiquer bien au contraire
j'ai vu la réponse de pierre jean mais ce qui est arrivé a mon cerveau c'est ce que je savais déjà

toi tu a mis en lumière un truc tout bête qui m'a échappé
c'est le step for i=....
11 to 10 en effet sans step négatif ça décolle pas et il n'y a pas d'erreur effectivement

donc le point te reviens ,je l'ai donc mis a qui de droit
merci a tous
@mapomme je regarde ta fonction qui m'interpelle
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…