Microsoft Excel

Herbers Excel/VBA-Archiv

Array Kalkulation ohne Worksheet

Betrifft: Array Kalkulation ohne Worksheet von: Karl Toffelpuffer
Geschrieben am: 17.07.2020 15:22:47

Hallo zusammen,


ich arbeite gerade an einer Preissimulation für Aktien. Dafür muss ich aus meinen Rohdaten für 100 Tage einen zufälligen Wert in eine Tabelle einfügen. In rawData sind meine Rohdaten hinterlegt. Da ich die Simulation 10.000 mal durchführen muss kann ich die erstellte Array nicht in mein Arbeitsblatt einfügen. Das dauert einfach viel zu lange.


Meine Idee war, die Rohdaten als Array zu definieren, danach eine zweite Array zu definieren in die zufällig einer der Werte für jeden Tag eingefügt wird. Der Großteil hat auch schon funktioniert aber bei:


rand_return = rawData(rand_numb_sim)

OutpArray(m) = rand_return


funktioniert mein Code leider noch nicht. Hat jemand vielleicht eine Lösung? oder einen besseren Vorschlag? Es handelt sich beim hier angezeigten Code nicht um mein komplettes Makro. Hier geht es nur um die Erstellung dieser Array. Sollte der Code funktionieren wird das Ergebnis nicht mehr in das Arbeitsblatt kopiert sondern nur "VBA Intern" zu Berechnungszwecken verwendet.


Code:


Public Sub CreateArray()

Dim Calculation As Worksheet
Dim rawData(0 To 100) As Single
Dim OutpArray(0 To 100) As Long
Set Calculation = Worksheets("Calculation")
Dim m As Long
Dim rand_numb_sim As Long
Dim rand_return As Long
rawData = Calculation.Range("F23:AJ23").Value


    For m = 0 To 100
        rand_numb_sim = Int(((100 - 1 + 1) * Rnd) + 1)
        rand_return = rawData(rand_numb_sim)
        OutpArray(m) = rand_return
    Next m

    Calculation.Range("C3:CX3").Value = OutpArray
    
End Sub


Schöne Grüße,


Karl Toffelpuffer

Betrifft: AW: Array Kalkulation ohne Worksheet
von: onur
Geschrieben am: 17.07.2020 15:43:17

"funktioniert mein Code leider noch nicht" ??? Was genau passiert denn?

Warum eigentlich
Int(((100 - 1 + 1) * Rnd) + 1)

und nicht
Int(100 * Rnd + 1)

??
Abgesehen davon - wenn du nicht Randomize(Timer) benutzt, kommen immer die gleiche "Zufallszahlen" in Folge.

Betrifft: AW: Array Kalkulation ohne Worksheet
von: Karl Toffelpuffer
Geschrieben am: 17.07.2020 16:22:52

Hallo onur,

die Erstellung der Zufallszahl hab ich vor Ewigkeiten irgendwo verwendet. Das ist auch nicht relevant. Mir wäre nur wichtig zu wissen, ob ich mit vba überhaupt einzelne Werte einer erstellten Array verändern kann. Also der Teil
 For m = 0 To 100
         rand_numb_sim = Int(((100 - 1 + 1) * Rnd) + 1) 'erstellt "Zufallszahl"
         rand_return = rawData(rand_numb_sim) 'soll Wert an Stelle der Zufallszahl raussuchen
         OutpArray(m) = rand_return 'soll rausgesuchten Wert in Output Array einfügen
     Next m
Jemand eine Idee?

Betrifft: AW: Array Kalkulation ohne Worksheet
von: onur
Geschrieben am: 17.07.2020 16:27:05

Du verrätst immer noch nicht, WAS an deinem Makro falsch läuft.
Ich werde ihn bestimmt nicht testen, indem ich deine Datei nachbaue - denn du hast ja keine (Beispiels-) Datei gepostet.

Betrifft: AW: Array Kalkulation ohne Worksheet
von: EtoPHG
Geschrieben am: 17.07.2020 16:43:51

Hallo,

Calculation ist ein Keyword in VBA und darf/soll nicht als Variable missbraucht werden, das führt zu unerwünschten Nebeneffekten.

Der Befehl rand_return = rawData(rand_numb_sim) wird einen Fehler generieren, wenn die errechnete Zufallszahl >30 ist, weil F23:AJ23 nur 30 Werte sind, du aber eine Zufallszahl bis 100 generierst. Folglich bricht das Makro vor dem nächsten Befehl ab.

Gruess Hansueli

Betrifft: AW: Array Kalkulation ohne Worksheet
von: Karl Toffelpuffer
Geschrieben am: 17.07.2020 16:49:20

Hallo Hansueli,

den Fehler habe ich auch gerade bemerkt. Ist in der Hochgeladenen Datei korrigiert.

Gruß,

Karl

Betrifft: AW: Array Kalkulation ohne Worksheet
von: volti
Geschrieben am: 17.07.2020 16:46:45

Hallo Karl,

versuch es mal so:

Und das mit dem Namen Calculation für ein Sheet solltest Du ändern...

Code in die Zwischenablage
Public Sub CreateArray1() Dim Calculation As Worksheet Dim rawData As Variant Dim OutpArray(0 To 100) As Long Set Calculation = Worksheets("Calculation") Dim m As Long Dim rand_numb_sim As Long Dim rand_return As Long rawData = Calculation.Range("F23:AJ23").value Randomize Timer For m = 0 To 100 rand_numb_sim = Int((31 * Rnd) + 1) OutpArray(m) = rawData(1, rand_numb_sim) Next m Calculation.Range("C3:CX3").value = OutpArray End Sub
viele Grüße aus Freigericht
Karl-Heinz


Betrifft: AW: Array Kalkulation ohne Worksheet
von: Karl Toffelpuffer
Geschrieben am: 17.07.2020 16:53:18

Hallo Karl-Heinz,

das mit dem Name habe ich noch geändert. Leider bekomme ich dabei nur eine Reihe mit Nullen als Ergebnis.

Gruß,

Karl

Betrifft: AW: Array Kalkulation ohne Worksheet
von: volti
Geschrieben am: 17.07.2020 17:01:50

Da hast ja auch das OutpArray und die Variable rand_return als LONG deklariert (Ganzzahl) und willst nun winzige Kommazahlen da reinbringen.
Das geht so nicht.

VG KH

Betrifft: AW: Array Kalkulation ohne Worksheet
von: Karl Toffelpuffer
Geschrieben am: 17.07.2020 16:48:16

Entschuldigung, das habe ich glatt vergessen. Hier die Datei:

https://www.herber.de/bbs/user/139134.xlsm

Betrifft: AW: Array Kalkulation ohne Worksheet
von: volti
Geschrieben am: 17.07.2020 16:52:14

Hi Karl,

In Deiner Datei ist aber jetzt nicht das gleiche, wie hier in Deinem Beitrag.

Stichwort SIngle <=> Variant und Range

VG KH

Betrifft: AW: Array Kalkulation ohne Worksheet
von: Karl Toffelpuffer
Geschrieben am: 17.07.2020 16:56:50

Hallo,

ich habe wieder zu variant gewechselt weil ich dachte, dass das richtiger wäre. Die Range habe ich verändert um eine übersichtlichere Datei hochzuladen. Ich habe das makro und die Daten in einem sehr umfangreichen Excel Blatt und wollte nur einen Teil rauskopieren der exakt das Problem betrifft.

Gruß,

Karl

Betrifft: AW: Array Kalkulation ohne Worksheet
von: onur
Geschrieben am: 17.07.2020 16:57:46

SO geht es:
Dim Calculation As Worksheet
Dim rawData As Variant
Dim OutpArray(0 To 100)'NICHT LONG !!!
Set Calculation = Worksheets("Calculation")
Dim m As Long
Dim rand_numb_sim As Long
Dim rand_return'NICHT LONG !!!
rawData = Calculation.Range("F2:DA2").Value
For m = 0 To 100
rand_numb_sim = Int(100 * Rnd) + 1
rand_return = rawData(1, rand_numb_sim)
OutpArray(m) = rand_return
Next m
Calculation.Range("F3:DA3").Value = OutpArray
End Sub

Betrifft: AW: Array Kalkulation ohne Worksheet
von: onur
Geschrieben am: 17.07.2020 17:00:47

Habe Randomize Timer vergessen.
Public Sub CreateArray()
    Dim Calculation As Worksheet
    Dim rawData As Variant
    Dim OutpArray(0 To 100)
    Set Calculation = Worksheets("Calculation")
    Dim m As Long
    Dim rand_numb_sim As Long
    Dim rand_return
    Randomize Timer
    rawData = Calculation.Range("F2:DA2").Value
        For m = 0 To 100
            rand_numb_sim = Int(100 * Rnd) + 1
            rand_return = rawData(1, rand_numb_sim)
            OutpArray(m) = rand_return
        Next m
        Calculation.Range("F3:DA3").Value = OutpArray
End Sub


Betrifft: AW: Array Kalkulation ohne Worksheet
von: Karl Toffelpuffer
Geschrieben am: 17.07.2020 17:08:08

Hey Onur,

perfekt. Vielen dank dafür!!!

Schöne Grüße,

Karl

Betrifft: Gerne !
von: onur
Geschrieben am: 17.07.2020 17:08:45



Betrifft: Besser für ganze Zufallszahlen
von: Daniel
Geschrieben am: 17.07.2020 17:16:32

rand_numb_sim = Worksheetfunction.RandBetween(1, 100)
Ist Übersichtlicher und braucht kein Randomize.

Gruß Daniel

Betrifft: AW: Besser für ganze Zufallszahlen
von: Karl Toffelpuffer
Geschrieben am: 17.07.2020 17:43:31

Hey Daniel,

super Tipp! danke dafür.

Gruß,

Karl

Betrifft: AW: Array Kalkulation ohne Worksheet
von: EtoPHG
Geschrieben am: 17.07.2020 17:00:22

Hallo,

Vielleicht solltest Du Dich mal zuerst mit den grundlegenden Datentypen vertraut machen und mit den Überwachungsfunktionen des VBE und dem Debugger:
Public Sub CreateArray()

Dim wsQ As Worksheet
Dim rawData As Variant
Dim OutpArray(0 To 100) As Double
Set wsQ = Worksheets("Calculation")
Dim m As Long
Dim rand_numb_sim As Double
Dim rand_return As Double
rawData = wsQ.Range("F2:DA2").Value


    For m = 0 To 100
        rand_numb_sim = Int(((100 - 1 + 1) * Rnd) + 1)
        rand_return = rawData(1, rand_numb_sim)
        OutpArray(m) = rand_return
    Next m

    wsQ.Range("F3:DA3").Value = OutpArray
    
End Sub
Gruess Hansueli

Beiträge aus dem Excel-Forum zum Thema "Array Kalkulation ohne Worksheet"