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
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
A voir également:
- Un compteur binaire en VBA
- Codage binaire - Guide
- Comment ralentir un compteur linky - Guide
- Compteur de contractions - Télécharger - Santé & Bien-être
- Find vba - Astuces et Solutions
- Incompatibilité de type vba ✓ - Forum Programmation
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
13 févr. 2015 à 15:13
Bonjour
Un petit exemple
https://www.cjoint.com/?3BnpyfQnZdB
Cdlmnt
Un petit exemple
https://www.cjoint.com/?3BnpyfQnZdB
Cdlmnt
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
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
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
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
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
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
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
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
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)
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
17 févr. 2015 à 11:10
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
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
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.
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.
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
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
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
17 févr. 2015 à 16:28
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)
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
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 ;-)...
Le principal étant que cela fonctionne ;-)...
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
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
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
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
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
@++
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
@++
13 févr. 2015 à 15:56
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 ?