Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Makro läuft nicht

Betrifft: Makro läuft nicht von: alifa
Geschrieben am: 11.08.2008 17:39:25

Hallo VBA Gemeinde,
obwohl nur zehn Ziffern, kommt die Meldung: Überlauf. Habe schon alles versucht, Currency, Double. Long hört bei mir bei 2147483467 auf. Decimal nimmt er irgendwie nicht an. Kann jemand helfen?

Sub Alifa() 
      Dim a(0 To 9) As Byte, i As Byte, t As Single
      For i = 0 To 9
          a(i) = i
      Next i
      t = Timer
      Call Permutation(a, 0, 9)
      MsgBox "Fertig nach " & Round(Timer - t, 1) & " Sekunden"
  End Sub



Sub Permutation(ByVal a, k As Byte, n As Byte)
      Dim i As Byte, x As Byte
      If k = n Then
          Call Auswerten(a)
      Else
          For i = k To n
              x = a(i)
              a(i) = a(k)
              a(k) = x
              Call Permutation(a, k + 1, n)
          Next
      End If
  End Sub


Sub Auswerten(ByVal a)
  Dim w As Double
  w = (a(0) & a(1) & a(2) & a(3) & a(4) & a(5) & a(6) & a(7) & a(8) & a(9))
If w Mod 7 = 0 And _
Mid(w, 1, 8) Mod 7 = 0 Or Mid(w, 2, 8) Mod 7 = 0 And Mid(w, 1, 7) Mod 7 = 0 Or _
Mid(w, 2, 7) Mod 7 = 0 Or Mid(w, 3, 7) Mod 7 = 0 And Mid(w, 1, 6) Mod 7 = 0 Or _
Mid(w, 2, 6) Mod 7 = 0 Or Mid(w, 3, 6) Mod 7 = 0 Or Mid(w, 4, 6) Mod 7 = 0 And _
Mid(w, 1, 5) Mod 7 = 0 Or Mid(w, 2, 5) Mod 7 = 0 Or Mid(w, 3, 5) Mod 7 = 0 Or _
Mid(w, 4, 5) Mod 7 = 0 Or Mid(w, 5, 5) Mod 7 = 0 And Mid(w, 1, 4) Mod 7 = 0 Or _
Mid(w, 2, 4) Mod 7 = 0 Or Mid(w, 3, 4) Mod 7 = 0 Or Mid(w, 4, 4) Mod 7 = 0 Or _
Mid(w, 5, 4) Mod 7 = 0 Or Mid(w, 6, 4) Mod 7 = 0 And Mid(w, 1, 3) Mod 7 = 0 Or _
Mid(w, 2, 3) Mod 7 = 0 Or Mid(w, 3, 3) Mod 7 = 0 Or Mid(w, 4, 3) Mod 7 = 0 Or _
Mid(w, 5, 3) Mod 7 = 0 Or Mid(w, 6, 3) Mod 7 = 0 And _
Mid(w, 7, 3) Mod 7 = 0 Then
Cells(r + 1, 1) = a(0) & a(1) & a(2) & a(3) & a(4) & a(5) & a(6) & a(7) _
& a(8) & a(9)
r = r + 1
   End If
  End Sub


kurz das Problem. Gesucht eine zehn- stellige Zahl, die alle Ziffern von 0 bis 9 genau einmal beinhaltet. Aus dieser Zahl sollen 2,3,4,5,6,7,8,9-stellige Zahlen(zusammenhängend) gebildet werden können. Alle teilbar durch 7.
Gruß, alifa

  

Betrifft: AW: Makro läuft nicht von: Daniel
Geschrieben am: 11.08.2008 18:17:54

hi
1. Frage: Variable r ist nicht dimensoniert, wie sollte diese dimensioniert sein?
2. Frage: du arbeitest offensichtlich nicht mit Option Explicit, das erhöht die Fehlermöglichkeit durch falsche Variabelnbezeichnungen die nicht erkannt werden.
3. Welche Variable erzeugt den Überlauf, in welcher Zeile passiert der Fehler?

Egal wie du R dimensionerst (wahrscheinlich Global als LONG)
mehr als 65536 Permutationen kannst du nicht auf einem Blatt anzeigen, weil du nicht mehr Zeilen zur verfügung hast.
alleine schon durch bei den 10-Stelligen Zahlen hast du 518.400 - Permutationmöglichkeiten (Fakultät(10) / 7)
da musst du entwerder auf Excel 2007 warten oder dir noch was einfallen lassen, wie du das darstellen wills(
(z.B. wenn R > max Zeilenzahl, dann Spalte um 1 erhöhen und R wieder auf 1 setzen)

Gruß, Daniel


  

Betrifft: AW: Makro läuft nicht von: alifa
Geschrieben am: 11.08.2008 23:08:21

Hallo Daniel,
1. Die Zeilenzahl ist hier nicht das Problem. Es gibt wahrscheinlich nur eine einzige Lösung für mein Problem.
2. Das stimmt. die Variabeln werden so als Variant dimensioniert.
3. Die Varible w erzeugt den Überlauf, die zehnstellige Zahl also.
Ein zusätzliche Frage meinerseits: Kann das "Or" in einer If...Then Schleife so wie ich das gemacht habe bestehen? Ich hatte einen Versuch gemacht mit 9 Zahlen. Da schien das "Or" nicht wirksam zu sein. Es gab ein Resultat, das aber nicht stimmte. Meine zehnstellige Zahl soll auch eine 6-stellige beinhalten, die durch 7 teilbar ist. Bei der 3-stelligen, z.B gibt es mehrere Möglichkeiten. (Bei den anderen natürlich auch) Die habe ich im Makro mit dem "Or" gemeint.
Dort kann ich keinesfalls "And" anwenden.
Gruß, Alifa


  

Betrifft: AW: Makro läuft nicht von: Jürgen
Geschrieben am: 11.08.2008 18:44:39

Hallo Alifa,

Daniel hat Dich schon auf einige Punkte aufmerksam gemacht. Wenn Du in der Onlinehilfe nach dem Decimal-Datentyp nachschlägst, findest Du den Hinweis, dass man keine Variable als Decimal deklarieren kann, sonden sie als variant deklariert und mit CDec() eine Decimal-Untertypen erzeugt, also z.B. so:

Dim w As Variant
w = CDec(a(0) & a(1) & a(2) & a(3) & a(4) & a(5) & a(6) & a(7) & a(8) & a(9))

So hast Du zwar eine ausreichend dimensionierte Variable - unglücklicherweise kommt aber Mod damit nicht zurecht. Und da w (nebenbei: sprechende Variablennamen helfen Dir, auch in drei Monaten noch Deienn Code zu verstehen...) im folgenden mittels Mid() nur als String ausgewertet wird (hier rettet Dich übrigens nur die automatische Typkonvertierung von Excel - mit den entsprechenden Performanceverlusten), könnte Dein Code so aussehen:

Dim w as String
w = a(0) & a(1) & a(2) & a(3) & a(4) & a(5) & a(6) & a(7) & a(8) & a(9)

If Int(CDec(w) / 7) = CDec(w) / 7 and _
....


Gruß, Jürgen


  

Betrifft: AW: Makro läuft nicht von: alifa
Geschrieben am: 12.08.2008 09:33:17

Hallo Jürgen,
ja, jetzt gibt es keinen Überlauf mehr, doch in einer viertel Stunde ein falsches Ergebnis: 9876543210. Ist nicht teilbar durch 7. Die Zahlen 21, 987, 5432, 87654 sind teilbar, doch man findet keine 6-stellige durch 7 teilbare Zahl, auch keine mögliche Neunstellige. Woran liegt es, ich komm nicht drauf.


  

Betrifft: AW: Makro läuft nicht von: Jürgen
Geschrieben am: 13.08.2008 00:56:35

Hallo Alifa,

ohne bislang bis ins Letzte verstanden zu haben, wie Dein Lösungsweg funktioniert (dafür ist die Nacht zu fportgeschritten...), vermute ich, dass Du nicht bedacht hast, dass ein "and" stärker bindet als ein "or" (analog "Punkt- vor Strichrechnung"). Setze also entsprechende Klammern, um die gewünschte Logik zu erreichen. Statt

Ausdruck1 or Ausdruck2 and Ausdruck3

was "Ausdruck1 or (Ausdruck2 and Ausdruck3)" enspricht, also

(Ausdruck1 or Ausdruck2) and Ausdruck3

Gruß, Jürgen


  

Betrifft: AW: Makro läuft nicht von: alifa
Geschrieben am: 13.08.2008 14:45:15

Hallo Jürgen,
ich glaube, dass es für dieses Problem keine Lösung gibt. Wenn ich die Achtziffrige ausklammere, dann kommt die Zahl 7945063812., die durch 7 teilbar ist. Daraus kann man Zahlen bilden, die durch 7 restlos teilbar sind.
7, 63, 945, 7945, 79450, 945063, 7945063, 945063812. Nur keine 8-stellige.
Mein Makro macht alle Permutationen der Ziffern 0 bis 9. und bildet 10 stellige Zahlen. Diese werden dann geprüft, ob die darin enthaltenen weniger Ziffern enthaltenden Zahlen auch durch 7 teilbar sind. Die Zehnstellige muss auch teilbar sein. Vielleicht kann ein anders aufgebautes Makro dies nachvollziehen.
Ich habe das Makro umgeschrieben, es gibt kein "Or" mehr. ZB. w3=a(1) & a(2) & a(3)
w3=a(2) & a(3) & a(3)
w3=a(3) & a(4) & a(5)......
w3=a(7) & a(8) & a(9)
So habe ich alle möglichen Zahlen definiert und dann: If w3 Mod 7=0 Then....
Gruß, Alifa