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
Bonsoir
puré il c'est enflammé

diabolo.gif

j'ai lu dans son discourt " amélioration "

mais je vois aussi des choses du genre
VB:
tbl = Application.Transpose(Application.Evaluate("ROW(1:10)"))

' Determine the number of combinations
numCombinations = WorksheetFunction.Combin(UBound(tbl), 4)
bon ben là si il y a eu amélioration ailleurs ben c'est râpé tu perds tout et tu en rajoute en process mémoire

bon le reste ressemble au mien donc si il y eu amélioration ben je suis passé trop vite dessus ca m'a échappé

c'est bien mon petit ,allez essaie encore

tiens t'est gentil et comme tu est fortiche ,tu peux m'en faire une en fonction récursive
ça m'amuserait bien ça

j'entends mes camarades derrière, ricaner de rire

@CB70170 bien venu dans la cour des grands
 

patricktoulon

XLDnaute Barbatruc
allez je vais quand meme t'expliquer un truc
je reprends ton idée que je connais tres bien
ici 1à 10 est ecrit en dur dans le string evalué
Code:
tbl = Application.Transpose(Application.Evaluate("ROW(1:10)"))

tu m'expliquera ici pourquoi tu demande a la mémoire de calculer le ubound pour les nombres
à quoi ça te sert puisque tu la codé en dur dans la ligne audessus met 10 tout court tu evitera de calculer le ubound
Code:
' Determine the number of combinations
numCombinations = WorksheetFunction.Combin(UBound(tbl), 4)

je veux bien te croire qu'on se laisse très souvent séduire par un code alambiqué quand on utilise des astuces comme avec évaluer mais c'est faux ce n'est pas une amélioration c'est même le contraire
d'autant plus que tu fait la 2d erreur d'utiliser un calcul ubound

si j'avais du utiliser évaluer j'aurais fait comme ceci
VB:
dim maxi&
maxi=10
tbl = Application.Transpose(Application.Evaluate("ROW(1:"& maxi &")"))

' Détermine the number of combinations
numCombinations = WorksheetFunction.Combin(maxi, 4)

tu pige la nuance ?

;)

pour info
Les améliorations apportées incluent :
  • Utilisation de l'objet Range pour effacer le contenu des cellules au lieu de la méthode ClearContents.(je te l'accorde)
  • Utilisation de l'objet Variant pour les tableaux pour plus de flexibilité.( faux variant plus lourd que long)
  • Utilisation de la fonction Evaluate pour créer le tableau de nombres au lieu de la fonction Index.(faux plus lourd evaluate)
  • Détermination du nombre de combinaisons en utilisant la formule de combinaison directement au lieu d'une fonction personnalisée. (ca se discute)
  • Utilisation d'une variable numCombinations pour stocker le nombre de combinaisons au lieu de l'appeler à chaque itération.(c'etait déja le cas)
  • Modification de l'ordre des boucles pour itérer à travers le tableau une seule fois.(heu la tes chaussures marchent a coté de toi)
  • 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.(faux le resize est plus rapide)
 
Dernière édition:

CB70170

XLDnaute Nouveau
Non, c'est bien de vouloir rendre service ! 👍

Mais j'ai l'impression que tu expliques à l'auteur d'une macro comment elle fonctionne, sans répondre à la question qu'il pose. ;)

allez je vais quand meme t'expliquer un truc
je reprends ton idée que je connais tres bien
ici 1à 10 est ecrit en dur dans le string evalué
Code:
tbl = Application.Transpose(Application.Evaluate("ROW(1:10)"))

tu m'expliquera ici pourquoi tu demande a la mémoire de calculer le ubound pour les nombres
à quoi ça te sert puisque tu la codé en dur dans la ligne audessus met 10 tout court tu evitera de calculer le ubound
Code:
' Determine the number of combinations
numCombinations = WorksheetFunction.Combin(UBound(tbl), 4)

je veux bien te croire qu'on se laisse très souvent séduire par un code alambiqué quand on utilise des astuces comme avec évaluer mais c'est faux ce n'est pas une amélioration c'est même le contraire
d'autant plus que tu fait la 2d erreur d'utiliser un calcul ubound

si j'avais du utiliser évaluer j'aurais fait comme ceci
VB:
dim maxi&
maxi=10
tbl = Application.Transpose(Application.Evaluate("ROW(1:"& maxi &")"))

' Détermine the number of combinations
numCombinations = WorksheetFunction.Combin(maxi, 4)

tu pige la nuance ?

;)

pour info
Les améliorations apportées incluent :
  • Utilisation de l'objet Range pour effacer le contenu des cellules au lieu de la méthode ClearContents.(je te l'accorde)
  • Utilisation de l'objet Variant pour les tableaux pour plus de flexibilité.( faux variant plus lourd que long)
  • Utilisation de la fonction Evaluate pour créer le tableau de nombres au lieu de la fonction Index.(faux plus lourd evaluate)
  • Détermination du nombre de combinaisons en utilisant la formule de combinaison directement au lieu d'une fonction personnalisée. (ca se discute)
  • Utilisation d'une variable numCombinations pour stocker le nombre de combinaisons au lieu de l'appeler à chaque itération.(c'etait déja le cas)
  • Modification de l'ordre des boucles pour itérer à travers le tableau une seule fois.(heu la tes chaussures marchent a coté de toi)
  • 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.(faux le resize est plus rapide)
Pourquoi tu demandes de l'aide si tu es au dessus des autres. Mon post aura au moins le mérite de d'avoir fait analyser ton propre code. Tu sembles avoir une haute estime de toi.

"c'est bien mon petit ,allez essaie encore

tiens t'est gentil et comme tu est fortiche ,tu peux m'en faire une en fonction récursive
ça m'amuserait bien ça

j'entends mes camarades derrière, ricaner de rire"

Quel âge as tu ? Super !!!
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
oui c'est vrai j'ai une bonne estime de moi
et visiblement toi aussi pour venir présenter un code qui n'a aucun intérêt dans la question

et si tu avais lu lu l a discussion dans son ensemble ,tu aurais compris que c'est pas le code la question
d'ailleurs il fonctionne très bien
la question portait sur la limite du to dans les boucle for
parce que j'avais zapé simplement le fait que nous somme dans un step positif
et toi tu viens avec ta grande bible m'expliquer ce que fait quoi et qui fait qui
tu nous fait un roman qui explique point par point (selon ta vison)
sauf que comme je t'ai répondu plus haut quasiment toute tes explications sont erronées

donc au vue de ce que tu a présenté, je pense qu'il va falloir te muscler un peu avant de prétendre expliquer quoi que ce soit a des membres qui ont entre 10ans et 25 ans d'expérience voir même plus pour certains participant de ce post
c'est pas par ce que ton interprétation des raisons coïncide avec le résultat que ta règle est universelle
tu a tout faux mon pauvre ami
pardonne moi ma franchise je ne suis pas du genre a passer la pommade
surtout quand on vient piloner les autres avec sa pseudoscience qui est tout sauf juste

pour info j'ai 52 ans et je suis suffisamment assez vieux pour dire ce que je pense
 

CB70170

XLDnaute Nouveau
re
Bonjour
oui c'est vrai j'ai une bonne estime de moi
et visiblement toi aussi pour venir présenter un code qui n'a aucun intérêt dans la question

et si tu avais lu lu l a discussion dans son ensemble ,tu aurais compris que c'est pas le code la question
d'ailleurs il fonctionne très bien
la question portait sur la limite du to dans les boucle for
parce que j'avais zapé simplement le fait que nous somme dans un step positif
et toi tu viens avec ta grande bible m'expliquer ce que fait quoi et qui fait qui
tu nous fait un roman qui explique point par point (selon ta vison)
sauf que comme je t'ai répondu plus haut quasiment toute tes explications sont erronées

donc au vue de ce que tu a présenté, je pense qu'il va falloir te muscler un peu avant de prétendre expliquer quoi que ce soit a des membres qui ont entre 10ans et 25 ans d'expérience voir même plus pour certains participant de ce post
c'est pas par ce que ton interprétation des raisons coïncide avec le résultat que ta règle est universelle
tu a tout faux mon pauvre ami
pardonne moi ma franchise je ne suis pas du genre a passer la pommade
surtout quand on vient piloner les autres avec sa pseudoscience qui est tout sauf juste

pour info j'ai 52 ans et je suis suffisamment assez vieux pour dire ce que je pense

Il semble y avoir une certaine confusion dans cette discussion, avec des malentendus et des frustrations de part et d'autre. Il est important de garder à l'esprit que les discussions en ligne peuvent parfois être difficiles à interpréter correctement, en raison de l'absence de communication non verbale et de la difficulté à se faire comprendre de manière claire et précise.

Il est possible que les réponses fournies par l'interlocuteur ne soient pas tout à fait en phase avec la question posée, ou qu'elles ne soient pas comprises ou appréciées par l'autre personne. Dans ces situations, il est important de rester calme et de clarifier les points de vue, de manière à trouver une solution commune.

Il est également important de garder à l'esprit que chacun a sa propre expérience et son propre point de vue, et qu'il est possible que ces expériences et ces points de vue diffèrent de ceux des autres participants à la discussion. Il est important de respecter les opinions des autres et de chercher à comprendre leur point de vue, même si on ne l'approuve pas forcément.

En fin de compte, il est important de garder une attitude respectueuse et ouverte lors des discussions en ligne, et de chercher à trouver des solutions mutuellement satisfaisantes plutôt que de se concentrer sur les différences ou les désaccords.
 

patricktoulon

XLDnaute Barbatruc
re
je vois pas de frustrations ici ou malentendus
je n'ai vu qu'un membre qui est venu avec des explications erronées
et il me semblait utile de corriger le pas

quand tu vois un arc en ciel dans le ciel ce n'est pas petit jésus qui s'amuse avec sa goiche hein ;)
même si il serait plus facile de croire cela
cela dit bien venu quand même
mais soit sur de ce que tu dis et que la véracité en est vérifiée et vérifiable avant de l’écrire
il y a quelques membres ici qui justement participent souvent a ce genre de sujet (les boucles)
et parfois en terme de gains de memoire ou et de rapidité ce n'est pas le code le plus court ou le plus simple qui est le meilleur divers exemple dans des discussions récentes le démontre bien
 

bsalv

XLDnaute Occasionnel
Bonjour le fil, patricktoulon, CB70170, TooFatBoy, ...

voici une solution générale sans x boucles, donc on ne risque pas d'écrire des erreurs en VBA
VB:
Public aOut

Sub BSALV()
     t0 = Timer
     Combinaisons Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"), 4 'tous les combinaisons de 4 avec ces 10 lettres
     t1 = Timer
     Range("A1").Resize(UBound(aOut), UBound(aOut, 2)).Value = aOut 'vers la feuille
MsgBox Format(t1 - t0, "0.00\s") & vbLf & Format(Timer - t1, "0.00\s")
End Sub

Sub Combinaisons(arr, N As Integer)
     Dim aAux, i, j, Ptr, lComb, iBase

     iBase = UBound(arr) + 1 'nombre de lettres
     lComb = WorksheetFunction.Combin(iBase, N) 'nombre de combinaisons
     ReDim aOut(1 To lComb, 1 To N) 'preparer matrices
     ReDim aAux(1 To N)

     Do While Ptr < lComb
          Ptr = Ptr + 1 'pointer
            If Ptr = 1 Then
               For i = 1 To N: aAux(i) = i: Next     'initialisation
          Else
               aAux(N) = aAux(N) + 1
               If aAux(N) > iBase Then
                    For i = N To 2 Step -1
                         If aAux(i) > iBase + i - N Then
                              aAux(i - 1) = aAux(i - 1) + 1
                              If aAux(i - 1) <= iBase + i - 1 - N Then
                                   For j = i To N
                                        aAux(j) = aAux(j - 1) + 1
                                   Next
                                   Exit For
                              End If
                         End If
                    Next
               End If
          End If

          For i = 1 To N
               aOut(Ptr, i) = arr(aAux(i) - 1) 'vos lettres au lieu de ces indexes
          Next
     Loop

End Sub
 

Pièces jointes

  • P_Toulon.xlsb
    113.3 KB · Affichages: 3
Dernière édition:

Gégé-45550

XLDnaute Accro
Il semble y avoir une certaine confusion dans cette discussion, avec des malentendus et des frustrations de part et d'autre. Il est important de garder à l'esprit que les discussions en ligne peuvent parfois être difficiles à interpréter correctement, en raison de l'absence de communication non verbale et de la difficulté à se faire comprendre de manière claire et précise.

Il est possible que les réponses fournies par l'interlocuteur ne soient pas tout à fait en phase avec la question posée, ou qu'elles ne soient pas comprises ou appréciées par l'autre personne. Dans ces situations, il est important de rester calme et de clarifier les points de vue, de manière à trouver une solution commune.

Il est également important de garder à l'esprit que chacun a sa propre expérience et son propre point de vue, et qu'il est possible que ces expériences et ces points de vue diffèrent de ceux des autres participants à la discussion. Il est important de respecter les opinions des autres et de chercher à comprendre leur point de vue, même si on ne l'approuve pas forcément.

En fin de compte, il est important de garder une attitude respectueuse et ouverte lors des discussions en ligne, et de chercher à trouver des solutions mutuellement satisfaisantes plutôt que de se concentrer sur les différences ou les désaccords.
Bonjour,
Selon moi, ces mots sont frappés au coin du bon sens.
Si seulement ils pouvaient être entendus et appliqués partout, par tous, dans des échanges apaisés et courtois !
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour à tous oui c'est vrai ça dans mon monde de bisounours on se fait des bisous partout tout le temps

@bsalv je rejoins @mapomme sur le fait que quand on entre dans une discussion on dit bonjour
cela dit là au moins c'est un bel exercice que tu nous livre

il me viens une idée somme toute assez simple
et si je vous disais qu'une seule boucle sous la forme que vous voulez( do while for) pourrait arriver a créer la matrice d'index
quand on vois la matrice moi je vois un schémas récurent
quand une colonne arrive a son max la ligne suivante prend 1 de plus dans la colonne précedente et la next colonne prend 1 de plus de la preceddnte sur la même ligne
n'y aurait til pas moyen pour le fun et l'exercice de style de tenter de faire ça dans une seule boucle
les schémas récurents sont en couleur
exemple ici avec 4/10eme
1677245051855.png


qui c'est qui se lance ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
n'y aurait til pas moyen pour le fun et l'exercice de style de tenter de faire ça dans une seule boucle
Le code avec une seule boucle principale a déjà été l'objet du message #8.
Les autres boucles ne sont que des boucles connexes.
Je ne pense pas que (si j'ai bien compris ta petite idée de derrière les fagots) que cela soit réalisable.
Depuis le temps, on le saurait, non ?

L'avantage de la méthode du #8, c'est qu'elle est paramétrable (en n et p) alors qu'une méthode strictement basée sur des boucles imbriquées for x to ... next x ne l'est pas.

De toute manière, la plupart des questions concernant les combinaisons c'est pour essayer de trouver une martingale pour le loto ou le kéno donc c'est foutu d'avance. On va consommer des ressources en quantité écologiquement néfaste pour un gain nul.
 
Dernière édition:

bsalv

XLDnaute Occasionnel
re,
@mapomme,
* j'avais déjà ajouté ma salution avant votre réaction, apparament, c'est un point sensible sur les sites francophones 😇.
* j'au lu votre contribution #8, en effect, l'idée est 99.9% identique, moi, j'utilise un DO et 2 FORs et là, il y a un FOR en moins. J'avoue !
@patricktoulon,
* en vitesse🥸, pour un problème de combinaision(26;4) = 14.950, une macro avec ces 4 boucles de patricktoulon est 6 (!) fois plus vite, 0.004 sec au lieu de 0.024 sec. 🤣 (en faisant le boucle 100 fois avec les 2 méthodes). Cela ne veut pas la peine, de changer la macro pour ajouter ou supprimer un boucle.
* concernant "les schémas récurents", je ne comprends pas cela, c'est comme vous venez d'avoir un accident de voiture et vous dites que vous devez freiner, mais 5 secondes plus tôt dans le passé. Trop tard, non ?
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

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