Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Macro--Ajout d'un intersect dans le résultat d'une macro.
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'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.
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
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 !
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.
[...] 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 ?) [...]
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)
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?)
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
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?) [...]
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.
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.
- 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.