通过字典接近
建议通过 datafield 数组获取数据并使用 dictionary 我将 唯一交易编号 记录为 key 和引用数组指数与最高价格值一起作为项目。
另外我认为
- 您的数据范围包括标题行
- 您的日期范围来计算最低/最高价格包括以及购买日期作为截止日期(如果不是这样,您可以轻松更改这些值)。
代码
Option Explicit
Sub Stock()
Const colTrdNo As Integer = 5 ' column of TradeNo, e.g. 5th column
Dim sTrdNo As String, sTrdNoOld As String
Dim v, vKeys, vItems
Dim i As Long, n As Long
Dim dHigh As Double
Dim dict As Object ' late bound dictionary
Set dict = CreateObject("Scripting.Dictionary")
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Apple") ' << change to your sheet name
' -----------------------
' I. Get data
' -----------------------
' get last row in range
n = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
' get data from column A:E to variant 1-based 2-dim datafield array
v = ws.Range("A1:E" & n)
' ------------------------
' II. Use dictionary
' ------------------------
' check price when closing
For i = 2 To UBound(v) ' << assume you omit title row
sTrdNo = v(i, colTrdNo)
If dict.exists(sTrdNo) Then ' Close
dict(sTrdNo) = dict(sTrdNo) & "," & i
dict(sTrdNo) = dict(sTrdNo) & " => Min/Max $ " & getMinMax(v, dict(sTrdNo))
ElseIf Len(sTrdNo) = 0 Then ' do nothing (don't change ElseIf ORDER!)
Else ' new TradNo -> Buy
dict.Add sTrdNo, i
End If
Next i
' ------------------------
' III. Get needed info
' ------------------------
Debug.Print String(30, "~")
vKeys = dict.keys()
vItems = dict.items()
For i = LBound(vKeys) To UBound(vKeys)
Debug.Print i & " TradeNo " & vKeys(i) & ": Items " & vItems(i)
Next i
' clear memory
Set dict = Nothing
Set ws = Nothing
End Sub
辅助功能
Function getMinMax(arr, ByVal s As String) As String
' Purpose: calculate highest price in array (given items range s)
Const colPRICE As Integer = 3
Dim i As Long, iStart As Long, iLast As Long
Dim dHigh As Double, dLow As Double
iStart = Val(Split(s, ",")(0)): iLast = Val(Split(s & ",", ",")(1))
dLow = 99999999999#
For i = iStart To iLast
If arr(i, colPRICE) > dHigh Then dHigh = arr(i, colPRICE)
If arr(i, colPRICE) < dLow Then dLow = arr(i, colPRICE)
Next i
getMinMax = dLow & " - " & dHigh
End Function