Un compteur binaire en VBA

Résolu
Bonjour,
Je vais faire des probas en VBA

J'ai des combinaisons à calculer ... pour calculer toute les combinaisonpossible de survenu de 11 évènement je suis en train d'implémenter un compteur binaire qui irait compterais de 0 à 2^11.

genre :
00000000000
00000000001
00000000010
00000000011
00000000100
...
11111111101
11111111110
11111111111

Vous avez compris ? Est ce que quelqu'un aurait une idée d'algorithme ou aurais déjà programmé qqchose dans le genre :-/

Merci.

4 réponses

  1. Bonjour

    Un petit exemple
    https://www.cjoint.com/?3BnpyfQnZdB

    Cdlmnt
    0
    1. Brillant !
      2^16 en 0,96s !!
      Impressionnant

      2 questions ! Finalement (et pour ne pas me contraindre), je souhaiterais peut-être aller au delà de 2^11.

      J'ai enregistré ta macro en .xlsm afin de ne pas être limité par les 2^16 lignes
      (If nn > Rows.Count Then MsgBox " n trop grand ": Exit Sub)
      (2^20 lignes en .xlsm)
      :-/ J'ai qd même une erreur?

      Perso, je n'ai pas besoin d'afficher toutes les lignes (mais si je peux, c'est bien pour la vérif !!)
      Sinon, je peux quand même récupère les valeurs dont j'ai besoin dans TB(k) par exemple ?
      0
  2. 2^20 doit dépasser le nombre de lignes disponibles (Rows.Count) tu peux vérifier.
    Pour la taille de TB() il ne devrait pas y avoir de problème, dans ce cas, tu as une solution : découper TB en plusieurs colonnes
    0
    1. En faite, le nombre de ligne dispo sous .xlsx (ou xlsm) est exactement de 2^20.
      Mais avant ça, j'ai une erreur :
      "Erreur d'exécution '13' incompatibilité de type" pour 2^17 :-/
      au niveau du script :

      plage.NumberFormat = "@"
      plage = Application.Transpose(TB)

      Est ce que tu aurais une idée ?? Sinon ! ça marche super jusqu'à 2^16 !! Merci
      0
  3. Non, je ne vois pas et comme chez moi, je ne peux pas reproduire l'erreur.
    Peux tu quand même me dire sur quelle (au singulier) ligne se produit l'erreur ? Peut être quelqu'un d'autre prendra le relai
    Set plage = Range("B1").Resize(nn + 1, 1)
    plage.NumberFormat = "@"
    plage = Application.Transpose(TB)
    0
    1. L'erreur survient sur la ligne :
      plage = Application.Transpose(TB)


      Le code exécuté est :
      For k = 1 To nn
      SB = decbin(k)
      TB(k) = String(n - Len(SB), "0") & SB
      Next k
      Set plage = Range("B1").Resize(nn + 1, 1)
      plage.NumberFormat = "@"
      plage = Application.Transpose(TB)

      Et à ce moment là :
      nn = 131071
      k = 131072
      SB = 11111111111111111 (2^17-1)

      :-/
      Merci
      0
    2. Modérateur
      @wire lessBonjour,

      L'erreur est due à Application.Transpose.
      Vous utilisez une "fonction de feuille", Transpose, sur une grande variable tableau. Elle affiche donc une erreur à la 65256ème valeur, ce qui correspond au nombre de cellules par colonne sous les versions d'excel < 2007.

      Pour pallier cela, il vous faut créer vous même votre fonction Transpose sous VBA, puis restituer votre tableau transposé sur la feuille.
      0
    3. Modérateur
      exemple adapté au code de ccm81 (salutations au passage) :

      Public Function decbin(b As Long) As String
      If b = 0 Then
        decbin = ""
      Else
        decbin = decbin(b \ 2) & (b Mod 2)
      End If
      End Function
      
      ' n dans 2^n-1
      Public Sub CpmpteurBin()
      Dim Tb, tbTemp(), n As Long, SB As String, k As Long, nn As Long, plage As Range
      Dim t As Single
      t = Timer
      Range("B:B").ClearContents
      Range("B:B").ClearFormats
      n = Range("A1").Value
      nn = 2 ^ n - 1
      If nn > Rows.Count Then MsgBox " n trop grand ": Exit Sub
      'TB est le tableau des binaires de 0 à 2^n - 1
      ReDim Tb(0 To nn)
      SB = String(n, "0")
      Tb(0) = SB
      For k = 1 To nn
        SB = decbin(k)
        Tb(k) = String(n - Len(SB), "0") & SB
      Next k
      Set plage = Range("B1").Resize(nn + 1, 1)
      plage.NumberFormat = "@"
      ReDim Preserve tbTemp(1 To k, 1 To 1)
      plage = Transposition(Tb, tbTemp)
      MsgBox Timer - t & " sec"
      End Sub
      
      Function Transposition(Tb, tbTemp) As Variant
      Dim j As Long
      
          For j = LBound(Tb) To UBound(Tb)
              tbTemp(j + 1, 1) = Tb(j)
          Next
          Transposition = tbTemp
      End Function
      0
    4. @pijakuOk ... ça marche mais j'ai une erreur très bizarre !
      au niveau de :
      ReDim Preserve tbTemp(1 To k, 1 To 1)

      Erreur 9 - L'indice n'appartient pas à la sélection.
      En faite, c'est très subtile.
      Je change n.
      J'exécute une première fois le script. J'ai l'erreur sus-mentionné.
      Je mets fin au script en fermant la fenêtre du déboguer.
      Je re-execute le script ... et là ! c'est nickel chrome :-/ ...
      (pas de problème pour n entre 1 et 20 ! Il faut juste que j'execute le scripte deux fois)

      J'ai bien déclaré :
      TbTemp(), Tb As Long

      (Si ça peut aider, je viens de constater que à chaque fois que le problème survient, k = nn +1 ... ce qui est logique puisque l'on vient de sortir de la boucle sur k)
      0
    5. Modérateur
      @wire lessErreur d'autant plus curieuse, bizarre, étrange et suspecte qu'elle ne se produit pas chez moi...
      Le principal étant que cela fonctionne ;-)...
      0
  4. Salut pijaku,

    Merci d'avoir débloqué la situation. Je ne connaissais pas la limitation à 65536 cases de la méthode application.transpose

    Bonne soirée à tous
    0
    1. Modérateur
      Salut ccm81,

      De rien.
      Je ne la connaissais pas non plus,... avant d'y être confronté. Et pour ta "défense", avec ton Office 2003, tu ne pouvais pas y être confronté...
      Bonne journée
      @++
      0