Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1332to1336
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
Inhaltsverzeichnis

Frage an Erich G.

Frage an Erich G.
15.10.2013 12:02:05
Andre
Hallo,
da Erich vor einigen Wochen mir schon so gut helfen konnte und bereits im Thema drinsteckt, richte ich meine Frage mal an ihn. Ich habe meine Datenbank mit Fußballspielen nun fertig. Es sind insgesamt ca. 800.000 Zeilen...
Anbei ein Auszug:
https://www.herber.de/bbs/user/87656.xlsx
Ich habe eine Frage zu den Spalten P und Q.
Hier wird nach dem aktuellen Rating der jeweiligen Mannschaft gesucht. Und zwar in Spalte W oder X, je nach dem ob die betroffene Mannschaft zuletzt ein Heim- oder Auswärtsspiel hatte. Das gesuchte Rating befindet sich in der Zeile, in der die Team-ID (Spalte K oder L) zuletzt auftauchte.
Nun ist die Frage, wie der VBA-Code wohl aussehen müsste und ob die Berechnung überhaupt von Excel durchgeführt werden kann, da die Spalten R-X ja bei jeder Veränderung von Spalte P und Q neu berechnet werden...
Ich würde mich sehr freuen, Erich, wenn du mir mit diesem Problem weiterhelfen könntest. Die Codes, die du mir früher geschickt hast, habe ich noch nicht in die Tabelle eingebaut. Dies geschieht später.
Sollte sich jmd anderes der Sache annehmen wollen, wäre ich natürlich auch sehr dankbar und bin gerne bereit, die Problematik detaillierter zu beschreiben, falls nicht ganz klar wurde, was gemeint ist.
Viele Grüße und vielen Dank im Vorraus,
Andre

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Rückfragen
15.10.2013 18:28:20
Erich
Hi Andre,
hast du es dir jetzt nicht etwas zu einfach gemacht? Bisher kam keine Antwort...
Zunächst mal ein Link auf die Vorgeschichte, die du angesprochen hast:
https://www.herber.de/forum/archiv/1328to1332/t1331959.htm
Wer das nachlesen möchte, muss nun nicht erst wie ich im Archiv rumsuchen.
Ich habe das getan, weil ich eigentlich überhaupt nicht im Thema stecke.
Suchst du nun nach einer Formel- oder einer VBA-Lösung? Was vernünftiger wäre, lässt sich ohne Kenntnis
der Zusammenhänge kaum sagen. Oft ist eine Mischung aus Formeln und VBA eher nachteilig.
800.000 Formeln würde ich kaum in eine Tabelle schreiben.
Bei einer VBA-Lösung wäre es vorteilhaft, die Quelldaten einmal zu lesen, die benötigten Ergebnisse zu berechnen
und dann alle Ergebnisse in einem Rutsch in die Tabelle zu schreiben.
Die Werte für P und Q sind da nur ein Detail, fallen nebenbei an.
Es könnte durchaus nachteilig sein, dass du meinen Code noch nicht eingebaut hast. :-(
Vielleicht ließe sich die Berechnung von P und Q leicht integrieren.
Noch ein paar Detailfragen und Anmerkungen:
In der Beispieltabelle kommt keine Mannschaft mehr als einmal vor. Wie sehen da die Ergebnisse aus?
Ich könnte mir eine sinnvollere Tabelle vorstellen, auch zum Testen...
Was soll rauskommen, wenn es für die Mannschaft noch kein Vor-Ergebnis gibt?
Wie eindeutig sind die IDs in den Spalten K:L?
Am Beispiel: Hat 'Hapoel Tel Aviv' in der Saison 2000 und der Saison 2001 dieselbe ID oder verschiedene IDs?
Das ist wichtig, da evtl. Sorge zu tragen ist, dass nicht Werte einer Saison (oder eines Landes oder einer Liga)
in eine andere übertragen werden.
Genau: Wodurch ist (möglichst kurz) bestimmt, in welchen Zeilen gesucht werden soll?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Rückfragen
15.10.2013 23:21:18
Andre
Hi Erich,
das tut mir leid, dass es so rüberkam. Ich war zunächst im Urlaub und musste anschließend eine neue Datenbank basteln, da die alte fehlerhaft war.
Anbei eine neue Tabelle mit Spielen der Bundesliga. (Teams kommen öfters vor)
Die Team-IDs sind eindeutig jeder Mannschaft zugewiesen und ändern sich nicht über die Saisons.
https://www.herber.de/bbs/user/87664.xlsx
Die Spalten A-P sind die Datenbank. Ab Spalte Q kommen die Berechnungen. Die Formeln habe ich jeweils in Zeile 2 belassen. Darunter stehen nur Werte, um die Datei klein zu halten.
Folgende Erklärungen zu den Spalten:
T-U: Aktuelles Rating des jeweiligen Teams. (Wenn ein Team noch nie vorkam, ist der Startwert 1000)
V-Z: Berechnung für die Ratinganpassungen.
AA-AB: Durch diese Anpassungen ergeben sich für das nächste Spiel diese Ratings, welche dann im nächsten Spiel wieder in Spalte T und U auftauchen.
AC-AF: Anzahl aller Spiele des Teams in der Datenbank bzw. in der aktuellen Saison.
AG-AH: Wie war das Rating vor 10 Spielen?
AK-AL: Wie war das Rating zu Saisonbeginn? (Die Liga-ID ist eindeutig einer Saison einer Liga zugewiesen. Die Folgesaison hat eine andere ID)
AO-AP: Die Anzahl der Tore in den letzten 10 Spielen des jeweiligen Teams.
Die Art der Berechnung wie sie in AO und AP erfolgt, werde ich zukünftig wohl noch für weitere Dinge benötigen (z.B. Punkte oder Gegentore oder Remis in den letzten x Spielen). Da ich jetzt noch nicht weiß, was genau ich zukünftig berechnen will, ist es für mich besonders wichtig zu verstehen, was in den einzelnen Codes geschieht, damit ich diese in Zukunft modifizieren kann.
Ich hoffe, du kannst mit der Tabelle etwas anfangen. Solltest du etwas nicht verstehen, hätte ich großes Verständnis dafür ;-) Bitte frag einfach nach, da ich nicht weiß, ob ich alles verständlich erklären konnte. So ist das halt, wenn man selbst zu tief drinsteckt, vergisst man manchmal das Wesentliche zu erklären ;-)
Ich würde mich sehr freuen, wenn du mir weiterhelfen könntest!
Viele Grüße und vielen Dank im Vorraus,
Andre

Anzeige
VBA-Lösungsversuch
16.10.2013 09:31:47
Erich
Hi Andre,
gehe ich recht in der Annahme, dass es nun darum geht, die Formeln in den Spalten T:U durch Code zu ersetzen?
Zu deiner neuen, besseren Beispieltabelle habe ich eine Frage: Die 948,73...
in AB151 (ID nP1i5US1, Dortmund, Liga 6105, Saison 2000) wird übertragen
in T155   (ID nP1i5US1, Dortmund, Liga 2558, Saison 2001).
Das bedeutet, dass Liga und Saison (und Land?) keine Rolle für den Übertragungsmechanismus spielen sollen.
Maßgeblich für die Identifizierung sind allein die Team-IDs in den Spalten O:P.
Also braucht man für diese Aufgabe nur die Spalten O:P und AA:AB für die Eingabe, T:U für die Ausgabe.
Dies vorausgesetzt, ginge das so:

Option Explicit
Sub Dict_VomVorigen()
Dim mDic As Object, mm As Long, arT, arN, arErg() As Double
Dim zz As Long, cc As Long, strH As String
Set mDic = CreateObject("Scripting.Dictionary")   ' Teams / next
mm = Cells(Rows.Count, 15).End(xlUp).Row - 1
arT = Cells(2, 15).Resize(mm, 2)          ' O:P   IDs Home+Away
arN = Cells(2, 27).Resize(mm, 2)          ' AA:AB next ges H+A
ReDim arErg(1 To mm, 1 To 2)
For zz = 1 To mm                 ' Zeilen
For cc = 1 To 2                  ' Home/Away
strH = arT(zz, cc)               ' Key = Team-ID
If mDic.Exists(strH) Then
arErg(zz, cc) = mDic(strH)
mDic(strH) = arN(zz, cc)
Else
arErg(zz, cc) = 1000
mDic.Add strH, arN(zz, cc)
End If
Next cc
Next zz
Cells(2, 20).Resize(mm, 2) = arErg      ' Spalten T:U
End Sub
Dies ist natürlich nur eine kleine "Insellösung", die in eine VBA-Gesamtlösung zu integrieren wäre.
Noch ein kleiner Vorschlag für eine Formel in Q2:
 Q
1Toto
22
32

Formeln der Tabelle
ZelleFormel
Q2=2*(H2<I2)+(H2>I2)
Q3=WENN(H3>I3;1;WENN(H3=I3;0;2))

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: VBA-Lösungsversuch
16.10.2013 11:49:43
Andre
Hallo Erich,
perfekt, vielen Dank! Ja, deine Annahme war korrekt. Land, Liga, Saison spielen in diesem Fall keine Rolle. Durch die eindeutigen Team-IDs ist dies nicht nötig. Ziel ist es, für jede Mannschaft eine Teamstärke zu ermitteln, um so ein Prognosemodell für zukünfte Spiele zu entwickeln. Hierfür ist es nötig, viele vergangene Saisons zu berücksichtigen, damit sich einigermaßen korrekte Ratings ergeben. Auch Liga übergreifend. Also durch Europapokalspiele wird mit der Zeit die Bundesliga im Mittel stärker sein als z.B. die 1. Liga Dänemarks. Und durch DFB-Pokal werden die Teams aus der ersten Liga den Zweitligisten die Punkte klauen, so dass auch hier sich die Ligastärken mit der Zeit anpassen.
Ich kann im Moment noch nicht sagen, welche Faktoren in das Modell einfließen werden, um die beste Prognose zu erhalten, daher werde ich zukünftig immer wieder neue Dinge prüfen müssen. Und daher ist es halt wichtig, die Methode der VBA-Codes zu verstehen.
Alle weiteren Spalten in der Tabelle, die in der Formel ein Zählenwenn oder Summewenn enthalten, müssten ebenfalls mit VBA-Code gelöst werden, da Excel diese Formeln bei der Anzahl der Zeilen nicht schafft. Ich denke, dass die Spalten ab AC alle verschiedenen Berechnungsvarianten enthalten, so dass ich zukünftig die Codes gut eigenständig modifizieren könnte, um so alle denkbaren Rechnungen durchzuführen. Wenn ich also z.B. anstatt der letzten 10 Spiele die letzten 8 Spiele in Betracht ziehen möchte oder anstatt der geschossenen Tore die erzielten Punkte der letzten Spiele ermitteln möchte, denke ich, dass ich es schaffe, die Codes entsprechend abzuändern.
Von daher wäre es wirklich hervorragend, wenn du mir die Codes für die Spalten ab AC erstellen könntest, wenn die jeweilige Spalte eine solche rechenaufwendige "Wenn"-Formel enthält. Die Spalten wiederholen sich ja immer für Home und Away. Die jeweils 2. eigentlich identische Spalte könnte ich dann natürlich auch selbst machen.
Genau sind es folgende unterschiedliche Spalten, von denen ich sehr gern ein Muster hätte:
AC,AE,AG,AK,AO
Die Formel für "Toto" kannte ich noch gar nicht! Das ist ein sehr guter Tipp! Danke!
Ich hoffe, dass es nicht zu umständlich ist und würde mich wirklich sehr freuen, wenn du mir mit der Tabelle weiterhilfst!
Viele Grüße,
Andre

Anzeige
Spalten Q :AF berechnet
17.10.2013 10:56:43
Erich
Hi Andre,
hier werden jetzt die Spalten Q:AF berechnet - das ist also ein Zwischenstand:
https://www.herber.de/bbs/user/87683.zip
Das ist recht aufwändig - und wäre eigentlich eine Aufgabe für einen Profi, der seine Brötchen damit verdient.
(ich nicht - bin Rentner :-))
Wer ist eigentlich Mario? Ich wüsste schon ganz gern, für wen ich das hier tue...
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: Spalten Q :AF berechnet
17.10.2013 13:08:59
Andre
Hi Erich,
also Andre ist mein Zweitname. Ich habe mir angewöhnt, mich im Netz mit diesem Namen auszugeben. Auf manchen Seiten kann dies zwecks Annonymität hilfreich sein. Hier wäre es sicher nicht nötig gewesen. Ist halt Macht der Gewohnheit. Mein erster Name ist also Mario. Ich promoviere am Institut für Weltwirtschaft in Kiel. Bin aber derzeit in Elternzeit und wohne in Schweinfurt. Bis vor einem Jahr habe ich noch in Düsseldorf gewohnt. Da hätte ich dir mal eben auf die Schnelle ein paar Bier ausgeben können ;-)
Ziel meiner Auswertung ist es zum einen, Ineffizienzen auf den Sportwettmärkten aufzuzeigen, da sich diese Ergebnisse dann sehr gut auf Finanzmärkte übertragen lassen. Wettmärkte eignen sich hierzu sehr gut, da am Ende ein Ergebnis steht. Wenn man z.B. 1000 Spiele betrachtet, in denen die Heimmannschaft seit 10 Spielen nicht mehr gewonnen hat, kann man überprüfen, wie die Performance gewesen wäre, hätte man immer auf diese Mannschaft gewettet. Angenommen, man würde mit dieser Strategie einen Gewinn erzielen, so zeigt dies, das die Negativserie von den Marktteilnehmern überbewertet wurde, das Team, ausgedrückt durch die Wettquoten, also als zu schwach eingestuft wurde.
Ferner würde ich durch die Ratings gern ein Prognosemodell entwickeln, welches die Ergebnisse besser vorhersagen kann als die Quoten der Buchmacher.
Hier findest du eine relativ leichte Kost zum Thema Wettmärkte: http://www.ifw-kiel.de/wirtschaftspolitik/politikberatung/kiel-policy-brief/kiel-policy-brief-2010/
Es ist die Nummer 18.
Ich glaube dir gern, dass es ziemlich aufwändig ist, mich bei meinem Vorhaben zu unterstützen. Ich bin dir auch wirklich unglaublich Dankbar. Wenn ich lukrative Wettstrategien entdecke und diese dann in Zukunft nachspielen sollte, kann ich dir gern meine Wetttipps zukommen lassen ;-) Denn sollten gute Ergebnisse rausspringen, ist es durchaus eine Überlegung, diese auch für sich zu nutzen. Aber dies ist nicht mein primäres Ziel. In erster Linie soll diese Analyse Teil meiner Doktorarbeit werden.
Der Code bis Spalte AF scheint schonmal perfekt zu laufen. Ich werde ihn gleich nochmal auf Herz und Nieren prüfen ;-)
Viele Grüße und vielen Dank,
Mario/Andre ;-)

Anzeige
AW: Spalten Q :AF berechnet
17.10.2013 15:33:14
Andre
Hi,
ich habe den Code jetzt mal über die 800.000 Zeilen laufen lassen. Nach ca. 1 Minute Rechenzeit waren alle Ergebnisse da! Ich bin beeindruckt! Echt klasse, vielen Dank!
Gruß, Mario Andre

Danke für deine Rückmeldung!
17.10.2013 17:31:50
Erich
Hi Andre,
(dabei könnten wir gern auch bleiben - wie du möchtest - ist einfacher als Doppelname-Doppelname) :-)
Nach deinem vorletzten Post weiß ich etwas mehr über deine Ziele und den Zweck der Mappe,
und nun weiß ich auch, dass auch bei deinen 800.000 Sätzen erträgliche Laufzeiten rauskommen.
Ich sehe keinen Grund, nicht weiter zu basteln und werde mich melden... :-)
Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Danke für deine Rückmeldung!
17.10.2013 17:50:51
Andre
Super, das weiß ich wirklich zu schätzen! Ich freue mich, wieder von dir zu hören!
Viele Grüße, Andre

Spalten Q :AP berechnet
18.10.2013 20:06:05
Erich
Hi Andre,
nun rechnet die Prozedur die Spalten Q:AP. Bleibt das noch schnell genug?

Option Explicit
Sub Dict_Diverses()
Dim mDic As Object, sDic As Object, aa As Long, arS, arT, arM, arErg()
Dim zz As Long, cc As Long, strH As String, arW, mm As Integer
Set mDic = CreateObject("Scripting.Dictionary")   ' Teams / next
Set sDic = CreateObject("Scripting.Dictionary")   ' Sais+Team / Anz
Sheets("TestTab").Select                                    ' testhalber
aa = Cells(Rows.Count, 15).End(xlUp).Row - 1
arS = Cells(2, 4).Resize(aa, 1)           ' D     Saison
arT = Cells(2, 8).Resize(aa, 2)           ' H:I   Tore Home+Away
arM = Cells(2, 15).Resize(aa, 2)          ' O:P   IDs  Home+Away
ReDim arErg(1 To aa, 1 To 26)
For zz = 1 To aa                 ' Zeilen
' ---------------------------------------------- Sp. Q Toto
If arT(zz, 1) > arT(zz, 2) Then
arErg(zz, 1) = 1
ElseIf arT(zz, 1) = 10 Then _
arErg(zz, 24 + cc) = arW(10, 2)                 ' Torsumme
arW(10, 2) = arW(10, 2) - arW(mm, 2) + arT(zz, cc) ' Torsumme
arW(mm, 2) = arT(zz, cc)                           ' Tore
mDic(strH) = arW
Else
ReDim arW(0 To 12, 1 To 2)
arW(0, 1) = arErg(zz, 3 + cc)       ' 1. Wert aus T:U
arW(11, 1) = arErg(zz, 10 + cc)
arW(12, 1) = 1
arW(0, 2) = arT(zz, cc)             ' Tore
arW(10, 2) = arT(zz, cc)            ' Torsumme
mDic.Add strH, arW
End If
' ----------- Indizes 17 und 18 ---------------- Sp. AG:AH RatVor10
' ----------- Indizes 19 und 20 ---------------- Sp. AI:AJ Verä Rat
If arErg(zz, 12 + cc) >= 10 Then
arErg(zz, 16 + cc) = arW(10, 1)
arErg(zz, 18 + cc) = arErg(zz, 3 + cc) - arW(10, 1)
End If
' ----------- Indizes 15 und 16 ---------------- Sp. AE:AF AnzSais H+A
' ----------- Indizes 21 und 22 ---------------- Sp. AK:AL Rat SaisBeg
' ----------- Indizes 23 und 24 ---------------- Sp. AM:AN Änd SaisBeg
strH = arS(zz, 1) & arM(zz, cc)  ' Key = Saison&Team
If sDic.Exists(strH) Then
arW = sDic(strH)
arW(1) = arW(1) + 1
sDic(strH) = arW(1)
arErg(zz, 14 + cc) = arW(1)
arErg(zz, 20 + cc) = arW(2)
arErg(zz, 22 + cc) = arErg(zz, 3 + cc) - arW(2)
sDic(strH) = arW
Else
arErg(zz, 14 + cc) = 0
ReDim arW(1 To 2)
arW(1) = 1
arW(2) = arErg(zz, 3 + cc)
arErg(zz, 20 + cc) = arW(2)
arErg(zz, 22 + cc) = arErg(zz, 3 + cc) - arW(2)
sDic.Add strH, arW
End If
Next cc
Next zz
Cells(2, 17).Resize(aa, UBound(arErg, 2)) = arErg     ' Spalten Q:AP
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Spalten Q :AP berechnet
19.10.2013 12:42:40
Andre
Hallo!
Vielen lieben Dank! Ich habe die Prozedur über die 800.000 Zeilen durchlaufen lassen. Es hat ca. 2 Min gedauert. So schnell könnte ich das im Kopf nicht alles berechnen ;-)
Ob die einzelnen Berechnungen alle passen, habe ich noch nicht überprüft. Das schaffe ich voraussichtlich auch erst am Montag. Ich melde mich dann wieder.
Ich wünsche dir ein wohlverdientes schönes Wochenende!!!
Viele Grüße, Andre

Beschleunigung möglich?
19.10.2013 14:37:05
Erich
Hi Andre,
danke für deine Rückmeldung und die WoEnd-Wünsche!
Vielleicht kannst du noch ein wenig Zeit einsparen, indem du die Prozedur Dict_Diverses nicht direkt aufrufst,
sondern stattdessen diese hier:

Sub start()
Dim Calc As XlCalculation
With Application
Calc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
Dict_Diverses
.EnableEvents = True
.ScreenUpdating = True
.Calculation = Calc
End With
End Sub
Vermutlich wird es nicht so sehr viel ändern, aber einen Versuch wäre es wohl wert.
(Mich würde schon interessieren, ob das hier etwas bringt.)
Auch ich wünsch dir ein schönes Wochenende!
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Beschleunigung möglich?
21.10.2013 10:46:07
Andre
Hallo Erich,
ich habe sub start() ausprobiert. Es läuft nicht schneller. Aber es scheint mehr Arbeitsspfgaeicher zu benötigen, da Excel öfters wegen zu geringem Speicher abgestürzt ist. Es hat nur funktioniert, wenn ich die Mappe gerade neu geöffnet habe. Dieses Problem trat nicht auf, wenn ich die Prozedur direkt aufrief. Und wie gesagt, auch wenn sub start() lief, ging es dadurch nicht schneller. Es ist für mich auch nicht relevant, ob es schneller geht, da die ganzen Berechnungen ja nur einmal durchgeführt werden müssen. Wenn ich dann später die Datenbank um neue Spiele erweitern will, muss ich die ersten 800.000 Zeilen ja nicht nochmal berechnen lassen, sondern erst ab Zeile ca. 800.001. Das wären dann ja immer nur die Spiele der letzten Wochen und somit keine große Rechenaufgabe für Excel.
Ich habe die Berechnungen nun alle mal unter die Lupe genommen. Bis auf eine kleine Sache, scheint mir alles korrekt berechnet zu werden:
Und zwar werden die Spiele gesamt und die Spiele Saison unterschiedlich berechnet. Bei Spiele Saison gibt es keine Zeile, in der eine 1 steht. Sprich, für das erste Saisonspiel erscheint eine 0 und für das 2. Saisonspiel eine 2. Bei Spiele gesamt hingegen gibt es 0 und 1. Ich denke, dass die Berechnungen für Spiele gesamt korrekt sind. Es werden die Spiele berechnet, die vor dem aktuellen Spiel stattfanden. Ist das aktuelle Spiele der Mannschaft also das 100., dann erscheint eine 99. Bei Saisonspiele wird für das erste Spiel korrekt eine 0 angezeigt, ab dem 2. Spiele dagegen das laufende Spiele und nicht Spiele-1 (also die Spiele vor dem aktuellen Spiel). Ich habe schonmal im Code geguckt, aber das dauert wohl etwas länger, bis ich mich da reingefuchst habe ;-)
Noch eine Frage für eigene zukünftige Änderungen: Wenn ich anstatt der Tore der letzten 10 Spiele die Tore der letzten 10 Spiele der laufenden Saison ermitteln möchte, kann ich dies machen, indem ich den Code folgendermaßen ändere:
' ----------- Indizes 25 und 26 ---------------- Sp. AO:AP Tore Last10
For cc = 1 To 2                  ' Home/Away
strH = arM(zz, cc) & arS(zz, 1)              ' Key = Team-ID&Saison
If mDic.Exists(strH) Then
arW = mDic(strH)
mm = arW(12, 1) Mod 10
arW(10, 1) = arW(mm, 1)
arW(mm, 1) = arErg(zz, 3 + cc)      ' 10 Werte aus T:U
arW(11, 1) = arErg(zz, 10 + cc)
arW(12, 1) = arW(12, 1) + 1
If arErg(zz, 12 + cc) >= 10 Then _
arErg(zz, 24 + cc) = arW(10, 2)                 ' Torsumme
arW(10, 2) = arW(10, 2) - arW(mm, 2) + arT(zz, cc) ' Torsumme
arW(mm, 2) = arT(zz, cc)                           ' Tore
mDic(strH) = arW

Vermutlich reicht meine Änderung nicht. Aber dann ist es gut, dies an diesem Beispiel konkret zu sehen, was ich tun muss.
Viele Grüße und vielen Dank,
Andre

Anzeige
Korrektur
21.10.2013 12:23:00
Erich
Hi Andre,
ja, da hast du bezüglich der Laufzeit bestätigt, was ich erwartet hatte. Das Speicherplatzproblem ist auch interessant!
Dass es bei der momentanen Codierung möglich wäre, die Berechnungen erst ab einer bestimmten Zeile
- etwa 800001 - laufen zu lassen, glaube ich nicht. Dazu müssten dann wohl die Ergebnisse der Zeilen darüber in den Spalten Q:AP eingelesen werden.
Den Fehler bei der Saison-Spiele-Zählung habe ich gefunden. Da war eine völlig unsinnige Zeile drin:
sDic(strH) = arW(1)
Und die Reihenfolge der Zuweisungen stimmte nicht - sorry!
Der Code-Abschnitt sollte so sein:

' ----------- Indizes 15 und 16 ---------------- Sp. AE:AF AnzSais H+A
' ----------- Indizes 21 und 22 ---------------- Sp. AK:AL Rat SaisBeg
' ----------- Indizes 23 und 24 ---------------- Sp. AM:AN Änd SaisBeg
strH = arS(zz, 1) & arM(zz, cc)  ' Key = Saison&Team
If sDic.Exists(strH) Then
arW = sDic(strH)
arErg(zz, 14 + cc) = arW(1)
arW(1) = arW(1) + 1
arErg(zz, 20 + cc) = arW(2)
arErg(zz, 22 + cc) = arErg(zz, 3 + cc) - arW(2)
sDic(strH) = arW
Else
Die Erweiterung auf die Torsumme der letzten 10 Saisonspiele ist etwas umfangreicher, geht jetzt nicht auf die Schnelle.
arW() muss (im Saison-Teil) größer dimensioniert werden, von bisher arW(1 to 2) auf etwa arW(0 to 12) (oder ähnlich).
Dazu melde ich mich wieder.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: Korrektur
21.10.2013 13:00:55
Andre
Hi Erich,
vielen Dank für Ausbesserung der entsprechenden Spalten!
Mit meinen ursprünglichen (etwas umständlichen Formeln) würde es gehen, die Berechnungen erst ab Zeile 800.001 durchzuführen. Angenommen, ich aktualisiere meine Datenbank jeden Tag um die Spiele des Vortags, dann sind das ja immer weit unter 1000 Zeilen, die hinzukommen. Diese unter 1000 Zeilen zu berechnen, schafft Excel auch, wenn dabei die 800.000 oberen Zeilen betrachtet werden, dafür aber nicht berechnet werden müssen. Dann gibt es höchstens bald ein Problem mit der Anzahl der Zeilen. Aber das ist Zukunftsmusik und kommt nur in Frage, wenn ich eines Tages tatsächlich Wetten platzieren will. Für meine Analyse benötige ich nur die Daten, die ich bereits habe.
Viele Grüße, Andre

AW: Korrektur
21.10.2013 15:28:05
Andre
Hi,
mir ist noch ein kleiner Fehler aufgefallen. Der war aber schon in meiner Beispielmappe falsch. Und zwar geht es um die Berechnung der Veränderung in Spalte Z:
' ---------------------------------------------- Sp. Z Veränd
arErg(zz, 10) = 20 * Application.Max(1, ((arErg(zz, 2) ^ 2) ^ 0.5)) _
^ 0.5 * (arErg(zz, 7) - arErg(zz, 8))

Sie müsste so lauten, da das Max aus 1 und der Wurzel aus dem Betrag von der Diff gesucht wird.
Vielleicht magst du es bei dir im Code auch ändern, dann muss ich es nicht jedesmal ändern, wenn du mir ein Update schickst.
Viele Grüße, Andre

Rückfrage
21.10.2013 17:53:10
Erich
Hi Andre,
die neue Formel für Spalte Z habe ich noch nicht verstanden.
Sie würde - in Excel-VBA-Pidgin - lauten

= 20 * Max(1, ((arErg(zz, 2)^2)^0.5))^0.5 * (arErg(zz, 7) - arErg(zz, 8))
= 20 * Max(1, ((          R2^2)^0.5))^0.5 * (W2-X2) - wäre wohl dasselbe wie
= 20 * Max(1,         Abs(R2)       )^0.5 * (W2-X2) 
Die "Wurzel aus dem Betrag von der Diff" finde ich da nicht.
Wie würdest du die neue Formel in Excel schreiben?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: Rückfrage
21.10.2013 18:16:16
Andre
Hi,
Für Zeile 2 würde es lauten: Max(1,Abs(R2))^0.5. Dies ist die Wurzel aus dem Betrag.
Man kann es auch umständlicher machen, wie ich: Max(1,(R2^2)^0.5)^0.5.
Das wäre dann das Quadrat und dann die Wurzel = Betrag und dann nochmal die Wurzel wäre die Wurzel aus dem Betrag. Wie ich es im Code gemacht hatte läuft es. Ich wusste nur nicht ABS() in VBA... Daher meine umständliche Lösung ;-)
Viele Grüße, Andre

mit Spalten AQ:AR
21.10.2013 21:05:46
Erich
Hi Andre,
die nächste Stufe auf dem Treppchen ist wohl erreicht. Und hoffentlich stimmt jetzt auch noch Spalte Z...
Probier mal

Sub Dict_Diverses()
Dim mDic As Object, sDic As Object, aa As Long, arS, arT, arM, arErg()
Dim zz As Long, cc As Long, strH As String, arW, mm As Integer
Set mDic = CreateObject("Scripting.Dictionary")   ' Teams / next
Set sDic = CreateObject("Scripting.Dictionary")   ' Sais+Team / Anz
Sheets("TestTab").Select                                    ' testhalber
aa = Cells(Rows.Count, 15).End(xlUp).Row - 1
arS = Cells(2, 4).Resize(aa, 1)           ' D     Saison
arT = Cells(2, 8).Resize(aa, 2)           ' H:I   Tore Home+Away
arM = Cells(2, 15).Resize(aa, 2)          ' O:P   IDs  Home+Away
ReDim arErg(1 To aa, 1 To 28)
For zz = 1 To aa                 ' Zeilen
' ---------------------------------------------- Sp. Q Toto
If arT(zz, 1) > arT(zz, 2) Then
arErg(zz, 1) = 1
ElseIf arT(zz, 1) = 10 Then _
arErg(zz, 24 + cc) = arW(10, 2)                 ' Torsumme
arW(10, 2) = arW(10, 2) - arW(mm, 2) + arT(zz, cc) ' Torsumme
arW(mm, 2) = arT(zz, cc)                           ' Tore
mDic(strH) = arW
Else
ReDim arW(0 To 12, 1 To 2)
arW(0, 1) = arErg(zz, 3 + cc)       ' 1. Wert aus T:U
arW(11, 1) = arErg(zz, 10 + cc)
arW(12, 1) = 1
arW(0, 2) = arT(zz, cc)             ' Tore
arW(10, 2) = arT(zz, cc)            ' Torsumme
mDic.Add strH, arW
End If
' ----------- Indizes 17 und 18 ---------------- Sp. AG:AH RatVor10
' ----------- Indizes 19 und 20 ---------------- Sp. AI:AJ Verä Rat
If arErg(zz, 12 + cc) >= 10 Then
arErg(zz, 16 + cc) = arW(10, 1)
arErg(zz, 18 + cc) = arErg(zz, 3 + cc) - arW(10, 1)
End If
' ----------- Indizes 15 und 16 ---------------- Sp. AE:AF AnzSais H+A
' ----------- Indizes 21 und 22 ---------------- Sp. AK:AL Rat SaisBeg
' ----------- Indizes 23 und 24 ---------------- Sp. AM:AN Änd SaisBeg
' ----------- Indizes 27 und 28 ---------------- Sp. AQ:AR Tore Last10 Sais
strH = arS(zz, 1) & arM(zz, cc)  ' Key = Saison&Team
If sDic.Exists(strH) Then
arW = sDic(strH)
mm = arW(11) Mod 10
arErg(zz, 14 + cc) = arW(11)
arW(11) = arW(11) + 1
If arErg(zz, 14 + cc) >= 10 Then _
arErg(zz, 26 + cc) = arW(10)                    ' Torsumme
arW(10) = arW(10) - arW(mm) + arT(zz, cc)          ' Torsumme
arW(mm) = arT(zz, cc)                              ' Tore
arErg(zz, 20 + cc) = arW(12)
arErg(zz, 22 + cc) = arErg(zz, 3 + cc) - arW(12)
sDic(strH) = arW
Else
arErg(zz, 14 + cc) = 0
ReDim arW(0 To 12)
arW(11) = 1
arW(12) = arErg(zz, 3 + cc)
arErg(zz, 20 + cc) = arW(12)
arErg(zz, 22 + cc) = arErg(zz, 3 + cc) - arW(12)
arW(0) = arT(zz, cc)                ' Tore
arW(10) = arT(zz, cc)               ' Torsumme
sDic.Add strH, arW
End If
Next cc
Next zz
Cells(2, 17).Resize(aa, UBound(arErg, 2)) = arErg     ' Spalten Q:AR
End Sub
Noch eine Bemerkung: Fragen/Aufgaben und Code sind mittlerweile so speziell, dass das
kaum noch jemanden im Forum interessieren wird. Ich denke, dass der Code jetzt einigermaßen steht.
Wenn noch etwas zu tun ist, könnten wir das auch per Mail kommunizieren. Was meinst du?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: mit Spalten AQ:AR
21.10.2013 21:49:04
Andre
Hi Erich,
vielen Dank! Es scheint alles zu funktionieren!
Ich werde nochmal genau überlegen, welche Berechnungen ich auf jeden Fall noch benötigen würde und schauen, ob ich diese auch selbst schaffen würde. Obwohl mir das momentan alles noch sehr kompliziert erscheint ;-)
Wie steht's denn mit deiner Motivation?
Wir können gern via Email kommunizieren: mario.maschke[at]ifw-kiel.de
Schreib mir am besten kurz ne Mail, damit ich deine Adresse habe. Dann würde ich mich morgen melden, ob und inwiefern ich noch Hilfe benötige.
Viele Grüße,
Andre

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige