Код выдает ошибку при добавлении точки останова, но не иначе - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть данные в файле вроде:

TIME|DIRECTION|ORDERID|SYMBOL|ROUTE||QUANTITY|PRICE
2012-05-29 11:17:18|B|1337|ZNGA|ARCA||6500|5.48
2012-05-29 11:17:53|B|1389|AAPL|ARCA||200|569.85
2012-05-29 11:18:22|S|1970|BRK/B|ARCA||600|77.48
2012-05-29 11:18:24|B|2335|BRK/B|ARCA||600|79.3
2012-05-29 11:19:27|B|2416|ZNGA|ARCA||4000|6.08
2012-05-29 11:19:29|S|2997|LNKD|ARCA||500|91.27
2012-05-29 11:19:40|S|3078|ZNGA|ARCA||3900|6.04

Я пытаюсь написать код VBA, который будет использовать данные и возвращать статистику, основанную на тикере (совокупное количество, цена и т. Д.). Я написал код, используя объект словаря с объектом класса. Это для назначения, поэтому я должен сделать это таким образом.

Если я просто запускаю код, он прекрасно компилируется. Числа неверны (пытается это исправить), но код компилируется.

Когда я добавил точку останова и попытался войти в код, он начал делать забавные вещи. Он работал нормально в течение первых нескольких запусков, но начал ломаться, когда я остановил запуски / добавление чего-либо и т. Д. Если я вхожу в код, кажется, что при его наличии существует объект словаря. Таким образом, утверждение If Not trades.exists(ticker) Then оценивается как False. Затем он прерывается на строку trades(ticker).cashVal = trades(ticker).cashVal - lineItems(posQuantity) * lineItems(posPrice), когда он, предположительно, пытается найти значение, но не находит ничего.

Ошибка: Ошибка времени выполнения «424»: требуется объект.

Как ни странно, опять же, если я запустил его без точки останова, он вполне соответствует.

Sub defineVar()
myFile = Range("$A$2")
End Sub

Public Sub test_everything()

Call defineVar

'Dim line As trade
Dim lines As Collection
Set lines = New Collection

Open myFile For Input As #1
Do Until EOF(1)
    Line Input #1, file_line
    lines.Add file_line
Loop
Close #1


Dim posTime As Byte
Dim posDirection As Byte
Dim posSymbol As Byte
Dim posQuantity As Byte
Dim posPrice As Byte

posTime = getColPosByHeader("TIME", lines(1))
posDirection = getColPosByHeader("DIRECTION", lines(1))
posSymbol = getColPosByHeader("SYMBOL", lines(1))
posQuantity = getColPosByHeader("QUANTITY", lines(1))
posPrice = getColPosByHeader("PRICE", lines(1))

Dim pos As Long
Dim ticker As String

Dim trades As Scripting.Dictionary
Set trades = New Scripting.Dictionary
Dim trade As Stock
Set trade = New Stock

pos = 2

While pos <= lines.Count
    lineItems = Split(lines(pos), "|")
    ticker = lineItems(posSymbol)
    If Not trades.exists(ticker) Then
        trade.symbol = ticker
        trade.cashVal = 0
        trade.positionVal = lineItems(posQuantity)
        trade.endPriceVal = lineItems(posPrice)
        trade.maxDateVal = lineItems(posTime)
        trades.Add trade.symbol, trade
        If InStr(1, lineItems(posDirection), "B") Then
            trades(ticker).cashVal = trades(ticker).cashVal - lineItems(posQuantity) * lineItems(posPrice)
        Else: trades(ticker).cashVal = trades(ticker).cashVal + lineItems(posQuantity) * lineItems(posPrice)
        End If
    Else:
    If InStr(1, lineItems(posDirection), "B") Then
        trades(ticker).cashVal = trades(ticker).cashVal - lineItems(posQuantity) * lineItems(posPrice)
        trades(ticker).positionVal = trades(ticker).positionVal + lineItems(posQuantity)
            If lineItems(posTime) >= trades(ticker).maxDateVal Then
                trades(ticker).maxDateVal = lineItems(posTime)
                trades(ticker).endPriceVal = lineItems(posPrice)
                End If
    Else: trades(ticker).cashVal = trades(ticker).cashVal + lineItems(posQuantity) * lineItems(posPrice)
        trades(ticker).positionVal = trades(ticker).positionVal - lineItems(posQuantity)
        If lineItems(posTime) >= trades(ticker).maxDateVal Then
            trades(ticker).maxDateVal = lineItems(posTime)
            trades(ticker).endPriceVal = lineItems(posPrice)
        End If
    End If
    End If
    Debug.Print trades(ticker).positionVal
    pos = pos + 1
Wend

Dim k As Variant
For Each k In trades.Keys
    Debug.Print k, trades(k).cashVal, trades(k).positionVal, trades(k).endPriceVal, trades(k).maxDateVal
Next

End Sub

Отредактировано для добавления: Вот как выглядят мои объекты класса:

'Class Module: Stock
Public symbol As String
Public cashVal As Double
Public positionVal As Double
Public endPriceVal As Double
Public maxDateVal As Date

Кто-нибудь знает, как вылечить эту любопытную проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...