Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA - Zähler in der Schleife

VBA - Zähler in der Schleife
03.02.2017 15:02:08
PS
Servus zusammen,
Ich brauche dringend Hilfe. Und zwar habe ich ein Tabellenblatt, welches durch ein Makro _ mittels eines anderen Tabellenblatts gefüllt wird (Aktien und Input). Nun soll für den Fall dass die Verkäufe (im Blatt Input als negative Zahl) genau so groß sind wie die Käufe die Position geschlossen werden. Dies funktioniert mittels des Code auch schon. Im Fall, dass die Verkäufe kleiner waren als der Bestand soll unterhalb der bereits bestehenden Position eine neue Zeile eröffnet werden, welche gefüllt werden soll und in die die Stückzahlen des Verkaufs eingetragen werden und in die ursprüngliche Zeile die Differenz aus Bestand und Verkauf. Das funktioniert auch. Nun kann es aber sein, dass es mehrere "Bestände" gibt, heißt an einer Stelle stehen 10000 gekaufte Aktien und später dann wieder 10000 gekaufte Aktien. Heißt die Verkäufe könnten pro Zeile die Käufe übersteigen. Für den Fall müsste der Code jetzt zum ersten Bestand gehen, ihn schließen und dann die Restsumme nehmen und diese mit dem anderen Bestand vergleichen, heißt der Code müsste sich merken, dass er bereits etwas abgezogen hat und selbstständig weiterlaufen bis zum nächsten,nächsten,nächsten... Bestand bis die Verkäufe alle eingetragen wurden. Bin mir nicht sicher wie das von statten gehen soll und hoffe ihr könnt mir vielleicht helfen.. Anbei der Code:

Sub Aktien_entf()
Dim TbI, TbA, LetzteZeileI As Long, LetzteZeileA As Long
Dim x As Long, Wert, Wert2, Wert3, Wert4, NextRow As Long
Dim Wert5 As Variant
Set TbI = Worksheets("Input")
Set TbA = Worksheets("Aktien")
Set TbW = Worksheets("Input Währung")
Set LookupRange = Worksheets("Input Währung").Range("B3:C23")
LetzteZeileI = TbI.Cells(TbI.Rows.Count, 1).End(xlUp).Row
LetzteZeileA = TbA.Cells(TbA.Rows.Count, 1).End(xlUp).Row
LetzteZeileB = TbA.Cells(TbA.Rows.Count, 2).End(xlUp).Row
For x = 2 To LetzteZeileI Step 1
For y = 2 To LetzteZeileA Step 1
Wert = TbI.Cells(x, 10).Value
' Wertpapierart Input
Wert2 = TbI.Cells(x, 11).Value
' Quantität Input
Wert3 = TbI.Cells(x, 7).Value
' BBG Ticker Input
Wert4 = TbA.Cells(y, 8).Value
' BBG Ticker Aktien
Wert5 = TbA.Cells(y, 5).Value
' Stückzahl Aktien
Wert6 = Abs(TbI.Cells(x, 11).Value)
' Betrag Quantität Input
Wert7 = TbI.Cells(x, 3).Value
' Datum Input
If Wert3 = Wert4 And TbA.Cells(y, 3).Value = "offen" _
And Wert = "EQUITIES" And Wert2 

Vielen Dank und viele Grüße!

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Beispieldatei?
03.02.2017 15:23:56
Michael
Hi,
eine Beispieldatei mit ausreichend Daten zum Testen wäre hilfreich - das Nachbasteln wäre mir persönlich zu zeitaufwendig.
Schöne Grüße,
Michael
AW: Beispieldatei?
03.02.2017 16:52:17
PS
Hi Michael,
Anbei mal die Datei. Ich habe mittlerweile entdeckt, dass der Code für den Fall dass die Verkaufszahlen kleiner dem Bestand sind auch nicht funktioniert: für den Fall dass die Aktie ganz unten in der Liste steht funktioniert sie, wenn sie allerdings weiter oben steht, dann fügt er soviele Spalten mit dem gleichen Inhalt ein, wie der Abstand zur letzten Zeile ist...
mag keine Z1S1-Notation
03.02.2017 19:23:13
Michael
Hi,
in der Datei befinden sich in den Spalten 12, 14 und 16 Fehler: "Name" (wohl wegen der UDF BDP) - insofern ist die Datei relativ wenig hilfreich.
Zum effektiven Arbeiten sind 3 Zeilen Testdaten auch etwas wenig.
Grundsätzlich fehlt in Modul1 die erste Zeile: Option excplicit, die Dir bereits bei der Entwicklung auf die Finger klopft, wenn Du nicht deklarierte Variablen verwendest (z.B. das in dieser Sub nicht weiter verwendete Set TbW = Worksheets("Input Währung")).
Das Abendessen ruft... Also: es sind diverse Optimierungen denkbar, aber jetzt nicht.
Ich stelle mal auf offen, vielleicht mag jemand anderes.
Schöne Grüße,
Michael
Anzeige
Entwurf
04.02.2017 11:49:57
Michael
Hi,
versuch mal:
Sub Aktien_entf()
Dim TbI As Worksheet, TbA As Worksheet
Dim IlZ&, AlZ& ' & = as long; I(nput)l(etzte)Z(eile) usw.
Dim ix&, ax&, z&, nZnr& ' dazu Laufvariablen ix,ax; z wie Zeile,
' nZnr: neue Zeilennummer (Spalte 1)
Dim WPA$, BBGi$, BBGa$     ' $ = as String, WPA: Wertpapierart
Dim Qty&, QtyAbs&, QtyRest&, QtyA&
Dim iKurs#, iWkurs#                ' # = as double
Dim iDat As Date
Dim c As Range
Dim rausHier As Boolean
Set TbI = Worksheets("Input")
Set TbA = Worksheets("Aktien")
IlZ = TbI.Cells(TbI.Rows.Count, 1).End(xlUp).Row
AlZ = TbA.Cells(TbA.Rows.Count, 1).End(xlUp).Row
z = AlZ
For ix = 2 To IlZ ' ist automatisch Step 1
WPA = TbI.Cells(ix, 10).Value    ' Wertpapierart Input
Qty = TbI.Cells(ix, 11).Value    ' Quantität Input
' alles Weitere wird nur eingelesen, falls benötigt,
' nämlich wenn...
If WPA = "EQUITIES" And Qty = QtyA Then
TbA.Cells(ax, 3) = iDat     ' Überträgt das Datum bei Closing das Datum
TbA.Cells(ax, 12) = iKurs   ' Fügt den Preis als LastPrice in Aktien ein
TbA.Cells(ax, 13) = iWkurs  ' letzter Wechselkurs
QtyRest = QtyRest - QtyA
If QtyRest = 0 Then rausHier = True
Else
If QtyRest  0 Then
MsgBox "kein offenes " & BBGi & " für Rest " & QtyRest & " gefunden." & _
vbLf & "Rest wird in Input korrigiert." & _
vbLf & "Hier könnte man auch short gehen."
TbI.Cells(ix, 11).Value = -QtyRest
End If
Else
MsgBox BBGi & " nicht in Aktien gefunden."
End If
End If
Next ix
End Sub

Das Makro ist dahingehend optimiert, daß Werte erst dann aus dem Blatt geholt werden, wenn sie benötigt werden - so erfolgen keine unnützen Zugriffe - die bei größeren Datenmengen Zeit fressen würden.
Damit es für Dich lesbar bleibt, habe ich auf den "Beschleuniger schlechthin", nämlich Arrays verzichtet.
Zum Programmierstil: ich mag tendenziell eher kurze Variablennamen (also nicht die lehrbuchmäßigen Dim lngDasisteineLaufvariable as Long), was mich aber nicht dran hindert, den Variablen Namen zu verpassen, die mit dem Inhalt korrespondieren, also z.B. Qty wie quantity statt Wert1, Wert2 usw.
Auf die Art spart man sich einiges an Kommentaren.
Na gut: insgesamt gesehen meine ich zu sehen, wo das ganze Ding hingehen soll, aber die Umsetzung kann man deutlich "eleganter" gestalten:
1. Schleife über den kompletten Input
2. je nach dem, ob "equity", "Rente" oder sonstwas gleich ins richtige Blatt springen und je nachdem, ob die qty größer oder kleiner 0 ist gleich die Daten erzeugen: dabei wundert mich, daß nur "Long" angelegt wird und nicht (auch) "short".
Noch "insgesamterer" frage ich mich, wozu dat Janze: jede trading-software macht nämlich genau das.
Schöne Grüße,
Michael
Anzeige
AW: Beispieldatei?
06.02.2017 12:16:38
PS
Hi Michael,
Sorry, dass ich mich erst jetzt melde, das Wochenende kam dazwischen. Dein Makro funktioniert fantastisch! Du hast natürlich Recht, dass es noch einige Fehler drin gab, habe gerade erst angefangen mit VBA und dementsprechend der erste dürftige Versuch. Mit der BDP Formel (Name) hast du auch Recht, diese zieht sich Daten aus Bloomberg. Ich hätte noch eine letzte Frage, die mir selbst auch erst jetzt eingefallen ist, die bei meinem Versuch auch schon falsch war. Bei der Kopie der Zeile übernimmt er ja die absoluten Werte, perfekt wäre jedoch wenn er hier auch die Formeln die sich in der Zeile befinden, als Formeln übernimmt. Hier zieht er sich nämlich teilweise den aktuellen Preis aus Bloomberg, was beim Restbestand auch so weiter passieren soll. Ansonsten bin ich komplett begeistert von den Makro und versuche das ganze mal zu verstehen. Tausend Dank hierfür!
VG
PS
Anzeige
AW: Beispieldatei?
06.02.2017 13:56:13
PS
Fehler meinerseits, hatte mich verguckt! Funktioniert super und auch einwandfrei! Kann mich nur wiederholen, besten Dank"
AW: Beispieldatei?
06.02.2017 14:11:23
Michael
Hi PS,
im Prinzip ist das die (in beiden If-Zweigen vorkommende) Zeile
TbA.Cells(ax, 12) = iKurs

wobei iKurs ja der Wert ist, der beim Input in Spalte 13 steht.
Ich verstehe das insofern nicht, als beim Einfügen einer Formel NICHT der im Input erhaltene Preis stehenbleibt, sondern er sich laufend ändert. Bei einem ABGESCHLOSSENEN Geschäft gibt es aber im Nachhinein keine Änderungen mehr, so daß die Formel hier witzlos ist.
Halt, halt... Also, wenn eine Position *komplett* geschlossen wird, kommt der Betrag rein (das ist der Then-Zweig), da paßt das mit dem = iKurs.
Wenn eine Position nicht komplett geschlossen wird, wird der Kurs in den geschlossenen Teil geschrieben, in der neu angelegten (kopierten) Zeile bleibt die Formel.
So ist es aber:
               If QtyRest >= QtyA Then
TbA.Cells(ax, 3) = iDat     ' Überträgt das Datum bei Closing das Datum
TbA.Cells(ax, 12) = iKurs   ' Fügt den Preis als LastPrice in Aktien ein
TbA.Cells(ax, 13) = iWkurs  ' letzter Wechselkurs **** INPUT ****
QtyRest = QtyRest - QtyA
If QtyRest = 0 Then rausHier = True
Else
If QtyRest 
Gruß,
Michael
Anzeige
AW: VBA - Zähler in der Schleife
03.02.2017 21:33:04
onur
Hi,
Kannst du mir die kompl. Datei schicken?
Gruß
Onur
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge