当在Visual Basic中绘制XYScatter绘图错误XAxis?

我正在尝试使用visual basic创build散点图,y轴是数值,x轴是date。 意图是为了包含多个系列的情节。 这是相关的代码:

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 

在生成一些数据之后,我试图用一个循环来绘制它。 我使用的数组是chartLabels这是每个系列的名称chartData每个系列有 三个 数据点的三维数组, 以及 从chartData数组构build的 xval和yval数组,它们是相互绘制的

 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传递给我的Scatter Plot的数组。 从第一个系列arrays的输出如下所示:

在这里输入图像描述

所有这些值都是date格式。 创build的系列数量不尽相同。 此外,每个系列中的数据点数量可能取决于用户select的选项。 但是,散点图上生成的输出如下所示:

在这里输入图像描述

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

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

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

我不知道为什么我没有想到这一点…两个小时后,我发现,虽然我的XValues使用CStr()和CDate()是没用的,CDbl()实际上工作。 我将不要删除我的问题,因为我不认为这是非常直观的。 我不知道为什么这个工作,因为我仍然格式化xaxis为.CategoryType = xlTimeScale。 我把这一点代码添加到了上面的代码中(这是我之前用CStr()和CDate()testing过的代码,但是我没有把它包括在问题中):

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

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

在这里输入图像说明

注意:这些值都在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.) 

最后,在散点图中给出“Numerical”date的实际输出为xvalues:

在这里输入图像说明

我想这里的教训是,xaxis喜欢数字,使用其他任何东西都可能是一个皇家的痛苦。 如果有人遇到这个post,我希望这是有帮助的!