VBA Function

Guten Tag

Ich habe folgende Function

Function Testzufall(zahl)
Testzufall = Round(Rnd, zahl)
End Function

Mein Ziel ist es, damit eine Zufallszahl zu generieren, die eine bestimmte Anzahl von Nachkommastellen ausweist.

Wenn ich also in einer Zelle folgendes eingebe: =Testzufall(3) sollte z. B. 0,770 ausgegeben werden. Ich erhalte aber mit dieser Function eine ungerundete Zufallszahl: statt 0,770 erhalte ich 0,7699999809265

Ich arbeite mit Excel 2010 - die Zellen sind mit Standard formatiert.

Kann mir jemand sagen, was ich in meiner Function falsch mache?

Vielen Dank für Eure Ueberlegungen
Niclaus

Vba Nachkommas bei zufallszahl

Wenn ich also in einer Zelle folgendes eingebe: =Testzufall(3)
sollte z. B. 0,770 ausgegeben werden. Ich erhalte aber mit
dieser Function eine ungerundete Zufallszahl: statt 0,770
erhalte ich 0,7699999809265

Hallo Niclaus,

funktioniert bis zahl

Moin, Niclaus,

mein Nachbau tut, was er soll. Ich habe allerdings den Function-Kopf ein wenig anders aufgebaut:

 Function gerundeter\_Wert(relevante\_Stellen as long) as double

Ich bevorzuge halt die ausdrückliche Vereinbarung der Variablen.

Gruß Ralf

Function gerundeter_Wert(relevante_Stellen as long) as double

Ich bevorzuge halt die ausdrückliche Vereinbarung der Variablen.

Hallo Ralf

Ja, ich weiss! Ich habe immer ein schlechtes Gewissen, wenn ich da so steinzeitmässig Variablen eröffne! Die verschiedenen Definitionen wollen mir nicht in den Kopf.

Zu meinem Problem: mit der Zufallszahl Rnd hilft auch die Definition der Variablen nichts. Ich erhalte nach wie vor ungerundete Zufallszahlen. Oder mach ich etwas falsch bei der Uebernahme Deines Hinweises?

Function gerundeter\_Wert(relevante\_Stellen as long) as double
 gerundeter\_Wert = Round(Rnd, relevante\_Stellen)
End Function

Wenn ich in einer Zelle eingebe: =gerundeter_Wert(3) erhalte ich als Resultat z. B. 0,760999977588653 nicht wie erwartet 0,761 (Formatierung Standard)

Wenn ich in Deiner Formel statt Rnd eine Zahl eingebe (etwa 0,760999977588653), dann erhalte ich das gewünschte Resultat (0,761). Mein Problem muss wohl irgendwie mit Rnd zusammenhängen.

Vielen Dank für Deine Bemühungen und viele Grüsse
Niclaus

funktioniert bis zahl

Hallo Niclaus,

funktioniert bis zahl http://www.wer-weiss-was.de/article/7263303

C’est la vie. Ich kann nicht schweigend etwas hinnehmen
was mich innerlich völlig ärgert.

Gruß
Reinhard

Moin, Niclaus,

zunächst mal versorge ich Funktionen immer über Parameter; damit habe ich die Kontrolle über die Zahlentypen, mit denen sie gerufen wird:

 Function gerundet(zu\_runden As Double, Stellen As Long) As Double
 gerundet = Round(zu\_runden, Stellen)
 End Function

Hier mein Testlauf:

Sub tt()

 Dim zahl As Double

 zahl = 0.761929809265
 Debug.Print gerundet(zahl, "1")
 Debug.Print gerundet(zahl, "2")
 Debug.Print gerundet(zahl, "3")
 Debug.Print gerundet(zahl, "4")
 Debug.Print gerundet(zahl, "5")
 Debug.Print gerundet(zahl, "6")
 Debug.Print gerundet(zahl, "7")
 Debug.Print gerundet(zahl, "8")
End Sub

mit den Ergebnissen

 0,8
 0,76
 0,762
 0,7619
 0,76193
 0,76193
 0,7619298 
 0,76192981 

Und nun kommt mein Problem: Ich habe keine Ahnung, wie ich diese Funktion meinem Excel bekannt mache - an

 =gerundet(zahl,stellen)

scheitere ich mit #NAME.

Gruß Ralf

Grüezi Ralf

Dein Testlauf:

Sub tt()
Dim zahl As Double
zahl = 0.761929809265
Debug.Print gerundet(zahl, „1“)
Debug.Print gerundet(zahl, „2“)
Debug.Print gerundet(zahl, „3“)
End Sub

mit den Ergebnissen

0,8
0,76
0,762

Dieser Test ist auch bei mir ok.

Und nun kommt mein Problem: Ich habe keine Ahnung, wie ich
diese Funktion meinem Excel bekannt mache

Function gerundet(zu_runden As Double, Stellen As Long) As
Double
gerundet = Round(zu_runden, Stellen)
End Function

Ich habe Deine Function folgendermassen geändert :

Function gerundet(Stellen As Long) As Double
Dim zu\_runden As Double
zu\_runden = Rnd
gerundet = Round(zu\_runden, Stellen)
End Function

Wenn ich nun in einer beliebigen Excel-Zelle eingebe

=gerundet(5)

erhalte ich wie gewünscht eine 5-stellige Zufallszahl.

Deine Function funkt bei mir wie ich es mir vorgestellt habe. Vielen Dank und viele Grüsse
Niclaus

Servus,

Ich habe Deine Function folgendermassen geändert :

nicht ganz sauber, weil es die Wiederverwendbarkeit der Funktion beeinträchtigt: Die Variable Rnd ist außerhalb der Funktion definiert.

Mein Aufruf klappt inzwischen, ich hatte verschwitzt, dass Paramter durch Semikolon getrennt werden :frowning:

Deine Function funkt bei mir wie ich es mir vorgestellt habe.

Freut mich zu hören.

Gruß Ralf

Und nun kommt mein Problem: Ich habe keine Ahnung, wie ich
diese Funktion meinem Excel bekannt mache - an
=gerundet(zahl,stellen)
scheitere ich mit #NAME.

Hallo Ralf,

steht das genau so in der Zelle? Dann fällt mir das Komma auf,
hast du keine dt. Tastenlayouts eingestellt?

Steht auch die Fktn. genauso in einem allgemeinen Modul,
ohne Private davor? (ob Private Auswirkungen haben könnte
weiß ich grad nicht auswendig, ich benutze es kwasi nie)

Zahl und Stellen sind vergebene Namen?
Ach, kürzen wir das ab, prüfe genauestens alle Namen nach.
Wenn erfolglos, Beispielmappe hochladen…

Achja, verwechsle ich dich oder stimmt’s daß du auch
gern Sudokus „machst“. Wenn ja, darf ich dir mal eines
schicken? Peinlicherweise habe ich da trotz 3maliger
Anläufe nur EINE Zahl gefunden.

Gruß
Reinhard

Moin, Reinhard,

scheitere ich mit #NAME.

hat sich in Wohlgefallen aufgelöst, da gehört ein Semikolon zwischen die Parameter.

darf ich dir mal eines schicken?

Nur zu!

Gruß Ralf

Hallo Ralf

Ich habe Deine Function folgendermassen geändert :

nicht ganz sauber, weil es die Wiederverwendbarkeit der
Funktion beeinträchtigt: Die Variable Rnd ist außerhalb der
Funktion definiert.

Innerhalb der Funktion, das bedeutet folgendermassen, oder nicht?

Function gerundetA(Stellen As Long) As Double
gerundetA = Round(Rnd, Stellen)
End Function

Das haut aber nicht hin: ich erhalte wie früher mehr als die gewünschten Stellen nach dem Komma.

Grüsse Niclaus

Moin, Niclaus,

wo ist die Variable definiert? Bei mir innerhalb der Function, durch die Parameterleiste: zu_runden as double. Bei Dir weiß ich’s nicht, könnte innnerhalb sein als implizite Declaration, könnte aber auch eine globale Variable sein.

Meine Empfehlung: Immer mit option(explicit) arbeiten, dann verlangt der Compiler die Declaration.

Gruß Ralf

Moin, Niclaus,

wo ist die Variable definiert? Bei mir innerhalb der Function,
durch die Parameterleiste: zu_runden as double. Bei Dir weiß
ich’s nicht, könnte innnerhalb sein als implizite Declaration,
könnte aber auch eine globale Variable sein.

Hallo Ralf

Ich habe, wie weiter oben erwähnt, einer Deiner Vorschläge leicht abgeändert übernommen:

Function gerundet(Stellen As Long) As Double
Dim zu_runden As Double
zu_runden = Rnd
gerundet = Round(zu_runden, Stellen)
End Function

So klappt es bestens. Die Ergebnisse sind so, wie ich sie erwarte.

Hier ist alles deklariert, was ich deklarieren kann. Rnd ist eine VBA-interne „Funktion“, die ich nicht deklarieren kann. Ich habe es zwar versucht mit Dim Rnd As Double (die einzige Deklaration die hier in Frage kommt?). Aber dann erhalte ich immer das Ergebnis 0, wenn ich die Function in einer Excel-Zelle einsetze.

Vielen Dank für Deine Mühen und viele Grüsse
Niclaus

Hallo Niclaus,

Hier ist alles deklariert, was ich deklarieren kann.

sicher?
Du könntest das auch so
Function gerundet(ByVal Stellen As Long) As Double
oder so
Function gerundet(ByRef Stellen As Long) As Double
schreiben.

ByVal/ByRef kann wichtig werden. Ein API-Guru, Dan
Appleman schreibt in seinem einzig auf deutsch erschienenen
Buch ziemlich viele Seiten nur zu ByRef/ByVal.
Denn scheinbar, da mal das falsche benutzt stürzt Excel
komplett ab.

Und viel viel schlimmer, es stürzt nicht ab aber es
können falsche Ergebnisse rauskommen und wenn man
bei der Fehlersuche stundenlang nicht draufkommt daß es an
dem liegt :frowning:
Und das Buch wendet sich wie alles mit API an erfahrene
Vbaler.

Das jetzt mal geschrieben als reine Information, für so Kleincodes
brauchste das nicht zu beachten.

Rnd ist
eine VBA-interne „Funktion“, die ich nicht deklarieren kann.

Richtig , könntest du nur wenn aus Redmond den Originalcode
von Excel klaust und das im Code vorm Kompilieren abänderst *gg*

Ich habe es zwar versucht mit Dim Rnd As Double (die einzige
Deklaration die hier in Frage kommt?).

Genau auf deine Frage antworten, Rnd kannste deklarieren wie du
willst, koommen also viele Deklarationen in Frage.

Aber dann erhalte ich
immer das Ergebnis 0, wenn ich die Function in einer
Excel-Zelle einsetze.

Logisch, in deiner Funktion hast du nicht die interne Funktion
Rnd eingesetzt sondern durch das Dim Rnd deine Variable Rnd.
Und Variablen die nur deklariert sind haben halt den Wert 0
oder leer oder nix…

Nachstehend Code, teste mal die Subs.
Dann mach die Hochkommas weg von der Funktion und teste
die erste Sub erneut…

Um nicht in unnötige Problematiken zu kommen benenne grundsätzlich
deine Variablen, Subs, Funcs nie wie interne „Namen“.
Außer mit voller Absicht.

Gruß
Reinhard

Sub RundenMitRndFunktion()
MsgBox Round(Rnd(7), 6)
End Sub

Sub RundenMitRndAlsEigenVariable()
Dim Rnd(7)
MsgBox Round(Rnd(7), 6)
End Sub

'Function Rnd(zahl)
'Rnd = 5
'End Function

Bescheuerte Namen
Servus,

Rnd ist eine VBA-interne „Funktion“, die ich nicht deklarieren kann.

na tholl - alle Welt redet von Namenskonventionen bis hin zu den dämlichen Prefixen (lngZeilen, intHöhe, tblKUuden, …) und Excel hat es nicht mal nötig, das Wort Random auszuschreiben. Ich bin prompt reingefallen und dachte, die Variable hätte was mit R u nd en zu tun.

Gruß Ralf