Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
840to844
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
840to844
840to844
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VBA: der zehnt schlechteste Wert

VBA: der zehnt schlechteste Wert
01.02.2007 08:21:15
Jens
Guten Morgen,
eine Schleife simuliert beispielsweise 1.000.000 Zufallszahlen.
Ich möchte jetzt die zehnt- oder 100- oder 1.000 schlechteste Zahl dieser Simulation angezeigt haben.
Kann mir da jemand weiterhelfen?
Gruss, Jens

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: der zehnt schlechteste Wert
01.02.2007 08:51:51
haw
Hallo Jens,
fur 20-kleinste Zahl:

Sub Makro1()
Dim a
a = WorksheetFunction.Small(Range("A:A"), 20)
MsgBox a
End Sub

Gruß Heinz
AW: VBA: der zehnt schlechteste Wert
01.02.2007 08:52:46
Stefan
Hallo Jens,
kann man das nicht mit dem Filter machen? Das kannst du auch als Makro aufzeichnen.
Gruß
Stefan
AW: VBA: der zehnt schlechteste Wert
01.02.2007 09:00:34
Jens
Ersteinmal Danke für Eure Antworten!
Jedoch ist es nicht das, was ich meine. Diese Methode kann man bei einer kleineren Anzahl von Simulationen anwenden, wo man die Zufallszahlen in Excel ausgibt.
Diese Zufallszahlen, die ich meine, werden in einer Schleife erzeugt und gleich weiter verarbeitet.
Das Problem bspw. bei 1.000.000 oder mehr Simulationen besteht auch darin, diese Werte überhaupt nach Excel zu exportieren.
Jens
Anzeige
AW: VBA: der zehnt schlechteste Wert
01.02.2007 09:06:41
haw
Hallo Jens,
tut mir leid, ich sehe das Problem nicht!
Ist es ein Schnittstellenproblem? Wo kommen die Daten her?
Ob es Zufallszahlen oder andere Zahlen sind ist doch egal, wenn du die 10.-kleinste Zahl haben willst.
Gruß Heinz
AW: VBA: der zehnt schlechteste Wert
01.02.2007 09:16:38
Jens
Hallo Heinz,
berechnet und nach Excel ausgegeben wird aus diesen vielen Zufallszahlen nur der Mittelwert der Zufallszahlen bzw. die Standardabweichung.
Angenommen, man hat jetzt 4 Pfade à 1.000.000 Zufallszahlen sprich 4.000.000 Werte.
Nach Deiner Methode müsste ich diese Werte ja dann alle nach Excel schreiben und dann auswerten. Problematisch ist jedoch auch hier, dass Excel pro Spalte nur 65.536 Reihen besitzt.
Gibt es eine Möglichkeit, diesen bspw. zehnt-schlechtesten Wert auch in der Schleife zu ermitteln?
Danke für Deine Hilfe, Jens
Anzeige
AW: VBA: der zehnt schlechteste Wert
01.02.2007 10:26:00
haw
Hallo Jens,
mit einer Schleife würdest du alt werden. Grundsätzlich sind ja die Tabellenfunktion um einiges schneller als VBA.
Ich sehe keine Möglichkeit deinen Wunsch zu erfüllen, ohne die Daten in Excel einzulesen.
Wie schnell die "Open for Input"-Methode wäre, kann ich nicht sagen.
Gruß Heinz
AW: VBA: der zehnt schlechteste Wert
01.02.2007 11:16:21
ingUR
Hallo, Jens,
hier könntest Du mit einem zsätzlichem Feld arbeiten, dass gerade alle Elemnte aufnehmen kann, die Du vorhalten mußt, um Deinen Vergleich zu starten. Nachteil.
Pseudo-Code:

const MAXANZ= 100 'Anzahl der schlechtesten Werte
sub SchlechtesteWerte() 'einer Zufallsreihe
dim StackX() as double ' wird nach Anforderung Dimensioniert 10-, 100-, 1000-
dim aktGWert as doubel ' aktuell größter Wert im Stack
dim fillN as Long 'Füllstand des Stacks
dim ipos as long 'Zeiger auf den größten Wert im Stack
redim StackX(MAXANZ)
randomize()
SchleifenStart
z=rnd() 'Zufallszahl
if maxN < MAXANZ then
'jeder Wert kommt in den Stack, bis Liste gefüllt ist
'Achhtung: hier zählt jed Wiederholungen als Einzelwert
maxN=maxN+1
StackX(maxN)=z
if Stack(maxN)>aktGWert or ipos=0 then
ipos=maxN
aktGWert=z
end if
else
' der Stack ist gefüllt,
' daher wird hier nur noch der jeweils größte Wert
' in der Liste, durch den gezogenen kleineren Wert ersetzt
StackX(ipos)=z
aktGWert=z
for n=1 to maxN
'suche nach Position des nun größten Werts im Stack
if StackX(n) > aktGWert then
ipos=n
aktGWert = Stack(ipos)
end if
next n
end if
Schleifen Ende
Soweit die Grundgedanken, die möglicherweise nicht fehlerfrei sind.
Gruß,
Uwe
Anzeige
AW: Nachsatz
01.02.2007 11:25:29
ingUR
Jens,
erste Korrektur:
...
else
' der Stack ist gefüllt,
' daher wird hier nur noch der jeweils größte Wert
' in der Liste, durch den gezogenen kleineren Wert ersetzt
if aktGWert > z then
StackX(ipos)=z
aktGWert=z
for n=1 to maxN
'suche nach Position des nun größten Werts im Stack
if StackX(n) > aktGWert then
ipos=n
aktGWert = Stack(ipos)
end if
next n
end if
end if
Zudem ist zu überlegen, ob das StackX-Feld nicht doch in eine Tabellenspalte temporär geschrieben werden sollte, denn dann kann die MAX-Funktion auf die Range angesetzt werden um den jeweiligen Größtwert zu erhalten, was zur Beschleunigung beiträgt.
Gruß,
Uwe
Anzeige
AW: Nachsatz
01.02.2007 12:24:36
Jens
Vielen Dank für Deine Mühe, Uwe!
AW: VBA: der zehnt schlechteste Wert
01.02.2007 12:33:32
Heiko
Hallo Jens,
hier mal mein Beispiel, das die von IngUR in Spiel gebrachte Funktion Small nutzt.
Wenn du damit Leben kannst das es nicht genau 4 Mio Durchläufe sind sondern immer nur ein vielfaches von 65536 ( also z.B. 3997696) dann solltest du dir das mal anschauen.

Sub TestT()
Dim arrdblDaten() As Double
Dim lngI As Long, lngMax As Long
Dim bytSpalten As Byte
' Die * 10 gibt an das 65356 * 10 Zufallzahlen erzeugt werden.
' WICHTIG immer nur den Wert 10 verändern (zwischen 1 und 255) sonst
' kann die Funktion Small nicht richtig arbeiten, da dann das Array zuviele
' Nullen enthält !!!
lngMax = 65536 * 10
bytSpalten = lngMax \ 65535
ReDim arrdblDaten(65535, bytSpalten - 1)
bytSpalten = 0
For lngI = 0 To lngMax - 2
Randomize
If (lngI + 1) Mod 65536 = 0 Then
bytSpalten = bytSpalten + 1
End If
arrdblDaten(lngI - (bytSpalten * 65536) + 1, bytSpalten) = 1000000 * Rnd
Next lngI
' Da die erste Zelle im Array mit 0 gefüllt ist suche ich nach der 11 kleinsten Zahl,
' was dann die 10. kleinste ist.
MsgBox WorksheetFunction.Small(arrdblDaten, 11)
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige