You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA绘制折线图:同一sell date按production time取最新价格

VBA实现按生产时间筛选最新价格并绘制折线图

一、数据预处理:提取每个销售日期的最新价格

核心逻辑是用字典记录每个sell date对应的最新production time及对应价格,遍历原始数据时,若当前行的生产时间比字典中已记录的该销售日期的时间更新,则替换为最新数据。

示例代码(假设数据在Sheet1,A列=销售日期,B列=生产时间,C列=价格,数据从第2行开始):

Sub GetLatestPricePerDate()
    Dim wsSource As Worksheet, wsTemp As Worksheet
    Dim lastRow As Long, i As Long
    Dim sellDate As Date, prodTime As Date, price As Double
    Dim priceDict As Object
    
    ' 初始化对象
    Set wsSource = ThisWorkbook.Worksheets("Sheet1")
    Set wsTemp = ThisWorkbook.Worksheets.Add ' 创建临时工作表存储处理后的数据
    Set priceDict = CreateObject("Scripting.Dictionary")
    
    ' 获取原始数据最后一行
    lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
    
    ' 遍历原始数据筛选最新价格
    For i = 2 To lastRow
        sellDate = wsSource.Cells(i, "A").Value
        prodTime = wsSource.Cells(i, "B").Value
        price = wsSource.Cells(i, "C").Value
        
        ' 字典无该日期则直接添加
        If Not priceDict.Exists(sellDate) Then
            priceDict.Add sellDate, Array(prodTime, price)
        Else
            ' 生产时间更新则替换数据
            If prodTime > priceDict(sellDate)(0) Then
                priceDict(sellDate) = Array(prodTime, price)
            End If
        End If
    Next i
    
    ' 将筛选后的数据写入临时表
    wsTemp.Cells(1, "A").Value = "Sell Date"
    wsTemp.Cells(1, "B").Value = "Latest Price"
    Dim key As Variant
    i = 2
    For Each key In priceDict.Keys
        wsTemp.Cells(i, "A").Value = key
        wsTemp.Cells(i, "B").Value = priceDict(key)(1)
        i = i + 1
    Next key
    
    ' 按销售日期排序(保证时间序列顺序,可选)
    wsTemp.Range("A2:B" & i - 1).Sort Key1:=wsTemp.Range("A2"), Order1:=xlAscending
End Sub

二、基于处理后的数据绘制折线图

把绘图逻辑整合到数据处理流程中,直接基于临时表生成折线图:

Sub GetLatestPriceAndDrawChart()
    ' 先执行数据预处理
    Call GetLatestPricePerDate
    
    Dim wsTemp As Worksheet
    Dim lastRowTemp As Long
    Dim chartObj As ChartObject
    
    Set wsTemp = ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) ' 取刚创建的临时表
    lastRowTemp = wsTemp.Cells(wsTemp.Rows.Count, "A").End(xlUp).Row
    
    ' 创建折线图
    Set chartObj = wsTemp.ChartObjects.Add(Left:=100, Width:=600, Top:=100, Height:=300)
    With chartObj.Chart
        .ChartType = xlLine
        .SetSourceData Source:=wsTemp.Range("A1:B" & lastRowTemp)
        .HasTitle = True
        .ChartTitle.Text = "每日最新价格趋势"
        ' 设置X轴为日期轴
        .Axes(xlCategory).CategoryType = xlTimeScale
        .Axes(xlCategory).HasTitle = True
        .Axes(xlCategory).AxisTitle.Text = "销售日期"
        .Axes(xlValue).HasTitle = True
        .Axes(xlValue).AxisTitle.Text = "最新价格"
    End With
    
    ' 可选:绘图完成后删除临时表
    ' wsTemp.Delete
End Sub

注意事项

  • 请根据实际数据的列位置、工作表名称修改代码中的对应参数
  • 确保生产时间单元格格式为日期时间型,避免时间比较出错
  • 临时工作表可根据需求保留或在绘图完成后删除

内容的提问来源于stack exchange,提问作者Muhtar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:38:12