gpt4 book ai didi

vba - 在 Visual Basic 中绘制时,XY 散点图不正确的 X 轴?

转载 作者:行者123 更新时间:2023-12-04 21:01:58 25 4
gpt4 key购买 nike

我正在尝试使用 Visual Basic 创建散点图,y 轴是数值,x 轴是日期。目的是让情节包含多个系列。以下是相关代码:

ActiveWorkbook.Charts.Add
ActiveChart.ChartArea.Select
With ActiveChart
.ChartType = xlXYScatter
.HasTitle = True
.ChartTitle.Text = "Time Trend of Data"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Dates"
.Axes(xlCategory, xlPrimary).CategoryType = xlTimeScale
.Axes(xlCategory, xlPrimary).TickLabels.NumberFormat = "m/d/yy;@"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Total Time"
.Legend.Position = xlLegendPositionBottom
End With

ActiveSheet.Move After:=Sheets(ActiveWorkbook.Sheets.count)
ActiveSheet.Name = "Time Trend " + CStr(currTT) ' This is just to make sure the new sheet does not have the same name

生成一些数据后,我尝试用循环绘制它。我使用的数组是 图表标签 - 这是每个系列的名称, 图表数据 - 一个 3d 数组,每个系列都有多个数据点和 xval 和 yval - 从 chartData 数组构建的数组,这些数组相互绘制:
For j = 0 To UBound(chartLabels)
If IsEmpty(chartLabels(j)) Then Exit For
Erase xval
Erase yval
ReDim Preserve xval(0 To 0)
ReDim Preserve yval(0 To 0)
xval(0) = chartData(1, j, 0)
yval(0) = chartData(2, j, 0)

For i = 0 To UBound(chartData, 3) - 1
If Not IsEmpty(chartData(2, j, i + 1)) Then
ReDim Preserve xval(0 To i + 1)
ReDim Preserve yval(0 To i + 1)
xval(i + 1) = chartData(1, j, i + 1)
yval(i + 1) = chartData(2, j, i + 1)
End If
Next

MsgBox (Join(xval, " || "))
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(j + 1).XValues = xval
ActiveChart.SeriesCollection(j + 1).Values = yval
ActiveChart.SeriesCollection(j + 1).Name = main.chartLabels(j)
Next

包含 MsgBox 语句以查看我作为 XValues 传递给我的散点图的数组。来自 的数组的输出第一个系列好像:

enter image description here

所有这些值都是日期格式。创建的系列数量各不相同。此外,每个系列中的数据点数量很大程度上取决于用户选择的选项。但是,散点图上生成的输出如下所示:

enter image description here

图表上的所有内容都是正确的,除了 xaxis 被缩放到其各自系列中每个数据点的位置,而不是实际日期(即 1/0/00 在日期格式中实际上是 0,而 3/10/00 是 70,因为有大约有 70 个数据点)。

我尝试使用 xlCategoryScale 和 xlAutomaticScale 作为我的 CategoryType。我已经尝试在我的每个 xval 以及 CStr() 上使用 CDate()。我尝试为 XValues 输出不同的数组。没有任何效果。

我怀疑这个问题与我试图绘制多个系列数据的事实有关。但是,如果有人能告诉我实际问题和/或解决这个问题的方法,我将非常感激。先感谢您!

最佳答案

我不知道为什么我没有想到这一点......在我发布这个两个小时后,我发现虽然在我的 XValues 上使用 CStr() 和 CDate() 是没用的,但 CDbl() 确实有效。我将避免删除我的问题,因为我认为这不是很直观。我不确定为什么会这样,因为我仍在将 xaxis 格式化为 .CategoryType = xlTimeScale。我在上面的代码中添加了这段代码(这是我之前用 CStr() 和 CDate() 测试过的代码,但我没有在问题中包含它):

For k = 0 To UBound(xval)
xval(k) = CDbl(xval(k))
Next

这是在问题代码中的 MsgBox 之前添加的。这是集合中第一个系列的 XValues 的 MsgBox 的新输出:

enter image description here

注意:这些值都在 42000 中,因为每个整数都等于一天,而这个数据来自 2015 年。
2015 - 1900 = 115 years
115 years * 365.25 days/year = 42003.75
'In reality 2015 = 42005 (because of what years were leap years, etc.)

最后,这是在散点图中将“数字”日期作为 xvalues 的实际输出:

enter image description here

我想这里的教训是 xaxis 喜欢数字,使用其他任何东西可能会变成一种皇家痛苦。如果有人看到这篇文章,我希望它有帮助!

关于vba - 在 Visual Basic 中绘制时,XY 散点图不正确的 X 轴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34318656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com