You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Excel中自动将不同日期及对应数据点叠加到同一张图表中?

如何在Excel中自动将不同日期及对应数据点叠加到同一张图表中?

嗨,我完全懂你的需求——从其他工作表过滤来的动态数据,每组都对应着可能重叠的日期,想要不用手动粘贴数据,就能自动生成一张包含所有数据的折线图,而且数据的长度还会动态变化对吧?我给你分享两个实用的解决方案,不管是用公式还是VBA都能搞定。

一、公式法(适合Excel 365/2021及以上版本)

这个方法利用Excel的动态数组函数,自动对齐日期和数据,步骤很清晰:

  1. 提取所有唯一日期
    假设你的过滤后日期分别在A2:A100C2:C100E2:E100这些列(可以根据实际调整),在新的一列(比如G列)输入以下公式,它会自动提取所有不重复的日期并按顺序排序:

    =SORT(UNIQUE(VSTACK(A2:A100,C2:C100,E2:E100)))
    
    • VSTACK把所有日期列合并成一个数组,UNIQUE提取唯一值,SORT让日期按时间顺序排列,方便图表展示。
  2. 对齐各组数据到统一日期轴
    对应每个唯一日期,用XLOOKUP匹配各组的数据:

    • 第一组数据在B列(对应A列日期),在H2单元格输入:
      =XLOOKUP(G2,A:A,B:B,"")
      
    • 第二组数据在D列(对应C列日期),在I2单元格输入:
      =XLOOKUP(G2,C:C,D:D,"")
      

    下拉公式,所有数据就会自动对齐到G列的日期上,没有匹配到的日期会显示为空,图表会自动忽略这些空值。

  3. 生成折线图
    选中G列的日期和H、I等列的数据区域,插入折线图即可。因为用的是动态数组函数,当原过滤数据更新时,图表会自动同步更新。

如果是旧版Excel(没有动态数组函数),可以用INDEX+MATCH结合数组公式提取唯一日期,比如在G2输入:

=INDEX($A$2:$A$100,MATCH(0,COUNTIF($G$1:G1,$A$2:$A$100),0))

Ctrl+Shift+Enter作为数组公式输入,下拉直到出现错误值,再删除错误行;然后用INDEX+MATCH匹配数据:

=IFERROR(INDEX($B$2:$B$100,MATCH(G2,$A$2:$A$100,0)),"")

二、VBA法(适合需要完全自动化的场景)

如果你的数据集很多,或者需要一键生成图表,可以用VBA宏自动完成所有步骤:

Sub GenerateCombinedChart()
    Dim ws As Worksheet
    Dim uniqueDates As Collection
    Dim cell As Range
    Dim dateVal As Variant
    Dim outputRow As Integer
    Dim dataCols As Variant
    Dim i As Integer
    
    ' 替换成你的工作表名称
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    ' 定义日期列和对应数据列的配对,格式为"日期列:数据列",可根据实际添加/修改
    dataCols = Array("A:B", "C:D", "E:F")
    
    ' 收集所有唯一日期
    Set uniqueDates = New Collection
    On Error Resume Next
    For Each colPair In dataCols
        For Each cell In ws.Range(colPair).Columns(1).SpecialCells(xlCellTypeConstants)
            dateVal = cell.Value
            If IsDate(dateVal) Then
                ' 用日期字符串作为Key避免重复
                uniqueDates.Add dateVal, Key:=CStr(dateVal)
            End If
        Next cell
    Next colPair
    On Error GoTo 0
    
    ' 输出唯一日期到G列,G1作为标题
    outputRow = 1
    ws.Range("G1").Value = "日期"
    For Each dateVal In uniqueDates
        outputRow = outputRow + 1
        ws.Cells(outputRow, "G").Value = dateVal
    Next dateVal
    ' 对日期进行排序
    ws.Range("G2:G" & outputRow).Sort Key1:=ws.Range("G2"), Order1:=xlAscending
    
    ' 填充对应的数据列
    outputRow = ws.Cells(ws.Rows.Count, "G").End(xlUp).Row
    For i = 0 To UBound(dataCols)
        Dim colRange As Range
        Set colRange = ws.Range(dataCols(i))
        ' 设置数据列标题
        ws.Cells(1, "G" & i + 2).Value = "数据组" & i + 1
        For Each cell In ws.Range("G2:G" & outputRow)
            Dim matchCell As Range
            ' 查找对应日期的数据
            Set matchCell = colRange.Columns(1).Find(cell.Value, LookIn:=xlValues, LookAt:=xlWhole)
            If Not matchCell Is Nothing Then
                ws.Cells(cell.Row, "G" & i + 2).Value = matchCell.Offset(0, 1).Value
            Else
                ws.Cells(cell.Row, "G" & i + 2).Value = ""
            End If
        Next cell
    Next i
    
    ' 创建折线图,位置在J2开始的区域
    Dim chartObj As ChartObject
    Set chartObj = ws.ChartObjects.Add(Left:=ws.Range("J2").Left, Width:=600, Top:=ws.Range("J2").Top, Height:=400)
    With chartObj.Chart
        .ChartType = xlLine
        ' 设置图表数据源
        .SetSourceData Source:=ws.Range("G1:G" & outputRow & ",H1:" & ws.Cells(1, ws.Columns.Count).End(xlToLeft).Address)
        .HasTitle = True
        .ChartTitle.Text = "合并数据折线图"
        ' 设置坐标轴标题
        .Axes(xlCategory).HasTitle = True
        .Axes(xlCategory).AxisTitle.Text = "日期"
        .Axes(xlValue).HasTitle = True
        .Axes(xlValue).AxisTitle.Text = "数值"
    End With
End Sub

使用方法:

  • Alt+F11打开VBA编辑器,插入模块,粘贴上述代码;
  • 修改代码中的工作表名称和dataCols数组,匹配你的实际数据列;
  • 回到Excel,按Alt+F8运行宏,就能自动生成整理好的数据源和折线图。

备注:内容来源于stack exchange,提问作者orangecatman294832

火山引擎 最新活动