将单个订单汇总到阻止订单。

时间:2017-03-22 16:47:42

标签: excel excel-vba vba

我有一张包含多个订单的表格。例如[A2,B2,C2,D2,E2,F2] = [帐户#,边,数量,股票代码,限价,停止价格] - 我想先通过以下方式汇总订单自动收报机,然后在旁边。例如如果我有3个订单的油量为2,5,4,有边,买,买,卖 - 我想有2排买7油和卖4油。任何建议都会很棒。 我没有任何示例代码可供参考,因为不知道从哪里开始。

1 个答案:

答案 0 :(得分:0)

我设法以一种非常规的方式解决这个问题,但仍然有效。更容易合并所有参数,以便真正区分排除大小100%相同的订单。然后按大小聚合,然后反转该过程。这种方式实际上似乎让我很容易维护。 [D = Side,E = Qty,F = Contract,G = Ticker,H = Expiry,I = LimitPx,J = StopPx,K = Notes,L = Notes] - O& P只是空白/自由列。

Dim strFormula(1 To 1) As Variant
Dim LastRow As Long
Dim ws As Worksheet

Set ws = ThisWorkbook.Sheets("ORDERS")
LastRow = ws.Range("F" & ws.Rows.Count).End(xlUp).Row
With ThisWorkbook.Sheets("ORDERS")

strFormula(1) =   "=D4&""/""&F4&""/""&G4&""/""&H4&""/""&I4&""/""&J4&""/""&K4&""/""&L4"

.Range("O4:O4").Formula = strFormula
ws.Range("O4:O" & LastRow).FillDown

End With

Sheets("ORDERS").Range(Range("O4"), Range("O4").End(xlDown)).Copy
Range("O4").PasteSpecial xlPasteValues
Application.CutCopyMode = False

'********************************************************************

Dim OrderRng As Range
Dim Dic As Variant
Dim ordparam As Variant

On Error Resume Next

xTitleId = "ETS_TRADE_BLOCK"
Set OrderRng = Range(Range("A4"), Range("O4").End(xlDown))
Set Dic = CreateObject("Scripting.Dictionary")

ordparam = OrderRng.Value

For i = 1 To UBound(ordparam, 1)

    Dic(ordparam(i, 15)) = Dic(ordparam(i, 15)) + ordparam(i, 5)

Next
Application.ScreenUpdating = False

OrderRng.ClearContents
OrderRng.Range("O1").Resize(Dic.Count, 1) = Application.WorksheetFunction.Transpose(Dic.keys)
OrderRng.Range("P1").Resize(Dic.Count, 1) = Application.WorksheetFunction.Transpose(Dic.items)

Application.ScreenUpdating = True

'***************************************************************************

Dim reFormula(1 To 9) As Variant
Dim LastRows As Long
Dim wst As Worksheet

Set wst = ThisWorkbook.Sheets("ORDERS")
LastRows = wst.Range("O" & wst.Rows.Count).End(xlUp).Row
With ThisWorkbook.Sheets("ORDERS")

    reFormula(1) = "=LEFT(O4,FIND(""/"",O4)-1)"
    reFormula(2) = "=P4"
    reFormula(3) = "=TRIM(LEFT(SUBSTITUTE(MID(O4,FIND("" | "",SUBSTITUTE(O4,""/"","" | "",1))+1,LEN(O4)),""/"",REPT("" "",LEN(O4))),LEN(O4)))"
    reFormula(4) = "=TRIM(LEFT(SUBSTITUTE(MID(O4,FIND("" | "",SUBSTITUTE(O4,""/"","" | "",2))+1,LEN(O4)),""/"",REPT("" "",LEN(O4))),LEN(O4)))"
    reFormula(5) = "=TRIM(LEFT(SUBSTITUTE(MID(O4,FIND("" | "",SUBSTITUTE(O4,""/"","" | "",3))+1,LEN(O4)),""/"",REPT("" "",LEN(O4))),LEN(O4)))"
    reFormula(6) = "=TRIM(LEFT(SUBSTITUTE(MID(O4,FIND("" | "",SUBSTITUTE(O4,""/"","" | "",4))+1,LEN(O4)),""/"",REPT("" "",LEN(O4))),LEN(O4)))"
    reFormula(7) = "=TRIM(LEFT(SUBSTITUTE(MID(O4,FIND("" | "",SUBSTITUTE(O4,""/"","" | "",5))+1,LEN(O4)),""/"",REPT("" "",LEN(O4))),LEN(O4)))"
    reFormula(8) = "=TRIM(LEFT(SUBSTITUTE(MID(O4,FIND("" | "",SUBSTITUTE(O4,""/"","" | "",6))+1,LEN(O4)),""/"",REPT("" "",LEN(O4))),LEN(O4)))"
    reFormula(9) = "=TRIM(LEFT(SUBSTITUTE(MID(O4,FIND("" | "",SUBSTITUTE(O4,""/"","" | "",7))+1,LEN(O4)),""/"",REPT("" "",LEN(O4))),LEN(O4)))"

.Range("D4:L4").Formula = reFormula
wst.Range("D4:L" & LastRows).FillDown

End With

Sheets("ORDERS").Range(Range("D4"), Range("L4").End(xlDown)).Copy
Range("D4").PasteSpecial xlPasteValues
Application.CutCopyMode = False