Numéros aléatoires dans une plage avec cellules pleines, vides

Titi 75 -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je souhaiterais générer 1, 2 ou 3 numéros aléatoires à partir de plages contenant des cellules pleines et d'autres vides tel qu'il est expliqué en fichier joint.

Merci pour votre aide.

http://www.cjoint.com/c/FFyjAxCjFCY

Titi 75

2 réponses

  1. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonjour
    un essaie qui reste aléatoire, mais je n'ai pas pu le prendre en défaut avec une cinquantaine de test_ (c'est un début, on regarde pour coplèter)
    Mais il subsiste quand même le risque de doublons
    =en A22, à ajuster en B et C22

    =SI(A21>0;A21;ALEA.ENTRE.BORNES(MIN(A1:A20);MAX(A1:A20)))

    et dans les autres comme simplement en B23:
    =ALE.ENTE.BORNES(MION(B1:B20);MAX(B1:B20))

    A suivre pour amélioration

    (par exemple, admettiez vous un renvoi dans des colonnes masquées des valeurs de A, B, C ce qui permettrait de réduire la liste au N° non affectés? pour adresser la code ALEA à ces colonnes, et donc ne prendre en compte que les valeurs restantes?)

    crdlmnt

    0
    1. Titi 75
       
      Bonjour Vaucluse

      Il faudrait que le nombre aléatoire choisi soit présent dans la plage, et pas uniquement compris entre ses minimum et maximum.

      La fonction ALEA.ENTRE.BORNES seule ou combinée avec une autre fonction peut elle y répondre ou faut il obligatoirement passé par un code ?

      Cdlt


      Titi
      0
    2. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
       
      essayez avec, mais je ne garantis pas tous les cas de figure, à tester donc

      =INDEX(A3:A20;EQUIV(ALEA.ENTRE.BORNES(MIN(A3:A20);MAX(A3:A20));A3:A20))


      (et salut Michel en passant)

      crdlmnt
      0
    3. Titi 75
       
      Bonjour


      En complément de ma réponse : toute opération qui permettrait de ne pas prendre en compte les numéros non présents dans une plage est acceptée, le résultat est copié automatiquement dans une autre feuille et la présentation de la feuille où se font les calculs n'est pas un empêchement.


      Cdlmt


      Titi
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    Salut Vaucluse, comment vas tu depuis longtemps qu'on ne s'était pas croisé ;o)
    je vois mal une solution avec des formules mais....

    Pour Titi

    Solution par VBA
    si tu es OK avec ma bidouille, j'insèrerais des commentaires dans le code
    http://www.cjoint.com/c/FFyohNbbc2t
    0
    1. Titi 75
       
      Bonjour

      Le fichier joint est constitué de signes et ne peut être lu. Je ne sais pas a quoi cela est dû.


      Titi
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > Titi 75
         
        nouvel essai
        http://www.cjoint.com/c/FFypAE0Sm8t

        edit 17:28
        je viens de réessayer sur mon 1° envoi et ca a marché....

        en attendanrt, au cas où le code
        Option Explicit
        '-----------------------------------
        Sub attribuer_aléatoirement()
        Dim Col As Byte
        Dim dico As Object, Ref As Byte, Nbre As Byte, Lig As Byte, Liste
        Dim test

        Range("A22:C24").ClearContents

        For Col = 1 To 3
        Randomize
        Set dico = CreateObject("scripting.dictionary")
        For Lig = 1 To 21
        Ref = Cells(Lig, Col)
        Nbre = Application.CountIf(Range(Cells(22, Col), Cells(24, Col)), Ref)
        If Not dico.exists(Ref) And Ref <> 0 And Nbre = 0 Then dico.Add Ref, ""
        Next
        Liste = dico.keys
        If Cells(21, Col) <> "" Then
        Cells(22, Col) = Cells(21, Col)
        Else
        Cells(22, Col) = Liste(Int(Rnd * UBound(Liste)))
        End If

        If Col > 1 Then
        dico.Remove Cells(22, Col).Value
        Liste = dico.keys
        Cells(23, Col) = Liste(Int(Rnd * UBound(Liste)))
        End If
        If Col > 2 Then
        dico.Remove Cells(23, Col).Value
        Liste = dico.keys
        Cells(24, Col) = Liste(Int(Rnd * UBound(Liste)))
        End If
        Next

        End Sub
        0