【问题标题】:How to determine the maximum value between trades如何确定交易之间的最大值
【发布时间】:2018-02-08 16:34:15
【问题描述】:

我有一个股票交易电子表格,我想确定交易之间的最大值和最小值。电子表格如下所示:

**Date**     **Stock  **Price**   **Action** **TradeNumber**
01/01/2018   Apple    1000.00           Buy    1
02/01/2018   Apple      995.25          -
03/01/2018   Apple      992.50          -
04/01/2018   Apple      987.50          -
05/01/2018   Apple      965.00         Close  1

我有一个包含交易编号的列的范围。我想在这个范围内循环,每次遇到带有交易编号的单元格时,我都需要确定我持有苹果股票期间价格列的最大值。我正在努力计算最大公式 =Max(C2:C5:) 的单元格范围。任何想法或指示将不胜感激。

【问题讨论】:

  • 必须在vba中吗?你可以通过为给定的Stock 添加带有 vlookups 的列来做你想做的事情,然后做这些的max() ......或类似的东西。它在 vba 中也很容易
  • 交易编号是否唯一?我在 2018 年 6 月 1 日或以后的某个日期服用,您很可能会再次购买苹果?是否会有任何其他股票与苹果混合,还是会一直买入....收盘,中间没有其他股票?
  • 嗨达伦,一个好问题。电子表格仅用于交易苹果股票。贸易编号依次跟随。我购买股票并在以后结束交易。我还出售股票并在以后结束交易。我正在尝试计算交易进行期间苹果的最高股价。有什么问题,请告诉我。
  • 很高兴您得到了答案。如果您将我的@ 后跟我的用户名,当您在 cmets 中回复时,我会收到通知。 @LawrenceHorner

标签: excel vba


【解决方案1】:

通过字典接近

建议通过 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

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 2012-10-02
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2011-08-22
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多