Dim s As Long
s = 7182231070201 Mod 97
mon probleme c'est que, durant l'execution de ce code je trouve le message d'erreur "dépassement de capacité"
si vous avez une solution stp?
Dim s As Long
s = 7182231070201 Mod 97
mon probleme c'est que, durant l'execution de ce code je trouve le message d'erreur "dépassement de capacité"
si vous avez une solution stp?
Bonjour (eh oui),
7182231070201 dépassant la limite d'un Long, tu ne peux faire celà en VB6 !
Seule solution : traiter la chaine de caractères "7182231070201" et procéder aux opératioons de division, telles que tu les ferais à la main (c'est un petit sport), avec calculs des restes à "poser" et "recupérer" (comme à l'école).![]()
salut
A verifierMotif de l'edit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Option Explicit Private Sub Form_Load() Dim s As Variant Dim t As Variant Dim u As Variant Dim Lechifr As Double Dim Diviseur As Integer 's = 7182231070201# Mod 97 Lechifr = 7182231070201# Diviseur = 97 s = Fix(CDec(Lechifr / Diviseur)) t = Lechifr - (s * Diviseur) u = CDec(t / Diviseur) MsgBox u End Sub
Désolé, le modulo est contenu dans la variable t, non pas dans la variable u.
Il reste que le code proposé a lui aussi ses limites, la proposition de ucfoutu , un post plus bas, est assurément meilleurs.
:whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
saut de ligne
OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈
Bonjour, progelect,
ça marche bien et le résultat est exact.
Pour info : la méthode scolaire (traitement de la chaine de caractères) qui permet de traiter d'énormes chaînes :
elle utilise tout simplement la méthode des restes (celle que l'on applique en posant une division)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Dim nb As String, Diviseur As Integer, l As Integer nb = "7182231070201" Diviseur = 97 l = 9 ' j'ai choisi ici 9, mais je pourrais aussi bien prendre tout autre chiffre entre 3 et 9 While Len(nb) > l nb = CStr(Val(Left(nb, l) Mod Diviseur)) & Mid(nb, l + 1) Wend nb = CStr(Val(nb Mod Diviseur)) MsgBox nb
Bonsoir
Tu peux ajouter des tests pour voir si tu passes des entiers, ou tronquer les paramètres, par exemple avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Function Modulo(Nombre As Double, Diviseur As Double) As Double Modulo = Nombre - (Int(Nombre / Diviseur) * Diviseur) End Function
Tout dépend de l'utilisation de la fonction. Je présume que c'est pour vérifier des digits de contrôle dans suites de chiffres (numéros de compte en banque, code d'articles, ...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Function Modulo(Nombre As Double, Diviseur As Double) As Double Nombre = Int(Nombre) Diviseur = Int(Diviseur) Modulo = Nombre - (Int(Nombre / Diviseur) * Diviseur) End Function
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Salut aux différents intervenants (reste que le créateur de la discussion n’a pas donné de nouvelles).
Le calcul avec des grands nombres restent toujours un problème, surtout dans des enchainements d’opérations, mais je doute que les professionnels utilisent des programmes écrits en VB.
Petite "amélioration" du code posté par Pierre Fauconnier, m’intéressant à ce type de problème, j’ai bien sûr essayé sa fonction, en passant par des Cdecs dans sa fonction, on peut allez un peu plus loin dans le nombre et l’opérateur que l’on veut faire entrées dans l’opération.
Je n’ai jamais eu l’occasion de lire un article sur le traitement des opérations (en informatique) utilisées en astronomie, chimie, biologie, balistique, ….., cela doit être une sacré usine a gaz.
Quelques secondes d’arc multiplié par X distance du but a atteindre, par exemple en balistique spatiale, sa doit être quelque chose pour le calcul, et encor là je ne retient que deux données (accélération, attirance lors du croisement d’un autre astre, ….., décélération, ……).
Un petit bout de code pour les "amoureux" du défi, sous VB, permettant d‘appréhender ses limites .
Sur un Form, 2 TextBox index 0 et 1, 2 Label et un CommandButton.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 Option Explicit Private Sub Form_Load() Text1(0).Text = "": Text1(1).Text = "": Label1.Caption = "" Text1(0).Move 480, 180, 3945, 285 Text1(1).Move 480, 525, 3945, 285 Label2.Move 90, 555, 315, 195: Label2.Caption = "Mod" Command1.Move 120, 930, 345, 375: Command1.Caption = "=" Command1.FontBold = True: Command1.FontSize = 10 Label1.Move 540, 1020: Label1.AutoSize = True Me.Height = 1995: Me.Width = 4770 End Sub Function Modulo(Nombre As Variant, Diviseur As Variant) As Variant On Error Resume Next If IsNumeric(Nombre) And IsNumeric(Diviseur) Then Modulo = CDec(Nombre) - (Int(CDec(Nombre) / Diviseur) * Diviseur) End If If Err.Number <> 0 Then Modulo = "Erreur: " & Err.Description If Modulo > Diviseur Then Modulo = "Resultat erroné: " & Modulo End Function Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0: Command1_Click End Sub Private Sub Command1_Click() Label1.Caption = Modulo(CVar(Text1(0).Text), CVar(Text1(1).Text)) End Sub
:whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
saut de ligne
OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈
Partager