Un compteur binaire en VBA
Résolu
wire less
Messages postés
233
Date d'inscription
Statut
Membre
Dernière intervention
-
pijaku Messages postés 12263 Date d'inscription Statut Modérateur Dernière intervention -
pijaku Messages postés 12263 Date d'inscription Statut Modérateur Dernière intervention -
A voir également:
- Un compteur binaire en VBA
- Compteur électrique - Guide
- Binaire - Guide
- Comment ralentir un compteur linky forum - Accueil - Objets connectés
- Compteur contractions - Télécharger - Santé & Bien-être
- Excel compter cellule couleur sans vba - Guide
4 réponses
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
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
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
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
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
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)
L'erreur survient sur la ligne :
Le code exécuté est :
Et à ce moment là :
nn = 131071
k = 131072
SB = 11111111111111111 (2^17-1)
:-/
Merci
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
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.
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.
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
Ok ... ça marche mais j'ai une erreur très bizarre !
au niveau de :
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é :
(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)
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)
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 ?