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

Macro--Ajout d'un intersect dans le résultat d'une macro.

  • Initiateur de la discussion Initiateur de la discussion JJ1
  • 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 !

J

JJ1

Guest
Bonsoir,

J'utilise une macro qui écrit des nombres aléatoires en Y2:ACx si la condition en V1 est vraie(un exemple somme).

Le problème est dans le résultat, quand la condition est vraie; je voudrais que la série ne s'écrive pas si ce ne sont pas des nombres différents des séries déjà écrites, sinon retour à l'aléa. (à la limite un nombre maximum en commun)

je ne sais pas si c'est possible.
Je joins un exemple.
merci de votre aide.

Bonne soirée
 

Pièces jointes

Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

Bonsoir JJ1, carcharodon-carcharias, le forum

Un essai dans le fichier joint. La condition est à placer en M1 mais la macro utilise la cellule V1 (égale à la cellule M1). La condition doit avoir pour résultat Vrai ou Faux. les colonnes à droite du résultat sont uniquement présentes pour la vérif.

Dans la macro, indiquer pour la constante Nmax la borne supérieure des nombres aléatoires (compris entre 1 et Nmax). Pour le test Nmax a été fixé à 66 au lieu de 70.

Indiquer pour la constante maxEssai le nombre d'essais maximum qu'on autorise pour tenter de vérifier la condition. le programme n'assure pas, si le nombre d'essai max a été atteint, qu'il n'existe pas encore une solution dans les valeurs restantes non tirées.

Ce cas se produit pour la condition SOMME(G1:K1)<100 où souvent la somme des 5 premières valeurs restante dans Vals est inférieure à 100. Pour cette condition particulière, il suffirait que la macro vérifie à la fin qu'il reste plus de 5 valeurs dans Vals et, dans ce cas, si leur somme est supérieure à 100 les rajouter aux solutions puis les ôter de Vals et recommencer jusqu'à ce que la somme des cinq premières valeurs soit sup. ou égale à 100 ou bien qu'il reste moins de cinq valeurs.

Le code:
VB:
Option Explicit

Sub Test()

Const Nmax = 66
Const maxEssai = 5000

Dim cel As Range, i As Long, j As Long, k As Long
Dim Vals, Aux, NiemeEssai, N As Long

ReDim Vals(1 To Nmax)
For i = 1 To Nmax
  Vals(i) = i
Next i

Range("AD2:AH" & Rows.Count).ClearContents
Application.ScreenUpdating = False
Range("AJ2:AJ36").FormulaR1C1 = Range("M1").FormulaR1C1
Range("AR1:AR" & Rows.Count).ClearContents

For j = 1 To Nmax \ [tableau].Columns.Count

  'calcul s'il reste suffisamment de nombre
  If UBound(Vals) < [tableau].Columns.Count Then
    MsgBox "Fin car plus assez de nombres"
    GoTo AFFICHE
  End If
    
  'choix des [tableau].Columns.Count nombres
  NiemeEssai = 0
  Do
    NiemeEssai = NiemeEssai + 1
    'copie vers le tableau auxilliaire
    ReDim Aux(1 To UBound(Vals))
    For k = 1 To UBound(Vals): Aux(k) = Vals(k): Next k
      'choix des valeurs aléatoires sans doublons
      For Each cel In [tableau]
        N = Int(UBound(Aux) * Rnd) + 1
        cel = Aux(N)
        For k = N + 1 To UBound(Aux)
          Aux(k - 1) = Aux(k)
        Next k
        'compactage de Aux sans la valeur tirée
        If UBound(Aux) > 1 Then ReDim Preserve Aux(1 To UBound(Aux) - 1)
      Next cel
    If [V1] Then
      [G1:K1].Copy Range("AD" & Cells(Rows.Count, 30).End(xlUp).Row + 1)
      'recopie du tableau Aux vers le tableau Vals pour le prochain tirage
      ReDim Vals(1 To UBound(Aux))
      For k = 1 To UBound(Aux): Vals(k) = Aux(k): Next k
      Exit Do
    End If
  Loop Until NiemeEssai = maxEssai
    
  If NiemeEssai = maxEssai Then
    MsgBox "Max essai vérif condition est atteinte => échec"
    GoTo AFFICHE
    Exit Sub
  End If
Next j

AFFICHE:
'affichage des valeurs restantes de Vals
Range("AR1") = "RESTENT DANS Vals"
For i = 1 To UBound(Vals)
  Range("AR1").Offset(i) = Vals(i)
Next i

Application.ScreenUpdating = False
End Sub

Edit: v2 modif. mineures pour l'affichage (v3 modif indice inf tableaux))
 

Pièces jointes

Dernière édition:
Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

Bonjour à tous


Une proposition concernant uniquement la recherche de sommes strictement inférieures à un nombre donné.​


ROGER2327
#6253


Dimanche 8 Phalle 139 (Sainte Léda, ajusteuse - fête Suprême Tierce)
1[SUP]er[/SUP] Fructidor An CCXX, 0,5985h - prune
2012-W33-6T01:26:11Z
 

Pièces jointes

Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

Bonjour Carcharodon, Mapomme, Roger,

En fait j'ai du mal expliquer(il était tard !):

L'intersect existant m'évite les doublons Alea.

La somme dans mon code est un exemple, il y a une dizaine de conditions And.

Mon problème est dans l'écriture des séries retenues (ayant réussi tous mes tests And), je souhaiterais que, si la série existe déjà, elle ne s'écrive pas et le test alea repart pour une nouvelle série.

A mon avis, il faut ajouter une autre condition And avant le Then Copy...(je pensais à un if not intersect avec la plage de résultats Y:AC ?

ex:
je lance la macro.
1 2 3 4 5 est ok et s"écrit en Y2
6 7 8 9 10 est ok (5 nb différents) et s'écrit en Y3
1 11 12 13 14 ne s"écrit pas (même après avoir réussi les tests And) car 1 existe déjà dans un résultat précédent et donc 1 11 12 13 14 passe à la trappe et un nouveau test est lancé ( goto 1 ?)

Le problème est donc dans le résultat et non dans le test (ici somme qui est un simple exemple pour tester le code)
Il ne me sert à rien d'obtenir une centaine de lignes de résultats si ce sont les mêmes séries !

Est-ce plus clair?

Merci à vous.
 
Dernière modification par un modérateur:
Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

Bonjour JJ1 🙂,

[...] En fait j'ai du mal expliquer(il était tard !): [...]
Manifestement pour moi aussi il était tard! 😕

[...] (ayant réussi tous mes tests And) [...]
C'est pourquoi j'ai laissé le soin à Excel de calculer la condition dans M1 => le code de la macro devient indépendant de l'écriture de la condition, seul le résultat Vrai ou Faux est pris en compte.

Il me semblait que ma macro le faisait. Si en M1 on met vrai (condition toujours vérifiée) la macro ne doit afficher que des quintuplets sans doublon.

[...] Est-ce plus clair? [...]
Pas certain parce que je comprends la même chose qu'auparavant mais il faut souvent m'expliquer longtemps 😱

[...] avec la plage de résultats Y:AC [...]
je ne vois pas bien ce que vient faire Y par rapport au fichier exemple.

En pièce jointe un exemple avec la condition VRAI (Feuil1) et un autre exemple avec comme condition "Le 3eme nombre est la moyenne des 5 nombres" (Feuil2)
 

Pièces jointes

Dernière édition:
Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

Bonjour Mapomme,
Merci de ta réponse.

Dans mon exemple, j'aii mis le résultat en AD2 et non Y2.

Les doublons de l'alea sont gérés par l'intersect (doublons dans l'alea mais PAS dans la plage de résultat après le test And réussi).

Donc, la macro peut tirer 100 fois 1 2 3 4 5 et si cette série réussit la condition VRAI, alors elle sera copié 100 fois en AD2 et les 99 lignes suivantes....ce qui ne me sert à rien d'avoir comme résultat 100 fois la série 1 2 3 4 5 !
Donc je souhaiterais avoir dans la partie résultat (donc la partie copiée) que des séries différentes .

Pas évident à expliquer (voir mon exemple où 8 40 27 21 9 n'aurait pas du être écrit car le 27 est déjà dans la série 1)

Je n'ai pas compris ton fichier et ta macro?

il me semblait qu'il fallait ajouter un And avant le Then Copy dans ma macro, pour vérifier que la série en cours (avant copie) n'existe pas déjà dans celles écrites en AD2:AHx (d'où mon idée d'intersect?)

MERCI
 
Dernière modification par un modérateur:
Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

Bonjour JJ1

Salut mapomme 🙂
Salut le Requin 🙂
Salut ROGER 🙂

Un essai par modification du code original
Sera peut etre mieux compris que les excellentes prestations precedentes
Un peu de patience sera par ailleurs assez necessaire
 

Pièces jointes

Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

(re)Bonjour JJ1,

[...] Dans mon exemple, j'aii mis le résultat en AD2 et non Y2. [...]
Il me semblait bien.

[...] Je n'ai pas compris ton fichier et ta macro? [...]
La condition à vérifier est à mettre en M1. On peut copier une des conditions de M22 à M29 dans M1 pour tester différentes conditions. Mais la macro donne-t elle bien le résultat que tu souhaites ?

La différence avec ta macro est que je tire au hasard le nombre suivant dans une liste (tableau Aux reflet de Vals) qui ne contient aucun des numéros déjà tirés qu'ils soit déjà tirés dans G1:K1 ou déjà tirés dans les combinaisons déjà affichées (ceci pour augmenter la vitesse de traitement)

[...] il me semblait qu'il fallait ajouter un And avant le Then Copy dans ma macro, pour vérifier que la série en cours (avant copie) n'existe pas déjà dans celles écrites en AD2:AHx (d'où mon idée d'intersect?) [...]
J'ai une piste pour ton code (mais après le déjeuner 😛 )
 
Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

Bonjour à tous,

De mapomme: J'ai une piste pour ton code
Puisque pierrejean (que je salue 🙂 ) l'a fait, je ne le ferai pas. D'ailleurs la piste resssemblait fortement à sa méthode.

nb: Roger (que je salue aussi ) a pris un coup de jeune, Roger reverdit (joli le nouvel avatar!)
 
Dernière édition:
Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

Bonjour à tous


Quelques réflexions qui me sont venues en étudiant ce problème :

Nous considérons l'ensemble E des entiers de 1 à 70.


    • Question : Combien de parties disjointes à cinq éléments pouvons-nous en extraire au plus ?
    • Réponse : Quatorze. En effet, 70=5*14 ; si nous considérons une quinzième partie, elle possédera un ou des éléments communs avec une ou plusieurs parties précédemment extraites. (Le nombre de parties à cinq éléments de E est 12 103 014 ; on voit que la contrainte est forte...)

    • Question : Si nous imposons une contrainte supplémentaire, par exemple la somme des éléments de chaque partie extraite est strictement inférieur à un nombre N donné, combien de parties disjointes pouvons-nous extraire au plus ?
    • Réponse : Tout dépend de N : aucune si N<=15, une seule pour N=16 (1, 2, 3, 4, 5), de quatre à sept pour N=100, en tous cas, jamais plus de quatorze, même si N est très grand.

Le reste est trop compliqué pour moi.


Bonne journée.


ROGER2327
#6254


Dimanche 8 Phalle 139 (Sainte Léda, ajusteuse - fête Suprême Tierce)
1[SUP]er[/SUP] Fructidor An CCXX, 5,7595h - prune
2012-W33-6T13:49:22Z
 
Re : Macro--Ajout d'un intersect dans le résultat d'une macro.

Re à tous,

Merci Pierre Jean, je viens de tester avec le test SOMME (qui n'était qu'un exemple pour tester le code sur le forum), dans les lignes écrites n'apparaît aucun nombre déjà sorti auparavant.

Je viens de comprendre l'idée de Mapomme d'exclure en amont les nombres déjà sortis, bonne idée aussi.

Merci beaucoup à tous.

(tu notes patience...le code sera beaucoup plus lent?)

Bonne soirée au frais et avec une boisson fraiche !!!

Mapomme bleuit (pomme OGM ?) et Roger verdit !! mais sa réflexion sur les éléments est intéressante, je serai peut être obligé d'autoriser au moins UN (seul) nombre déjà tiré dans une série, mais c'est une autre histoire et je pense que Pierre Jean me donnera la clé pour le faire dans son code.
 
Dernière modification par un modérateur:
- 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

C
Réponses
6
Affichages
1 K
camillepaps
C
T
Réponses
6
Affichages
2 K
Z
Réponses
1
Affichages
2 K
I
Réponses
2
Affichages
1 K
Imperium
I
J
Réponses
2
Affichages
879
J
J
Réponses
4
Affichages
1 K
J
P
Réponses
2
Affichages
2 K
Pago92
P
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…