VBA Excel图表:在日期轴上输入数组作为XValue

时间:2015-08-12 15:05:41

标签: excel vba charts

我正在尝试使用VBA创建/修改带有日期x轴的Excel折线图,并使用数组而不是范围分配Series.Xvalues:

Sub test()
  Dim c As Chart: Set c = ActiveChart
  With c.SeriesCollection(1)
    .XValues = Array(42228, 42229, 42235, 42277, 42338, 42613)        
    .Values = Array(1, 2, 3, 4, 5, 6)  
  End With
End Sub

问题是当我运行.resulting .XValues的类型为Variant / String而不是Variant / Double时,因此图表显示x轴是Text轴而不是Date轴(即点沿x轴均匀分布:

enter image description here

但是如果我保存文件,关闭它然后重新打开它会神奇地显示为日期轴,其中的点根据它们的真实距离沿x轴间隔:

enter image description here

如果我在重新打开后检查Series.XValues对象,则数组元素已转换为Variant / Double。我尝试在重新打开之前手动强制它们,但它会导致Excel崩溃。实际上即使我只是复制图表它足以让它看起来正确,所以Excel"知道"它是一个日期轴,但不是这样显示的。我将不得不使用它作为解决方案(即每当我更改图表时复制并删除旧版本),但它非常笨重,我想知道什么是'在这里继续我找到了这个http://www.ozgrid.com/forum/showthread.php?t=66504,但他似乎没有遇到同样的问题。我正在使用Excel 2010。

2 个答案:

答案 0 :(得分:1)

当我在立即窗口中执行此表达式时:

TypeName(Array(42228, 42229, 42235, 42277, 42338, 42613)(1))

VBA返回" Long"。所以我相信你的输入已经是数字。

我认为Excel可以帮助你"通过将刻度标签的数字格式更改为非日期格式。您可以使用以下内容更改格式:

ch.Axes(xlCategory).TickLabels.NumberFormat = "m/d/yyyy"

希望有所帮助

答案 1 :(得分:1)

传入X值数组时,它们不是日期格式。 Excel非常有帮助,决定轴不再是日期刻度轴。但你可以轻松解决这个问题:

Sub test()
  Dim c As Chart
  Set c = ActiveChart
  With c.SeriesCollection(1)
    .XValues = Array(42228, 42229, 42235, 42277, 42338, 42613)
    .Values = Array(1, 2, 3, 4, 5, 6)
  End With
  With c.Axes(xlCategory, xlPrimary)
    .CategoryType = xlTimeScale
    .TickLabels.NumberFormat = "m/dd/yy"
  End With
End Sub

我最初的想法是无效的,就是输入值作为日期:

Array(#8/12/2015#, #8/13/2015#, #8/19/2015#, #9/30/2015#, #11/30/2015#, #8/31/2016#)

但这使得轴表现为文本轴,日期间隔相等。虽然选择了“日期轴”选项,但其余的轴选项与文本轴相同,并且未显示日期轴的日期缩放部分。