Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
904to908
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
904to908
904to908
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Kompl. Formel STABW(N) in VBA-Code packen ....

Kompl. Formel STABW(N) in VBA-Code packen ....
11.09.2007 16:40:01
proxima05
Hallo,
ich habe eine Tabelle, in der jeden Wochentag eine Datenzeile hinzukommt. Über diesen wachsenden Bereich berechne ich die Standardabweichung, mittels einer etwas komplizierteren Formel. Da auch noch ein Mittelwert berechnet wird, dauert das Ganze doch recht lange, wenn die betreffende Formel bereits in der Zelle eingetragen ist. ich würde diese Berechnung jetzt gerne über einen VBA-Code anstossen, der nur noch die entsprechenden Ergebnisse in die relevanten Zellen schreibt. Kann mir dabei jemand helfen?
Ich habe mal die Beispieltabelle hochgeladen, um das Ganze etwas zu verdeutlichen.
https://www.herber.de/bbs/user/45905.xls
Wäre nett, wenn da jemand helfen könnte.
Allerbesten Dank und Gruß
Ralph

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kompl. Formel STABW(N) in VBA-Code packen ....
11.09.2007 18:05:00
ingUR
Hallo, Ralph,
ohne jetzt besonders nachzufragen, hier eine Prozedur, die Dir für die letzte Eingabezile des aktuellen Blattes die Berechnungen für die Spalten L bis O durchführt:

Sub CalcLMNO()
Dim LastR As Long, rngData As Range, StarRow As Long
LastR = Cells(Rows.Count, "K").End(xlUp).Row
If Cells(LastR, "H") > 0 Then
StartRow = LastR - Application.Min(CInt(Mid(ActiveWorkbook.Names("VolaPeriod"), 2)),  _
LastR - 3)
Set rngData = Range(Cells(StartRow, "K"), Cells(LastR, "K"))
Cells(LastR, "L") = Application.WorksheetFunction.StDevP(rngData)
Cells(LastR, "M") = Application.WorksheetFunction.StDev(rngData)
Cells(LastR, "N") = Cells(LastR, "M") * Sqr(252)
Set rngData = Range(Cells(StartRow + 1, "M"), Cells(LastR, "M"))
Cells(LastR, "O") = Application.WorksheetFunction.Average(rngData)
End If
Set rngData = Nothing
End Sub

Diese Prozedur kannst Du nun über eine Schaltfläche Starten oder aber auch über Ein Change-Ereignis der Tabelle. Wichtig ist hier, das nur die letzten Werte neu berehnet werden. Für die Zeilen davor wären bei einer gesamtneuberechnung der Tabelle die Prozedur in eine Schleife zu legen, wobei LastR jedoch als Zeilenzähler hochzuzählen wäre.
Ob die Verwendung eines Workbooks.Namens für VlaPeriod die beste lösoung ist, wird Du entscheiden.
Gruß,
Uwe

Anzeige
AW: Kompl. Formel STABW(N) in VBA-Code packen ....
12.09.2007 20:03:05
proxima05
Hallo Uwe,
danke für Deinen Code ... ich habe den mal ausprobiert. Da ich ihn noch nicht ganz durchdrungen und verstanden habe, an dich die Frage, ob er auch wirklich die Formeln derart berücksichtigt, wie sie in der Spalte L, M und O meiner Tabelle als Funktion eingetragen sind ......
"Ob die Verwendung eines Workbooks.Namens für VolaPeriod die beste lösoung ist, wird Du entscheiden." ... was meinst Du damit genau? ... VolaPeriod ist ein definierter Name, der auch in der Funktion vorher so drinstand.
Danke & Gruß
Ralph

AW: Kompl. Formel STABW(N) in VBA-Code packen ....
13.09.2007 11:36:00
ingUR
Hallo, @proxima05,
Du schreibst: «... ich habe den mal ausprobiert» und anschließend stellst Du die Zusatzfrage: «ob er[der Code] auch wirklich die Formeln derart berücksichtigt, wie sie in der Spalte L, M und O meiner Tabelle als Funktion eingetragen sind ...».
Warum hast Du Bedenken, dass dem nicht so sein sollte? Gibt es unterschidliche Ergebnisse? Ich selber habe die Prüfung nur für die letzte Zeile Deiner Beispieldatei durchgeführt. Du könntest die Prüfung dadurch vornehemn, dass Du die Zielzellenummer einfach mit einem Zeilen-Offset versiehst (z.B. Cells(LastR+5, "L"), ...) und so die Möglichkeit hast, die Zellenformelergebnisse mit den der Code-Formeln zu vergleichen.
Die VBA-Funktion Application.WorksheetFunction ermöglicht es, auf als Eigenschaften dieses Applicationsobjektes definierte Aufrufe, bestimmte Zellenfunktionen mit den gleichen Parametern wie in der EXCEL-Tabellenfunktion ausführen zu lassen (siehe VBA-Objektkatalog, Stichwort: Worksheetfunction, das Dir alle Elemente der Klasse "WorksheetFunction" anzeigt; VBA-Hilfe: Stichwort: Liste der in Visual Basic verfügbaren Tabellenfunktionen).
Wenn es da Unstimmigkeiten geben sollte, dann melde Dich bitte dazu noch einmal.
Meine Anmekung bezüglich des Weges, bei einem VBA-Programm den Parameter der Periodenlänge über einen Namen einzugeben, hatte auschließlich den Grund, dass es umständlicher ist, den Wert aus einem Namen zu ermitteln, als einen Zelleninhalt, der diesen Wert hat, durch Bezug zu übernehmen.
Als konstanten Wert könnte man ihn in einer Prozedur als const _VOLAPERIOD_ = 90 genauso gut definieren. Wenn jedoch an anderen Stellen der Arbeitsmappe dieser Wert ebenso gebraucht wird und flexibel gehalten werden soll, dann wird diese Art der Definition swchon zweckmäßg sein.
Gruß,
Uwe

Anzeige
AW: Kompl. Formel STABW(N) in VBA-Code packen ....
13.09.2007 19:57:00
proxima05
Hallo Uwe,
ich habe einen umfangreichen Test mit meinem Datenbestand durchlaufen .... das Ergebnis ist einwandfrei; Dein Code bildet die Funktion korrekt ab. :-))
Ich habe diesen Code jetzt in ein Change-Ereignis mittels Call-Anweisung eingebunden ... klappt auch!
Aber ein Problem habe ich jetzt dennoch. Wie Du schon bemerkt hast, ist die VolaPeriod über einen Namen mit 90 definiert. Über einen separaten VBA-Code ersetze ich diese 90 durch eine Anzahl unterschiedlicher Längen (10, 20, 30, 45, 100); danach wird die Berechnung über die Formeln mit diesen Längen durchgeführt und bestimmte Werte (letzter Wert der Vorwoche bzw. Vormonat) ausgelesen und in einen separaten Bereich geschrieben ..... wenn jetzt die Formeln nicht mehr verfügbar sind bzw. über VBA abgebildet werden, habe ich natürlich mit dem anderen Code etwas Probleme.
Im Moment kann ich mir nur vorstellen, dass die 90 durch die jeweilige Länge ausgetauscht, die Berechnung durchgeführt und das jeweilige Ergebnis weggeschrieben wird ... bevor das Ganze mit einer weiteren Länge erfolgt.
Ich habe mal den genannten Code (der wie gesagt, von der Formel abhängt) in der anliegenden Datei aufgeführt.
Hast Du da evtl. eine bessere und elegantere Lösung? .... wäre klasse.
https://www.herber.de/bbs/user/46014.xls
Besten Dank für die Unterstützung.
Gruß
Ralph

Anzeige
AW: Kompl. Formel STABW(N) in VBA-Code packen ....
14.09.2007 09:53:05
ingUR
Auf ein Nächstes, @proxima05 (Ralph)!
Du solltest Obacht geben, dass Du eine übersichtliche Struktur in Deinem VBA-Projekt, verbunden mit den Zellenformeln, herstellen und auch bei Erweiterungen beibehalten kannst, denn soweit ich es aus den Abschnitten, die Du in dieser Beitragskette bisher veröffentlicht hast, kann ich nur Hinweise geben, wie man zwar das gewünschtes Ergebnis erzielt, jedoch dabei eine "Flickschusterei" verursacht.
Wenn ich Dich also richtig verstanden habe, sind an jedem Wochende und an jedem Monatsende nicht nur die Daten für VolaPeriode=90 zu ermitteln und wegzuschreiben, sondern für weitere fünf Periodenlängen.
Die Funktionsberrechnung der Prozedur CalcLCDX(), die die Funktionswerte für die Peridenlänge, die in VolaPeriode berechnet, wird, da Du sie mit einem Change-Ereignis, welches einer Zelle in der Spalte K betrift, verbunden hast, nur einmal ausgeführt, nämlich dann, wenn Du in eine Zelle K eine Wert einträgst.
Bei der Ausführung der Prozedur CalcLCDX() wird aber bei der Funktionsberechnung immer die größte Zeilennummer, die in Spalte K mit einer Zahl belegt ist, als letzte Zahl angenommen.
Damit kann mit dieser Prozedur so kein Wert auf der Basis eines Zeilenwertes für eine Zeile, die vor der letzten Zeile sich befindet ermittel werden.
Du müßtes also der Prozedur "vorgauckeln", dass die Zeile mit dem letzten Tag in der Woche bzw. im Monat (r mit dem Wert von dblMax), LastR der Prozedur CalcLCDX() ist.
Dazu sind eben einige Änderungen zu "basteln", die ich nicht für einen besonders guten Stil der Strukturierung des Ablaufcodes halte.
1.Schritt:
Die Prozedur CalcLCDXwird mit einem optionalen Übergabeparameter LastR versehen, der wie folgt eingestzt wird:

Sub CalcLCDX(Optional LastR As Long = 0)
Dim rngData As Range, StartRow As Long
If LastR 

2.Schritt
Der Calculate-Befehl in der Prozedur LCDXVola_Click wird durch den Aufruf der Prozedur CalcLCDX ersetzt, dem als Parameter die Zeilennummer (r.Row) zugeordnet wird:


For intc = 0 To 5
ThisWorkbook.Names("VolaPeriod").Value = varVola(intc)
'.Calculate
CalcLCDX r.Row
.Cells(80 + intc, 19) = varVola(intc)

Da hier die Zellen L bis O der Spalte r.Row mit den Werten der Ergebnisse für die verschiedenen Werte von VolaPeriode in der FOR-Schleife überschrieben werden, sind nach Abschluß dieser Schleife, die Werte für den "Darstellungswert" der VolaPeriod in der Tabelle noch einmal zu berechnen:
3. Schritt:


End With
ThisWorkbook.Names("VolaPeriod").Value = 90
CalcLCDX r.Row

Natürlich wirst Du die unterschiedlichen Werte erste sehen, wenn die Anzahl der benutzten Daten auch größer als Dein VolaPeriod-Wert ist. Du müßtes also Deine Einträge in der ersten Spalte 1 ensprechnd ergänzen.
Jedoch diese Änderung wirkt nicht auf die historischen Werte bei einer Tabellenfortschreibung, bei der die vorherigen Datensätze nicht für dei Wochen-/Monatswerte ausgewertet wurden. Dazu wäre eine eigen ständige Prozedur erforderlich, die zeilenweise von zeile=2 bis maxRow das Ereignis Change für die Zelle Cells(zeile, "K") auslöst, so dass die Daten unter Berücksichtigung der Routine für die Wochen-/Monatsabschnittsgrenzenbeobachtung neu geschrieben werden.
Doch ich hoffe, dass Du das hinbekommst, denn Du siehst, dass die Struktur immer mehr leiden würde, wenn ich ohne Gesamtübersicht und -konzept hier und da "Notlösungen" in Deinen Programmablauf hineinpflanzen.
Gruß,
Uwe

Anzeige
AW: Kompl. Formel STABW(N) in VBA-Code packen ....
14.09.2007 11:07:00
ingUR
Hallo, Ralph,
da besteht auch noch ide etwas elegantere Möglichkeit, der Prozedur als ersten Parameter eine Feld für die vier Ergebniswerte zu übergeben, in dass die Funktionsresultate hineingeschrieben werden und die dann in den aufrufenden Prozeduren in die entsprechenden Zellen geschrieben werden. Dadurch entfällt die wiederholte Berechnung der Tabellenwerte für den "Standard"-VolaPeriodenwert am Ende einer Schleife über verschiedene VolaPeriodwerte.
Hier der gesamte veränderte Programmcode aus Deiner Beispielmappe:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range, dblResult(4) As Double, i As Integer
Set Bereich = ActiveWorkbook.Worksheets("LCDXInput").Range("K:K")
If Not Intersect(Target, Bereich) Is Nothing Then
CalcLCDX dblResult
For i = 0 To 3
Cells(Target.Row, "L").Offset(0, i) = dblResult(i)
Next i
End If
End Sub
Sub CalcLCDX(dblResult() As Double, Optional LastR As Long = -1)
Dim rngData As Range, StartRow As Long
If LastR  0 Then
StartRow = LastR - Application.Min(CInt(Mid(ActiveWorkbook.Names("VolaPeriod"), 2)), _
LastR - 3)
Set rngData = Range(Cells(StartRow, "K"), Cells(LastR, "K"))
dblResult(0) = Application.WorksheetFunction.StDevP(rngData)
dblResult(1) = Application.WorksheetFunction.StDev(rngData)
dblResult(2) = Cells(LastR, "M") * Sqr(252)
Set rngData = Range(Cells(StartRow + 1, "M"), Cells(LastR, "M"))
dblResult(3) = Application.WorksheetFunction.Average(rngData)
End If
Set rngData = Nothing
End Sub
Private Sub LCDXVola_Click()
Dim objSh As Worksheet
Dim rng As Range, r As Range
Dim dblMax As Double, dblMin As Double
Dim varVola() As Variant
Dim intc As Integer
Dim dblResult(4) As Double, i As Integer
varVola = Array(10, 20, 30, 45, 90, 100)
Set objSh = Sheets("LCDXInput")
With objSh
Set rng = .Range("H2:H" & Application.Max(.Cells(Rows.Count, 1).End(xlUp).Row, 2))
rng.Select
dblMax = Application.Max(rng)
dblMax = dblMax - Weekday(dblMax, vbSunday)
dblMin = Application.Min(rng)
Do While dblMax > dblMin
Set r = rng.Find(what:=CDate(dblMax), LookIn:=xlFormulas, lookat:=xlWhole)
If Not r Is Nothing Then
For intc = 0 To 5
ThisWorkbook.Names("VolaPeriod").Value = varVola(intc)
'.Calculate
CalcLCDX dblResult, r.Row
.Cells(80 + intc, 19) = varVola(intc)
.Cells(80 + intc, 20) = r
For i = 0 To 3
.Cells(80, 21).Offset(intc, i) = dblResult(i)
Next i
Next
Exit Do
End If
dblMax = dblMax - 1
Loop
End With
ThisWorkbook.Names("VolaPeriod").Value = 90
Set r = Nothing
Set rng = Nothing
Set objSh = Nothing
End Sub
Sub GMS(Optional ByVal Modus As Boolean = False)
Static lngCalc As Long
With Application
.ScreenUpdating = Modus
.EnableEvents = Modus
.DisplayAlerts = Modus
.EnableCancelKey = IIf(Modus, 1, 0)
If Modus Then
.Calculation = lngCalc
Else
lngCalc = .Calculation
End If
.Cursor = IIf(Modus, -4143, 2)
.CutCopyMode = False
End With
End Sub


Gruß,
Uwe

Anzeige
AW: Kompl. Formel STABW(N) in VBA-Code packen ....
14.09.2007 16:12:00
proxima05
Hallo Uwe,
Riesenarbeit, die Du da ablieferst .... ich muss die erst durcharbeiten, um zu sehen, ob es so passt. Du hast völlig Recht, dass evtl. die Übersicht leiden kann; leider hat sich das erst als Problem herausgestellt, als sich die Rechenzeit der Tabelle doch merklich verlängert hat und die Idee mit der VBA-Lösung aufkam).
Ich werde das Wochenende brauchen, das zu testen .... ich melde mich wieder.
Besten Dank erstmal
Gruß
Ralph

AW: Kompl. Formel STABW(N) in VBA-Code packen ....
14.09.2007 17:24:00
ingUR
Hallo, Ralph,
nun hoffe ich, dass Du keine Probleme beim Umsetzen und Anpassen hast, so das ich Deinen Dank recht verdient habe.
Jedoch bedenke: Wenn innerhalb einer bestehenden Zeitreihe Du in der Spalte K eine Wertänderung vornimmst, dann werden zwar die Werte der Zeile für die Spalten L bis O neu berechnet und angeschrieben (ggf. auch die Wochen-/Monatsendwerte), jedoch werden keine weiteren Aktuallisierungen für Werte der Spalten L und O vorgenommen, die diese Wertänderung in der Zelle der Spalte K ebenso bei der Rechnung einbeziehen!
Wenn Du also Wertebereinigungen in der Spalte K berücksichtigen mußt, dann gilt es, eine Routine zu schreiben, die auch die folgenden Zeilen neu berechnet, was allerdings durch den veränderten Aufruf ohne besondere Änderung der Prozedur mögliche sein sollte.
Selbst werde ich nicht mehr dazu kommen, diesen Stand weiter zu betreuen.
Viel Erfolg,
Uwe

Anzeige
Code funktioniert, bis auf eine Kleinigkeit
14.09.2007 21:42:00
proxima05
Hallo Uwe,
ich habe jetzt mal einen Check gemacht, um zu sehen, inwieweit der Code den richtigen Vorwochenwert zieht. Die Länge der Periode, das letzte Datum der Vorwoche zieht er korrekt, allerdings nicht den dazugehörigen Wert .... dieser ist nämlich der letzte der in der Tabelle verfügbar ist. Ich habe das nochmal in der anliegenden Tabelle skizziert ......
https://www.herber.de/bbs/user/46049.xls
Wäre toll, wenn Du da nochmal draufschauen könntest.
Allerbesten Dank für die tolle Unterstützung.
Gruß
Ralph

Anzeige
AW: Code funktioniert, bis auf eine Kleinigkeit
14.09.2007 22:12:00
ingUR
Hallo, Ralph,
da hat sich ein Fehler "einschlichen".
Ersetze bitte in der Prozedur CalcLCDX(..) das Relationszeichen in der Abfrage:

Sub CalcLCDX(dblResult() As Double, Optional LastR As Long = -1)
Dim rngData As Range, StartRow As Long
If LastR 

Darüber hinaus kannst Du Du in der Prozedur LCDXVola_Click() natürlich die Selectzeile r.Select entfernen, die ich nur für Testzwecke vorgesehen hatte, wie natürlich auch mit einleitenden Kommentarzeichen versehene Zeilen gelöscht werden können.
Bitter beachte meine Schlußhinweis in meiner vorherigen Antwort, hoffe also, dass nun die gesuchten Werte ermittelt werden;werde allerdings heute nochmal schauen.
Gutes Gelingen!
Uwe

Anzeige
AW: Nachsatz:
14.09.2007 22:16:10
ingUR
Natürlich können für VolaPeriod=90 und VolaPeriod=100 bei 77-4=37 Datenwerten nur die gleichen Werte als Resultat geliefert werden.
Gruß!

Uwe: hab' allerbesten Dank, jetzt läuft es! (owT)
15.09.2007 20:01:10
proxima05
.

309 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige