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

Création code 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
Bonjour à tous,

Suite à mon sujet d'hier, je voudrais créer un code qui génèrerait des séries à partir d'originaux, comme je le montre (avec 3 cas) dans mon exemple en substitution de Randomize dans mes fichiers (merci aux Vbaïstes qui se reconnaitront).
C'est juste un essai de comparaison avec alea.
Bon AM
 

Pièces jointes

Re : Création code macro.

Bonjour JJ1,

Sous réserve que l'exemple proposé est significatif (pas de doublon dans le tableau original) et de la bonne compréhension de la problématique, je te propose une formule. En G3, et pour un tableau initial de 9 lignes:
Code:
=DECALER(A3;COLONNE(A1)-9*((LIGNE()+COLONNE(A1))>11);0)
et copier sur le tableau distribution. Aucune paire du tableau initial ne se retrouve dans le final.

Cordialement.

KD
 
Dernière édition:
Re : Création code macro.

Bonjour JJ1.

Il n'y a évidemment pas de Randomize dans ton classeur sans macro.
Tu reprends mes modules de classes ListAléat et TableIndex.
Tu déclare une variable, par exemple dim LA as listealéat. La casse sera corrigée, prouvant à tout instant que tout est correct.
set la = new listealéat t'en donnera une occurrence (des ressources) pour pouvoir l'utiliser.
la.init 1,70 te mettra en désordre dans ton objet LA les nombres de 1 à 70
x = la.aléatsuc t'affectera, par exemple, a ton x un numéro chaque fois différent, si ce n'est pas demandé plus de 70 fois. Après il te rend 0. Tu est bien capable de concevoir un algorithme, selon ce que tu veux exactement, qui se sert de ces facultés de ton objet LA, non ? Tout ce que tu peux faire avec un ListeAléat est expliqué dedans (dans le module de classe, forcément, il faut bien une doc dedans, il n'y a pas d'autre aide)
 
Re : Création code macro.

Bonjour à tous et merci pour vos réponses.

Je ne peux utiliser la formule Decaler (car c'est pour remplacer une fonction RND dans une macro) et la solution de Dranreb est complexe (surtout à adapter).
Je vais utiliser la solution de Modeste en intégrant une boucle For...Calculate ..Next.
C'est simple que ce code sera rapide compte tenu des 2 fonction Alea et grande valeur seulement).

Merci à vous et bon AM
 
Re : Création code macro.

Pourquoi trouve tu moins complexe de faire des Rnd avec utilisation de Dictionary, alors, forcément, que de te servir d'un objet ListeAléat ? je ne comprends vraiment pas.
 
Re : Création code macro.

Bonsour®
Je vais utiliser la solution de Modeste en intégrant une boucle For...Calculate ..Next.
C'est simple que ce code sera rapide compte tenu des 2 fonction Alea et grande valeur seulement).
il te suffit alors simplement de passer en mode calcul sur ordre uniquement le temps d'exploiter le second tableau intermédiaire
selon convenance, les 2 tableaux intermédiaires pourront se situer sur la même feuille ou sur une autre feuille
 

Pièces jointes

Dernière édition:
Re : Création code macro.

Bonsoir Modeste, le Forum

Merci pour ta réponse.
J'ai toujours des doublons si un (ou plusieurs nombres) reviennent dans la plage originale.
J'ai joint un exemple avec beaucoup de 0 exprès. L'original est sans doublon (2 num ou plus) en ligne mais aussi en colonne (pas 2 fois la même série de 5), la redistribution aussi.

Merci de me dire si c'est faisable avec ta formule.
Bonne soirée
 

Pièces jointes

Re : Création code macro.

Bonjour JJ1, KenDev, Dranreb, Modeste geedee, à tous,

Pour le fun, une macro pour mélanger le tableau A, théoriquement sans doublons sur les lignes du tableau résultat.

Quand on ouvre le fichier, il y a des doublons; c'est juste pour montrer comment fonctionne la vérification.

Pour Dranreb: je suis penaud, j'ai utilisé des dictionnaires 😱

Le code:
VB:
Sub Melanger()
Dim dico As New Scripting.Dictionary, Uniq As New Scripting.Dictionary
Dim xcell, res(), i&, j&, n&, li&, co&, OK As Boolean

'dico stocke les valeurs avec leur occurence
For Each xcell In Range("a3:e12")
  dico(xcell.Value) = dico(xcell.Value) + 1
Next xcell

'le tableau res a une colonne de plus que le tableau résultat B
'cette colonne contient la valeur du doublon si on a placé
'un doublon quelque part sur la ligne
ReDim res(0 To 9, 0 To 5)

'on traite les doublons et plus
For i = 0 To dico.Count - 1
  If dico.Items(i) > 1 Then
     For j = 1 To dico.Items(i)
      OK = False
      Do While Not OK
        n = Int(50 * Rnd)
        li = Int(n / 5): co = n Mod 5
        If res(li, co) = 0 And res(li, 5) <> dico.Keys(i) Then
          'l'élément du tableau (li,co) est vide et le doublon ne
          'figure pas déjà dans la ligne li
          res(li, co) = dico.Keys(i)
          'on stocke la valeur du doublon pour indiquer qu'on a
          'mis une valeur de ce doublon dans la ligne li
          'et ne pas y placer ce doublon une 2ième fois
          res(li, 5) = res(li, co)
          OK = True
        End If
      Loop
    Next j
  End If
Next i

'on traite les singletons
For i = 0 To dico.Count - 1
  If dico.Items(i) = 1 Then Uniq.Add dico.Keys(i), ""
Next i
Set dico = Nothing

'dans les "trous" qui restent, on place les valeurs uniques
For i = 0 To 9
  For j = 0 To 4
    If res(i, j) = 0 Then
      n = Int(Rnd * Uniq.Count)
      res(i, j) = Uniq.Keys(n)
      Uniq.Remove Uniq.Keys(n)
    End If
  Next j
Next i
    
ReDim Preserve res(0 To 9, 0 To 4)
Range("g3").Resize(10, 5).Value = res
     
End Sub
 

Pièces jointes

Dernière édition:
Re : Création code macro.

Bonjour Mapomme, le Forum
Merci encore pour ton code qui fonctionne parfaitement.
Mais quel code pour un simple petit mélange de 9 lignes de 5 !! je m'attendais à beaucoup plus court.

Merci
Bonne journée
 
Re : Création code macro.

Bonjour.
Pour un simple petit mélange de 9 lignes de 5 comme tu dit, écris une paire de procédures Property (Let et Get) permettant d'accéder aux éléments du tableaux comme s'il était dimensionné 1 To 45.
 
- 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

Réponses
6
Affichages
322
Réponses
4
Affichages
334
  • Question Question
Microsoft 365 Code VBA
Réponses
10
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…