AW: Öffentliche Variable plötzlich leer
28.02.2023 20:22:18
Marc
Hi Daniel,
ich denke, dass ich Deine Hinweise alle korrekt befolgt habe. Das Seltsame ist, dass ich beispielsweise eine Boolean-Variable an den gleichen Stellen deklariere und verwende, die jedoch im Klassenmodul ihren vorher im Modul1 zugewiesenen Wert noch besitzt. (Ich habe es getestet in dem Ich den Wert vor dem Call der Prozedur, die sich im Klassenmodul befindet, auf true gesetzt habe.)
Hier Modul:
Option Explicit
Public ObjTWSControl As Klasse1
Public shName As String 'Öffentliche Variable für den Namen des Auswertungssheets deklarieren
Public Ready As Boolean
Public id As Long
Public row As Long
Sub InitTWSControl()
Set ObjTWSControl = New Klasse1
shName = ActiveSheet.Name ' Namen des Auswertungssheets als öffentliche Variable festlegen
End Sub
'TWS verbinden
Sub TwsVerbinden()
Dim x As String, y As Long
x = ActiveWorkbook.Worksheets(shName).Range("B4").Value
y = ActiveWorkbook.Worksheets(shName).Range("D4").Value
id = ActiveWorkbook.Worksheets(shName).Range("F4").Value
Call ObjTWSControl.m_TWSControl.Connect(x, y, id, False)
End Sub
'Datenabruf starten
Sub Datenabruf()
Dim row As Long, lastrow As Long
lastrow = ThisWorkbook.Sheets(shName).Cells(Rows.Count, 2).End(xlUp).row
For row = 7 To lastrow
Ready = False
' Suchbegriff abfragen
Dim TickerSymbol As String
Dim id As Long
' Financial Statement abrufen in TWS
'Dim FundID As Long
'FundID = 1700000 + 1
Dim fs As String
fs = "finstat"
' create contract
Set ObjTWSControl.m_contractInfo = ObjTWSControl.m_TWSControl.createContract()
' fill contract strcuture
With ObjTWSControl.m_contractInfo
.symbol = ThisWorkbook.Sheets(shName).Range("B7").Value
.currency = ThisWorkbook.Sheets(shName).Range("D7").Value
.exchange = ThisWorkbook.Sheets(shName).Range("E7").Value
.primaryExchange = ThisWorkbook.Sheets(shName).Range("F7").Value
.secType = "STK"
End With
' get xml data
Call ObjTWSControl.m_TWSControl.reqFundamentalData(id, ObjTWSControl.m_contractInfo, fs)
Do Until Ready = True
DoEvents
Loop
Application.Wait (Now + TimeValue("0:00:03")) 'Warten bis Daten von TWS vorliegen
Next row
End Sub
Und hier das Klassenmodul:
Option Explicit
Public WithEvents m_TWSControl As TWSLib.Tws
Public m_contractInfo As TWSLib.IContract
' Automatische Erstellung eines neuen Objekts der Klasse TWS.lib bei Instanzierung eines Objekts des Klassenmoduls Klasse 1
Private Sub Class_Initialize()
Set m_TWSControl = New TWSLib.Tws
If Not m_TWSControl Is Nothing Then
MsgBox "TWS initialisiert!"
Else
MsgBox "Failed to initialize!"
End If
End Sub
Private Sub m_TWSControl_connectAck()
MsgBox "TWS verbunden!"
End Sub
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)
...
Sheets(shName).Cells(row, 8).Value = csv
Ready = True 'Zeigt der Do Loop Schleife in Modul1, dass der Vorgang beendet ist.
End Sub