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
相关产品推荐
相关产品推荐

