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

Forumthread: 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!
Anzeige

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...
Anzeige
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
Anzeige

Infobox / Tutorial

VBA Zähler in der Schleife optimieren


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und erstelle ein neues Arbeitsblatt.

    • Benenne das erste Blatt "Input" und das zweite "Aktien".
  2. Füge die benötigten Daten in die beiden Tabellenblätter ein.

    • Im "Input"-Blatt sollten die Verkaufs- und Kaufdaten stehen.
  3. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den Editor zu öffnen.
  4. Füge den folgenden VBA-Code ein:

Sub Aktien_entf()
    Dim TbI As Worksheet, TbA As Worksheet
    Dim LetzteZeileI As Long, LetzteZeileA As Long
    Dim x As Long, y As Long
    Dim Wert, Wert2, Wert3
    Dim Restwert As Long

    Set TbI = Worksheets("Input")
    Set TbA = Worksheets("Aktien")

    LetzteZeileI = TbI.Cells(TbI.Rows.Count, 1).End(xlUp).Row
    LetzteZeileA = TbA.Cells(TbA.Rows.Count, 1).End(xlUp).Row

    For x = 2 To LetzteZeileI
        For y = 2 To LetzteZeileA
            Wert = TbI.Cells(x, 10).Value
            Wert2 = TbI.Cells(x, 11).Value
            Wert3 = TbI.Cells(x, 7).Value

            If Wert3 = TbA.Cells(y, 8).Value And TbA.Cells(y, 3).Value = "offen" Then
                ' Hier wird der Zähler in der Schleife verwendet
                If Wert2 < 0 Then
                    ' Logik für negative Werte (Verkäufe)
                End If
            End If
        Next y
    Next x
End Sub
  1. Passe den Code nach deinen Bedürfnissen an.
    • Überprüfe die Logik für die Verkaufszahlen und die entsprechenden Bedingungen.

Häufige Fehler und Lösungen

  • Fehler: "Name" in der Datei

    • Lösung: Stelle sicher, dass alle verwendeten Funktionen (wie BDP) korrekt implementiert sind und die richtigen Werte zurückgeben.
  • Fehlerhafte Zählergebnisse

    • Lösung: Überprüfe die Schleifenbedingungen und stelle sicher, dass die Variablen korrekt initialisiert werden.
  • Doppelte Einträge

    • Lösung: Achte darauf, dass die Bedingungen zur Überprüfung der Verkäufe und Bestände korrekt formuliert sind, um doppelte Einträge zu vermeiden.

Alternative Methoden

  • Verwendung von Arrays:

    • Wenn du mit großen Datenmengen arbeitest, kann die Verwendung von Arrays die Performance drastisch erhöhen. Dies vermeidet unnötige Zugriffe auf das Arbeitsblatt.
  • Verwendung von Excel-Funktionen:

    • Anstelle von VBA kannst du auch Excel-Funktionen wie SUMIF oder INDEX nutzen, um bestimmte Berechnungen durchzuführen, ohne auf Makros zurückgreifen zu müssen.

Praktische Beispiele

  1. Bestand schließen:

    • Wenn du einen Bestand von 10.000 Aktien hast und 5.000 verkauft werden, sollte der Code die verbleibenden 5.000 Aktien im Bestand aktualisieren.
  2. Dynamisches Einfügen:

    • Wenn ein Verkauf die Grenze des Bestands übersteigt, wird eine neue Zeile mit dem Restbestand automatisch eingefügt.
If Restwert > 0 Then
    ' Neuen Eintrag für den Restbestand erstellen
End If

Tipps für Profis

  • Verwende Option Explicit:

    • Immer am Anfang deiner Module einfügen, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler zu vermeiden.
  • Dokumentiere deinen Code:

    • Kommentiere komplizierte Logik und Entscheidungen im Code, um die Wartbarkeit zu erhöhen.
  • Teste deinen Code regelmäßig:

    • Führe Tests mit kleinen Datenmengen durch, bevor du mit größeren Daten arbeitest, um sicherzustellen, dass alles wie gewünscht funktioniert.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass alle Variablen deklariert sind?

Antwort: Verwende Option Explicit am Anfang deines VBA-Moduls. Dies zwingt dich, alle Variablen vor der Verwendung zu deklarieren.

2. Was mache ich, wenn mein Makro nicht funktioniert?

Antwort: Überprüfe den Code Zeile für Zeile auf Fehler. Nutze das Debugging-Tool im VBA-Editor, um Fehlerquellen zu identifizieren.

3. Kann ich auch römische Zahlen verwenden?

Antwort: Ja, du kannst römische Zahlen in Excel verwenden, aber achte darauf, dass sie korrekt in dein Makro integriert sind, wenn du sie zur Identifizierung von Beständen nutzen möchtest.

4. Wie wird der Zähler innerhalb der Schleife implementiert?

Antwort: Der Zähler wird durch die Schleifenvariable x oder y in der For-Schleife dargestellt und kann genutzt werden, um bestimmte Bedingungen zu prüfen oder Zählungen durchzuführen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige