Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1744to1748
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

Probleme mit WithEvents

Probleme mit WithEvents
15.03.2020 00:39:59
Marc
Guten Abend liebe Forumsgemeinde,
ich habe da mal wieder einen Fall bei dem ich zu keinem Ergebnis komme und ich hoffe hier kann mir jemand helfen. Ich ziehe mit folgendem Code Tickersymbole und Fundamentaldaten von der Traderworkstation von interactive Brokers.
Zunächst instanziere ich ein Objekt eines Klassenmoduls durch betätigen einer Schaltfläche:
Sub InitTWSControl()
Set ObjTWSControl = New Klasse1
End Sub

Im Klassenmodul wird bei Auslösen eines Events eine öffentliche Objektvariable deklariert, die sich auf eine Klasse bezieht.
Public WithEvents m_TWSControl As TWSLib.Tws

Im Klassenmodul befindet sich außerdem der folgende Code, der bei Initialisierung des Objekts ObjTWSControl eine Instanz der Klasse m_TWSControl erstellt:
Private Sub Class_Initialize()
Set m_TWSControl = New TWSLib.Tws
MsgBox "TWS initialisiert!"
End Sub

In einem Modul rufe ich nun eine Methode der Klasse m_TWSControl auf:
Call ObjTWSControl.m_TWSControl.reqMatchingSymbols(id, TickerSymbol)

Im Klassenmodul wird das Event abgefangen und ein Array gefüllt mit den empfangenen Daten:
Private Sub m_TWSControl_symbolSamples(ByVal reqId As Long, ByVal contractDescriptions As  _
TWSLib.IContractDescriptionList)
' Array für Listbox füllen
Dim cd As TWSLib.ComContractDescription
Dim derivateTypes As String
Dim i As Long
Dim J As Long
For i = 0 To contractDescriptions.Count - 1
Set cd = contractDescriptions.Item(i)
ReDim Preserve vArray(5, i)
vArray(0, i) = contractDescriptions.Item(i).contract.conId
vArray(1, i) = contractDescriptions.Item(i).contract.Symbol
vArray(2, i) = contractDescriptions.Item(i).contract.secType
vArray(3, i) = contractDescriptions.Item(i).contract.primaryExchange
vArray(4, i) = contractDescriptions.Item(i).contract.currency
derivateTypes = ""
For J = 0 To cd.DerivativeSecTypes.Count - 1
derivateTypes = derivateTypes & cd.DerivativeSecTypes.Item(J) & Space(1)
Next J
vArray(5, i) = derivateTypes
Next i
' Array transponieren für Format der Listbox
ReDim tArray(contractDescriptions.Count - 1, 5)
For i = 0 To contractDescriptions.Count - 1
tArray(i, 0) = vArray(0, i)
tArray(i, 0) = Trim(tArray(i, 0))
tArray(i, 0) = CStr(tArray(i, 0))
tArray(i, 1) = vArray(1, i)
tArray(i, 2) = vArray(2, i)
tArray(i, 3) = vArray(3, i)
tArray(i, 4) = vArray(4, i)
tArray(i, 5) = vArray(5, i)
tArray(i, 5) = Replace(tArray(i, 5), " ", ",")
Next i
End Sub

So weit funktioniert das im Grunde auch. Allerdings gibt es immer wieder Momente in denen WithEvents nicht ausgelöst wird und das Array entweder die Information der letzten Abfrage beinhaltet oder leer bleibt und somit beim Erzeugen der dafür vorgesehen Listbox natürlich ein Fehler auftritt. Das sagt mir, dass in diesem Moment keine Instanz der Klasse1 mehr aktiv ist. In der Regel ist es auch so, dass die erste Abfrage nach dem öffnen des Workbooks grundsätzlich einen Fehler erzeugt und das Array bzw. die Listbox nicht generiert werden kann weil keine Daten vorliegen bzw. weil WithEvents nicht gegriffen hat obwohl ich eine Instanz des Klassenmoduls erzeugt habe und verbunden bin. Ich habe einen Haltepunkt im Klassenmodul platziert und sehe daher ob WithEvents greift.
Damit der Code zuverlässig funktioniert muss ich nach jeder Abfrage die Verbindung kappen mit der entsprechenden Methode der Klasse m_TWSControl, erneut ein neue Instanz der Klasse1 erzeugen und mich wieder verbinden.
Wenn ich die Listbox nach Erhalt der Daten einfach schließe und einen neuen Call durchführe funktioniert das seltsamerweise so oft ich will aber sobald ich den Code weiterlaufen lasse und mir weitere Daten ziehe mit dem Code, der unten steht, kann ich den ersten Call für die Symbol Samples nicht mehr wiederholen ohne die Verbindung zu trennen und die Klasse1 neu zu instanzieren.
Der auf den ersten Call folgende zweite Call wird aus einem Userfrom ausgeführt:
Call ObjTWSControl.m_TWSControl.reqFundamentalData(FundID, ObjTWSControl.m_contractInfo, fs)

Und der Erhalt der Daten wird wieder durch WithEvents im Klassenmodul vollzogen:
Private Sub m_TWSControl_fundamentalData(ByVal reqId As Long, ByVal data As String)
Dim xmlDoc As Object
Set xmlDoc = CreateObject("Microsoft.XMLDom") 'XMLDocument Object erstellen
xmlDoc.LoadXML (data)
On Error Resume Next
Sheets("KPI´s").Cells.Clear
ThisWorkbook.Worksheets("KPI´s").Cells(1, 1).Value = "Jahr"
ThisWorkbook.Worksheets("KPI´s").Cells(1, 2).Value = "Ertragsgröße"
ThisWorkbook.Worksheets("KPI´s").Cells(1, 3).Value = "Sondereffekte"
ThisWorkbook.Worksheets("KPI´s").Cells(1, 4).Value = "Bereinigt"
ThisWorkbook.Worksheets("KPI´s").Cells(1, 5).Value = "Aktien"
ThisWorkbook.Worksheets("KPI´s").Cells(1, 6).Value = "per Share"
Dim fYears As Object '
Dim Period As Object
Dim attrColl As Object
Dim kpiColl As Object
Dim kpi As Object
Dim kpiSheet As Object
Dim Line As Integer
Dim dblRound As Double
Line = 1
Set kpiSheet = ThisWorkbook.Worksheets("KPI´s")
Set fYears = xmlDoc.getElementsByTagName("FiscalPeriod")
For Each Period In fYears
Line = Line + 1
If Period.getAttribute("Type") = "Annual" Then
Set attrColl = Period.Attributes
If Line = 2 Then FiscalDate = attrColl.Item(1).Value  ' Fiskaljahresende in Variable schreiben
kpiSheet.Cells(Line, 1).Value = attrColl.Item(2).Value
Set kpiColl = Period.getElementsByTagName("lineItem")
For Each kpi In kpiColl
If kpi.getAttribute("coaCode") = Rev Then
kpiSheet.Cells(Line, 2).Value = kpi.Text
ElseIf kpi.getAttribute("coaCode") = "SUIE" Then   ' Sondereffekte
kpiSheet.Cells(Line, 3).Value = kpi.Text
ElseIf kpi.getAttribute("coaCode") = "SDWS" Then  ' Diluted weighted average Shares
kpiSheet.Cells(Line, 5).Value = kpi.Text
End If
Next kpi
Else
End If
If Line 

Kann mir jemand sagen weshalb die Instanz des Klassenmoduls jedes mal gelöscht wird nachdem ich den Call für die Fundamentaldaten erfolgreich durchgeführt habe?
Woran kann es allgemein liegen wenn eine aktive Instanz eines Klassenmoduls gelöscht wird?
Viele Grüße,
Marc

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Probleme mit WithEvents
15.03.2020 08:02:17
Hajo_Zi
Hallo Marc,
Zu Deiner Datei kann ich nichts schreiben, was wohl daran liegt das ich nicht auf fremde Rechner schaue.Ich baue keine Datei nach.
Sollte die Datei verlinkt werden?
Wenn du an Stelle einer Demomappe deine Originalmappe hochladen willst, diese aber sensible Daten enthält, kannst du diese Daten
http://www.ms-office-forum.de/forum/showthread.php?t=322895
änderrn.
Das ist nur meine Meinung zu dem Thema.

AW: Probleme mit WithEvents
15.03.2020 09:18:07
Marc
Guten Morgen Hajo,
zunächst mal vielen Dank, auch wenn mich Deine Antwort jetzt nicht weiter gebracht hat. Es hat einen Grund, dass ich die Mappe nicht online stellen möchte. Der Rest meiner Mappe besteht aus Ideen, die ich nicht öffentlich Preis geben möchte und dafür bitte ich um Verständnis. Ich stelle aber schon einen ganz elementaren Teil des Codes zur Verfügung, der so manchem Anfänger von Nutzen sein dürfte, der sich, wie ich, mit der API von Interactive Brokers Monate lang herumgeschlagen hat bis es mal gefunzt hat. Diese ist nämlich nicht ausführlich dokumentiert und zur Orientierung steht ausschließlich ein Sample-Skript zur Verfügung. Das könnte ich übrigens gerne hochladen.
Wenn Du jetzt sagst ohne den Rest des Codes fehlt mir der Gesamtüberblick und so kann ich Dir nicht helfen dann ist das Pech für mich aber vielleicht kannst Du mir ja auch einfach ein paar generelle Hinweise geben woran es liegen könnte, dass WithEvents nicht greift.
VG,
Marc
Anzeige
AW: Probleme mit WithEvents
15.03.2020 10:05:35
Oberschlumpf
Hi Marc,
Zitat: Version: Ohne Relevanz
Hast du deine Datei mit jeder Excel-Version geprüft und festgestellt, dass deine Datei mit jeder Excel-Version nicht funktioniert?
Oder wieso denkst du, dass du beurteilen kannst, dass es egal ist, mit welcher Excel-Version du arbeitst, obwohl du ja bis jetzt deinen Code nicht zum Laufen bringst?!
Und ich muss HaJo zustimmen: no file - no party!
Und damit meine ich, dass eine Bsp-Datei nur mit dem Code, der zur Beantwortung deiner Frage relevant ist und natürlich entsprechend vielen Bsp-Daten von dir per Upload zur Verfügung gestellt werden könnte - ach ja, der Aufbau der Bsp-Datei sollte mit dem Original übereinstimmen.
Denn ich wage zu bezweifeln (Level: Basiskenntnisse in VBA), dass du den Code für die Bsp-Datei anpassen kannst, weil dieser auf andere Zellen zugreift als sie in dem Original verwendet werden.
All deine Code-Ideen, die du nicht zeigen willst, könntest du in der Bsp-Datei doch löschen...oder weißt du nicht, wie das geht?!
Ach ja, wieso kann eine Bsp-Datei helfen?
Na ja, erst mal Danke Schön für dein allgemeines Kompliment an alle Antworter in diesem Forum, dass du denkst, die Antworter schütteln hier ihre Lösungen immer nur so ausm Ärmel.
Aber leider ist dem nicht so. Mit einer Bsp-Datei und dem Code und Bsp-Daten können wir unsere Ideen testen - genau so, wie DU deinen Code MIT deiner Datei testest^^
Der Grund für den von uns nicht durchgeführten Nachbau (d)einer Datei ist nicht, (dass zumindest ich tz faul bin dazu), sondern dass wir die Datei einfach nicht nachbauen können! Wir wissen nicht, wie deine Datei aufbegaut ist!
Ciao
Thorsten
Anzeige
AW: Probleme mit WithEvents
15.03.2020 10:21:20
Marc
Hallo Thorsten,
da hast Du jetzt meinen Eröffnungsthread aber nicht korrekt gelesen. Mein Code läuft und die Daten, welche ich ziehen will, bekomme ich zumeist auch aber es gibt Momente in denen der Code spinnt. Wie im Eröffnungsthread beschrieben greift dann WithEvents nicht, aus mir nicht erkennbarem Grund.
Gruß,
Marc
AW: Probleme mit WithEvents
15.03.2020 10:26:14
Oberschlumpf
Hi Marc,
es gibt Momente in denen der Code spinnt
Oder in diesen Momenten werden durch deinen Code Paramater verwendet, an die du nicht denkst/nicht gedacht hast.
Außerdem: Wenn auch nur 1x der Code..ähh.."spinnt"...dann funktioniert dieser nicht zu 100% - darauf war meine Aussage "Code läuft nicht" bezogen.
Und noch immer fehlen: Bsp-Datei + Versionsangabe^^
Ciso
Thorsten
Anzeige
AW: Probleme mit WithEvents
18.03.2020 07:55:38
Torsten
Hallo Marc,
erstmal muss ich Hajo und Thorsten voellig recht geben, dass das ohne Bsp Datei wohl eher nichts wird mit jedweder Hilfe, da niemand hellsehen kann, wie deine Datei ausschaut und man das ohne Datei nicht nachvollziehen kann.
Weiterhin verstehe ich sowieso deine Fragestellung nicht so ganz.
Probleme mit WithEvents
Und der Erhalt der Daten wird wieder durch WithEvents im Klassenmodul vollzogen:

Ganz ehrlich habe ich mich wund gesucht nach einem einzigen With in deinem Code. Da ist nicht mal das kleinste Anzeichen eines With.
Gruss Torsten
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige