Microsoft Excel

Herbers Excel/VBA-Archiv

Integerzähler nur bis 91 | Herbers Excel-Forum


Betrifft: Integerzähler nur bis 91 von: Ludwig
Geschrieben am: 16.01.2012 12:15:54

Hallo Experten

In einer Function habe iche eine Schleite kontrolliert durch den "Zähler".
Bei erreichen von Zähler= 92 unterbricht die Schleife ohne Ergebnisse!

Dim Zähler As Integer

For Zähler = 1 To nB Step 1
....
Next Zähler

Woran kann das liegen?

Vielen Dank für die Antwort im Voraus.

MfG
Ludwig

  

Betrifft: welchen Wert hat nB ? o.T. von: Josef Ehrensberger
Geschrieben am: 16.01.2012 12:20:18

« Gruß Sepp »



  

Betrifft: AW: Integerzähler nur bis 91 von: Rudi Maintaire
Geschrieben am: 16.01.2012 12:48:11

Hallo,
Woran kann das liegen?
daran, dass Zähler=nB ist.

Gruß
Rudi

P.S.: Verwende keine Umlaute in VBA.


  

Betrifft: AW: Integerzähler nur bis 91 von: Ludwig
Geschrieben am: 16.01.2012 13:47:37

Hallo Rudi

Sorry hätte ich erwähnen sollen, nB= 140!

Gruß Ludwig


  

Betrifft: AW: Integerzähler nur bis 91 von: Rudi Maintaire
Geschrieben am: 16.01.2012 13:56:26

Hallo,
liegt nicht an dem Fragment.

Mehr Code/ Mappe.

Gruß
Rudi


  

Betrifft: Was heißt unterbricht von: Harald Kapp
Geschrieben am: 16.01.2012 14:47:45

Hallo Ludwig,
was heißt "unterbricht"?
Gibt es einen Fehler?
Springt das Programm möglicherweise auf Grund einer "On Error" Anweisung an eine andere Stelle?
Wird evtl. "nb" innerhalb der Schleife geändert, so dass es gar nicht dem von Dir erwarteten 140 entspricht?

Gruß
Harald


  

Betrifft: AW: Was heißt unterbricht von: Ludwig
Geschrieben am: 17.01.2012 11:58:49

Hallo Harald

Kann leider erst jetzt weiter machen - sorry!

- Nein, es gibt keine Fehlermeldung. Kontrolliere ich die Schleife im VBA durch einen Haltepunkt, springt VBA nach erreichen von Zaehler= 92 direkt aus dieser Schleife, aus der finction.
- nb wird in der Schleife nicht geändert!
- Es gibt keine OnError Anweisung in der function!

hier die ganze Function:

Function redFlaechentraegheit( _
    Da As Single, _
    Di As Single, _
    Dlk As Single, _
    Db As Single, _
    nB As Single)

Dim Zwert, Z_118, Z_119, Z_121 As Single
Dim Zaehler As Integer

Zwert = 0

Z_118 = PI / 64 * (Da ^ 4 - Di ^ 4)
Z_119 = PI / 64 * Db ^ 4
For Zaehler = 1 To nB Step 1
   Z_121 = Z_119 + (PI / 4 * Db ^ 2 * (Abs(Cos(Zaehler * 360 / nB * PI / 180) * Dlk / 2)) ^ 2)
   Zwert = Zwert + Z_121
   Debug.Print "redFlaechentraegheit =" & (Z_118 - Zwert) / 1000000000000#
   Debug.Print "Zähler =" & Zaehler
Next Zaehler
redFlaechentraegheit = (Z_118 - Zwert) / 1000000000000#

End Function



MfG
Ludwig


  

Betrifft: AW: Was heißt unterbricht von: Harald Kapp
Geschrieben am: 17.01.2012 15:04:52

Hallo Ludwig,
leider kenne ich nicht die Werte der Übergabeparameter.

Zunächst fällt auf, dass der Rückgabetyp der Funktion nicht definiert ist. Normalerweise müsste das prinzipiell so aussehen:

Function x() As Typ
'...
End Function
Wobei "Typ" der Typ des Funktionsergebnisses ist, also bei Dir das, was in der Zeile
redFlaechentraegheit = (Z_118 - Zwert) / 1000000000000#
berechnet wird (single oder double?).

Zum Testen habe ich die Funktion mal als Subroutine umgeschrieben:
Sub test()

Dim Da As Single, _
    Di As Single, _
    Dlk As Single, _
    Db As Single, _
    nB As Single
Const Pi = 3.14

Dim Zwert, Z_118, Z_119, Z_121 As Single
Dim Zaehler As Integer
Dim redFlaechentraegheit As Double
nB = 254

Zwert = 0

Z_118 = Pi / 64 * (Da ^ 4 - Di ^ 4)
Z_119 = Pi / 64 * Db ^ 4
For Zaehler = 1 To nB Step 1
   Z_121 = Z_119 + (Pi / 4 * Db ^ 2 * (Abs(Cos(Zaehler * 360 / nB * Pi / 180) * Dlk / 2)) ^ 2)
   Zwert = Zwert + Z_121
   Debug.Print "redFlaechentraegheit =" & (Z_118 - Zwert) / 1000000000000#
   Debug.Print "Zähler =" & Zaehler
Next Zaehler
redFlaechentraegheit = (Z_118 - Zwert) / 1000000000000#

End Sub
Dabei hält bei mir der Debugger in der Zeile
Z_121 = Z_119 + (Pi / 4 * Db ^ 2 * (Abs(Cos(Zaehler * 360 / nB * Pi / 180) * Dlk / 2)) ^ 2)

mit einem Laufzeitfehler 6 (Überlauf) an. Der Zaehler ist in diesem Moment =92 !



Probier mal "Zähler" als Long zu deklarieren (statt Integer). Bei mir läuft die Subroutine dann über 92 weiter. Ob das Ergebnis stimmt, kann ich nicht verifizieren.

Übrigens täte es der Genauigkeit auch gut, wenn Du statt Single grundsätzlich Double verwenden
würdest. Der Fehler, der durch das Aufaddieren innerhalb der Schleife bei begrenzter Genauigkeit entsteht, ist dadurch nicht so groß.

Gruß

Harald


  

Betrifft: AW: Was heißt unterbricht von: Ludwig
Geschrieben am: 18.01.2012 08:17:50

Hallo Harald

Vielen Dank, das war es! Den Zaehler als Long deklariert und schon läuft die Schleife durch!
Nochmals DANKE!
Ich habe auch die real-Zahlen als Double deklariert - bringt jedoch das gleiche Ergebnis ist aber eben technisch sauberer!

Zur Erklärung: Die oben stehende Programierung habe ich noch von Excel 4 mit rüber genommen - ist deswegen "quick and dirty"!

MfG
Ludwig


  

Betrifft: AW: Was heißt unterbricht von: Harald Kapp
Geschrieben am: 18.01.2012 08:35:15

Hallo Ludwig,
ich kann nur vermuten, dass das an der Art liegt, wie der Ausdruck innerhlab des Cosinus ausgewertet wird. Prinzipiell lässt sich mit Integer eine Zahl bis +32767 darstellen. Alsol sollte Zähler kleiner gleich 140 kein Problem sein. Vermutlich rechnet Excel aber 360*Zähler auch als Integer.
360*91 = 32760, also gerade noch kleiner als die "magische" Grenze für Integer.
360*91 = 33120, also zu groß für Integer, daher der Überlauf.

Ich weiß nicht, wie groß nB werden kann, aber Long geht bis +2147483647. Damit kann Zähler maximal 5965232 werden. Reicht vermutlich. Wenn Du aber auf Nummer sicher gehen willst, dann empfehle ich Dir, mit Double zu rechnen. Da der Tähler aber sinnvollerweise eine ganze Zahl bleibt, ist eine Typumwandlung nötig. Das könnte dann so aussehen:
..cos( Cdbl(Zähler)* 360.0 / nB * Pi / 180.0)...

Übrigens könntest Du die Berechnung gut beschleunigen, wenn Du den Ausdruck
360.0 * Pi / 180.0 (übrigens = 2*Pi) als Konstante 2Pi = 6.28318... definierst und die Formel zu
...cos( Cdbl(Zähler)* 2Pi / nB)...
umschreibst. Dann entfällt die Berechnung je Schleifendurchlauf.


Gruß
Harald


  

Betrifft: AW: Was heißt unterbricht von: Ludwig
Geschrieben am: 18.01.2012 14:11:59

Hallo Harald

Ja, Du hast recht!
Sollte die Functions alle mal in diesem Sinne überarbeiten.

MfG
Ludwig