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

实现点击按钮更新折线图:添加当日数据并保留历史数据(VBA需求)

需求描述

我有一份电子表格,按下F9键后每个工作日会生成新的数值数据。需要通过VBA实现以下功能:

  • 每次点击命令按钮时,更新图表并添加当日数据,同时保留历史数据
  • 示例场景:
    • 12月20日首次使用:生成该日对应-1至1区间的折线图数据点
    • 12月21日点击按钮:保留12月20日的历史数据点,新增12月21日的数据点并连线
    • 12月22日点击按钮:保留前两日数据,继续新增当日数据

当前现有代码只能生成当日图表,需要修改为:将当日数据以日期为X轴变量保存为一个数据点,后续每日点击按钮时,新增对应日期的X轴变量及当日数据点到图表中。


现有VBA代码
Private Sub CommandButton1_Click()
Dim i As Integer
Dim ws As Worksheet
Set ws = Sheets("RV")
For Row = 1 To 20
    Dim my_cell
    Dim rng As Range
    Set rng = Sheets("RV").Range("H14:P15") 'selects daily Realized Vol ratios for FV, TY & US

    For Each my_cell In rng
        If my_cell <> "" Then

            ActiveSheet.Shapes.AddChart.Select
            ActiveChart.SetSourceData Source:=Range("'RV'!$H$14:$P$15")
            ActiveChart.ChartType = xlLineMarkers
            ActiveChart.Location Where:=xlLocationAsNewSheet
            ActiveSheet.Activate
            ActiveChart.PlotArea.Select
            ActiveChart.SeriesCollection(1).XValues = "='RV'!$H$14:$P$14"
            ActiveChart.SeriesCollection(1).Name = "=""Ratios Progress"""
            ActiveChart.SeriesCollection.NewSeries
            ActiveChart.SeriesCollection(2).Name = "=""Progress"""
            ActiveChart.DisplayBlanksAs = xlInterpolated
            ActiveSheet.Activate
            ActiveChart.ChartArea.Select

        Else
            Exit For ' Blank cell found, exiting
        End If
    Next
 
Next Row
End Sub

修改后的VBA代码
Private Sub CommandButton1_Click()
    Dim wsData As Worksheet
    Dim wsChart As Worksheet
    Dim chartObj As ChartObject
    Dim seriesObj As Series
    Dim lastDataRow As Long
    Dim currentDate As Date
    Dim dailyValue As Variant
    
    ' 指定数据所在工作表
    Set wsData = ThisWorkbook.Sheets("RV")
    
    ' 获取当日日期和对应数据(H15为当日生成的数值,可根据实际单元格调整)
    currentDate = Date
    dailyValue = wsData.Range("H15").Value
    
    ' 初始化历史数据存储区域(若未创建表头)
    If wsData.Range("A1").Value <> "日期" Then
        wsData.Range("A1").Value = "日期"
        wsData.Range("B1").Value = "当日数据"
    End If
    
    ' 找到历史数据的最后一行
    lastDataRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
    
    ' 检查当日数据是否已录入,避免重复添加
    If Not IsError(Application.Match(currentDate, wsData.Range("A:A"), 0)) Then
        MsgBox "今日数据已添加!", vbInformation
        Exit Sub
    End If
    
    ' 将当日数据写入历史存储区
    wsData.Cells(lastDataRow + 1, "A").Value = currentDate
    wsData.Cells(lastDataRow + 1, "B").Value = dailyValue
    
    ' 检查图表工作表是否存在,不存在则创建
    On Error Resume Next
    Set wsChart = ThisWorkbook.Sheets("数据趋势图")
    On Error GoTo 0
    If wsChart Is Nothing Then
        ' 创建新工作表存放图表
        Set wsChart = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        wsChart.Name = "数据趋势图"
        ' 添加折线图
        Set chartObj = wsChart.ChartObjects.Add(Left:=10, Width:=600, Top:=10, Height:=300)
        chartObj.Chart.ChartType = xlLineMarkers
        ' 设置图表数据源
        Set seriesObj = chartObj.Chart.SeriesCollection.NewSeries
        seriesObj.Name = "数据趋势"
        seriesObj.XValues = wsData.Range("A2:A" & lastDataRow + 1)
        seriesObj.Values = wsData.Range("B2:B" & lastDataRow + 1)
    Else
        ' 图表已存在,更新数据源
        Set chartObj = wsChart.ChartObjects(1)
        Set seriesObj = chartObj.Chart.SeriesCollection(1)
        seriesObj.XValues = wsData.Range("A2:A" & lastDataRow + 1)
        seriesObj.Values = wsData.Range("B2:B" & lastDataRow + 1)
    End If
    
    ' 配置图表格式(固定Y轴范围为-1到1)
    With chartObj.Chart
        .Axes(xlCategory).AxisTitle.Text = "日期"
        .Axes(xlCategory).HasTitle = True
        .Axes(xlValue).AxisTitle.Text = "数值"
        .Axes(xlValue).HasTitle = True
        .ChartTitle.Text = "每日数据趋势"
        .Axes(xlValue).MinimumScale = -1
        .Axes(xlValue).MaximumScale = 1
    End With
    
    MsgBox "数据已添加并更新图表!", vbInformation
End Sub

关键说明
  1. 历史数据持久化:在RV工作表的A、B列建立历史数据存储区,A列存日期,B列存对应数值,避免每次生成新图表丢失历史数据
  2. 重复录入拦截:通过Match函数判断当日数据是否已存在,防止重复添加
  3. 图表复用:首次运行创建专属图表工作表,后续点击按钮直接更新数据源,无需重复创建图表
  4. Y轴范围固定:将Y轴范围强制设置为-1到1,符合需求中的区间要求
  5. 灵活适配:若当日数据存放在其他单元格,修改dailyValue = wsData.Range("H15").Value中的单元格地址即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:01:07