2014-01-05 8 views
6

Ich bekomme immer einen Laufzeitfehler in vba:Run-Time Error 6 - Wie man Mod ein Doppel machen?

Sub rsa() 

Dim c1 As Long 
Dim c2 As Long 
Dim z As Long 
Dim e As Long 

pt = "xa" 
n = 187 
e = 7 

For i = 1 To Len(pt) 

    b = Mid$(pt, i, 1) 

     If b <> " " Then 

      z = Asc(UCase(b)) 
      'Here is the problem: 
      c = z^e Mod n 
      Text = Text & c 

     Else 

     Text = Text & " " 

     End If 

Next i 
Cells(20, 4).Value = Text 
End Sub 

ich den Laufzeitfehler bei c = z^e Mod n bekommen.

Ich habe verschiedene Datentypen versucht, aber ohne eine Lösung.

+0

was ist die Präzedenz? Sind Sie sicher, dass z ein numerischer Wert ist? Was ist z sollten Sie dies nicht tun, um z: Cint (z) –

+0

z ist 88 in meinem Beispiel. – yab86

Antwort

10

A Mod B ist A - Int(A/B) * B gleich, so können Sie versuchen, c = z^e - Int(z^e/n) * n statt c = z^e Mod n zu verwenden. Es funktioniert für mich

+1

Perfekt - es funktioniert! Ich danke dir sehr!!!! – yab86

+4

Das Problem liegt darin, dass MOD versucht, 'z^e' und' n' in 'Long' zu konvertieren, bevor mit ihnen gearbeitet wird, aber' z^e' ist größer als 'Long' max. –

2

Laufzeitfehler 6 ist eine numerische Überlaufoperation. Eine Ihrer Variablen ist nicht groß genug oder nicht ausreichend genau definiert. Sie müssen mehr Beispiele zeigen usw., damit die Leute Ihnen eine bessere Idee geben können. Das erste, was ich tun würde, ist ALLE Zahlen auszudrucken, bevor Sie die Formel ausführen.

Verwenden Sie den Datentyp Doppel und wenn CDbl zu Doppelnutzung Umwandlung()

+0

Nun, ich habe: z = 88/e = 7/n = 187/c = 0 – yab86

+0

Das Problem, das ich sehe, sind einige der Variablen in der Kalkulation wurden nicht definiert (zum Beispiel haben Sie gerade einen Wert zugewiesen). Die Standarddatentypen können INT sein ... Sie sollten sicherstellen, dass alle Variablen gleich definiert und definiert sind. Wenn sie nicht identisch sein können, dann stelle sicher, dass du sie konvertierst (z. B. CLng()), um gut miteinander zu spielen. –

+0

Danke, aber das geht nicht :-( – yab86