我正在尝试使用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轴均匀分布:
但是如果我保存文件,关闭它然后重新打开它会神奇地显示为日期轴,其中的点根据它们的真实距离沿x轴间隔:
如果我在重新打开后检查Series.XValues对象,则数组元素已转换为Variant / Double。我尝试在重新打开之前手动强制它们,但它会导致Excel崩溃。实际上即使我只是复制图表它足以让它看起来正确,所以Excel"知道"它是一个日期轴,但不是这样显示的。我将不得不使用它作为解决方案(即每当我更改图表时复制并删除旧版本),但它非常笨重,我想知道什么是'在这里继续我找到了这个http://www.ozgrid.com/forum/showthread.php?t=66504,但他似乎没有遇到同样的问题。我正在使用Excel 2010。
答案 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#)
但这使得轴表现为文本轴,日期间隔相等。虽然选择了“日期轴”选项,但其余的轴选项与文本轴相同,并且未显示日期轴的日期缩放部分。