Un compteur binaire en VBA

Résolu/Fermé
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 - 13 févr. 2015 à 14:32
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 19 févr. 2015 à 07:35
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.

A voir également:

4 réponses

ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
13 févr. 2015 à 15:13
Bonjour

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

Cdlmnt
0
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5
13 févr. 2015 à 15:56
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 13/02/2015 à 16:02
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
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5
16 févr. 2015 à 18:35
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
16 févr. 2015 à 20:19
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
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5
17 févr. 2015 à 11:10
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018
17 févr. 2015 à 11:58
Bonjour,

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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
17 févr. 2015 à 13:01
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
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
17 févr. 2015 à 16:28
Ok ... ç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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018
17 févr. 2015 à 16:38
Erreur d'autant plus curieuse, bizarre, étrange et suspecte qu'elle ne se produit pas chez moi...
Le principal étant que cela fonctionne ;-)...
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
18 févr. 2015 à 20:25
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
19 févr. 2015 à 07:35
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