Clever-Excel-Forum

Normale Version: Resampling und VBA
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich soll für die Berechnung eines Konfidenzintervalls ein Resampling (n=1000) einer bestehenden prozentualen Verteilung von 19 Stichproben durchführen. Wie das Resampling funktioniert kann ich mir gerade noch so herleiten. Nun soll ich aber sowohl das ganze Resampling per VBA-Makro durchführen lassen, als auch das Ergebnis des jeweiligen Resamplings, d. h. die Summe der jeweiligen Prozentsätze, per VBA-Makro in eine Liste in ein neues Tabellenblatt mit fortlaufender Zeilennummer (von 1 bis 1000) übertragen. Ich habe schon ein wenig hin und her probiert, aber es ist nichts (sinnvolles) dabei herausgekommen.

Daher meine Frage: Wie könnte bzw. sollte ein entsprechendes Makro aussehen?

Für Vorschläge bin ich sehr dankbar. Zur besseren Übersicht habe ich ein Beispieldatei angehängt.
Hallo L...,

ich habs so verstanden:

Code:
Private Sub cbTuwat_Click()
Dim Z As Long
Dim S As Long
Dim AnzZ As Long
Dim Anzahl As Long
Dim Summe As Double
Dim Liste As Variant
Dim Ausgabe() As Variant

Anzahl = Range("Anzahl")
Liste = Range("Liste")
AnzZ = UBound(Liste, 1)
ReDim Ausgabe(1 To AnzZ + 2, 1 To Anzahl)
Range("Ausgabe").CurrentRegion.ClearContents

For S = 1 To Anzahl
    Ausgabe(1, S) = "No " & Format(S, "#,##0")
    Summe = 0
    For Z = 1 To AnzZ
        Ausgabe(Z + 1, S) = Liste(WorksheetFunction.RandBetween(1, AnzZ), 1)
        If IsNumeric(Ausgabe(Z + 1, S)) Then
            Summe = Summe + Ausgabe(Z + 1, S)
        End If
    Next Z
    Ausgabe(AnzZ + 2, S) = Summe
Next S
Range("Ausgabe").Resize(AnzZ + 2, Anzahl).Value = Ausgabe
End Sub


Da ich in Makros ungern mit festen Adressen arbeite, benötigt das Makro im Arbeitsblatt drei Namen:

1. Einen benannten Bereich "Liste" in der die zu nutzenden Wahrscheinlichkeiten stehen.
2. Eine benannte Zelle "Anzahl" mit der Anzahl der Test.
3. Eine benannte Zelle "Ausgabe". Ab hier wird die Ausgabe eingetragen. Vohandene Werte werden gnadenlos überschrieben.
Da ich zu Beginn des Makro alte Daten über CurrentRegion lösche, sollte direkt über, unter oder neben dem Bereich keine Einträge erfolgen.
PHP-Code:
Sub M_snb()
  
Randomize
  ReDim sp
(9990)
  sn Tabelle2.Range("B3:B21")
  sn(101) = 0
  
  
For 0 To UBound(sp)
    sp(j0) = sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11) + sn(Int(18 Rnd()) + 11)
  Next
  
  Tabelle3
.Cells(12).Resize(UBound(sp) + 1) = sp
End Sub 
Vielen Dank @Ego! Das sieht super aus und funktioniert wie gedacht. Ich als Laie habe aber noch ein paar Fragen:

1. Ist es möglich die Summe der Prozentsätze eine Zeile nach unten (Zeile 22) zu verschieben?
2. Kann man außerdem noch (in einer weiteren Zeile darunter, d. h. Zeile 23) den gewichteten Mittelwert der jeweiligen Prozentsätze berechnen?
3. Kann man die Ausgabe der "Resamples" auch auf ein anderes Tabellenblatt verschieben?
4. Wie ist es, wenn man mehr als einen Datensatz mit 19 Prozentsätzen hat. Kann man auch mehrere Listen als Quelle auswählen und sich daraus die entsprechenden Parameter berechnen lassen?

Vielen Dank und viele Grüße!
Hallo L...,


zu 1. und 2.

das Forum sollte Hilfe zur Selbsthilfe und keine ausgefeilte Lösungen geben. Du hast geschrieben :
Zitat:Nun soll ich aber ... per VBA-Makro durchführen lassen, ...  Ich habe schon ein wenig hin und her probiert...
Für mich heißt es, dass du schon Erfahrung in Programmierung hast oder haben solltest. Dann melde dich wenn du an einer Stelle Probleme beim anpassen hast und beschreibe auch deine Versuche.


zu 3.

Wenn du die benannte Zelle Ausgabe in ein anderes Blatt verschiebst, solltest du im Makro die beiden "Range("Ausgabe")" durch "ThisWorkbook.Names("Ausgabe").RefersToRange" ersetzen.

zu 4.

Bei mehr Prozentsätzen kannst den benannten Bereich "Liste" einfach verlängern