我的任务是创建一个图表,以可视化方式显示最后 5 个接受测试的受试者的结果。每个受试者都在 5 个不同的点进行测试,所有这些点都具有相同的极限值,也应该在图表中表示。
让我用一个虚拟表来解释一下:
主题 | 第1点 | 第2点 | 第3点 | 限制1 | 限制2 |
---|---|---|---|---|---|
A | 0,2 | 0,1 | 0,1 | 1 | -1 |
B | 0,3 | -0,2 | 0,2 | 1 | -1 |
C | 0,4 | 0,2 | 0,3 | 1 | -1 |
D | 0,3 | 0,7 | 0,4 | 1 | -1 |
E | 0,1 | 0,1 | 0,5 | 1 | -1 |
F | 0,4 | -0,4 | 0,6 | 1 | -1 |
该表不断增长,每天都会添加新主题(这已经用 vba 编码)。点数和限制数始终相同。从这张表中,我要做的是绘制一个折线图,每个“点”有三条线。只取最后 5 行(在本例中是从 B 行到 F 行)。
在每个主题图中,两个限制应始终与其中一个点的值一起表示。下面是第 1 点的示例图表:
我知道如何在没有 vba 的情况下通过使用偏移函数来实现这一点。但由于某种原因,大多数功能都不适用于我。所以我真的需要用vba来做。问题是我不知道如何选择动态表的最后 5 个。有什么帮助吗?
要更改系列的 X 和 Y 值,您可以写入其属性
XValues
和 Values
。以下例程将所有系列的数据设置为一系列数据的最后 n 值。它假设所有列都由一个系列表示,并且第一列(在您的情况下为 SUBJECTS
)保存 x 值。
Sub setChartToLastLines(ch As Chart, r As Range, Optional rowCount As Long = 5)
Dim colData As Range
With r.CurrentRegion
Set colData = .Columns(1)
Debug.Print colData.Address
If .Rows.Count > rowCount Then
Set colData = colData.Offset(.Rows.Count - rowCount).Resize(rowCount)
End If
End With
With ch
Dim i As Long
For i = 1 To .FullSeriesCollection.Count
.FullSeriesCollection(i).Values = colData.Offset(0, i)
.FullSeriesCollection(i).XValues = colData
Next i
End With
End Sub
您将应修改的图表本身以及数据中的单元格或范围作为参数传递。该例程将计算包含 X 轴最后 n 个值 (
colData
) 的范围。 Y 轴的值使用 Offset
函数检索。
您可以这样称呼它(我的数据和图表在同一张纸上):
Sub test()
With ThisWorkbook.Sheets(1)
Debug.Print .ChartObjects.Count
setChartToLastLines .ChartObjects(1).Chart, .Range("A1"), 5
End With
End Sub
在写入数据的例程末尾添加此调用,图表应指向最后 5 个条目。