【问题标题】:VBA Excel Charts: Enter Array as XValue on Date AxisVBA Excel图表:在日期轴上输入数组作为XValue
【发布时间】:2015-08-20 23:10:34
【问题描述】:

我正在尝试使用 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 轴好像是文本轴而不是日期轴(即点沿 x 轴均匀分布):

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

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

【问题讨论】:

    标签: excel vba charts


    【解决方案1】:

    当我在即时窗口中执行这个表达式时:

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

    VBA 返回“长”。所以我相信你的输入已经是数字了。

    我认为 Excel 通过将刻度标签的数字格式更改为非日期格式来“帮助您”。您可以使用以下方式将格式更改回最新:

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

    希望有帮助

    【讨论】:

    • 谢谢,我试过了,但 TickLabels.NumberFormat 已经是日期格式,玩弄它似乎没有帮助
    • 这很好奇 --- 当我运行你的代码并添加了新的代码行时,它对我有用。我用的是 Excel 2010,你用的是什么版本?
    • Excel 2010 v14 32 位
    • 可能这种行为与图表类型有关。我给出的代码示例适用于散点图。当我尝试使用折线图时,它在关闭和重新打开之前看起来与您的图表相似。尝试使用散点图:c.ChartType=xlXYScatterLines
    • 你是对的,xlXYScatterLines 可以正常工作。谢谢
    【解决方案2】:

    传入 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#)
    

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

    【讨论】:

    • 感谢 Jon,实际上它并没有改变轴类型。我的解决方案是尽可能使用散点折线图,当它必须是折线图时,我编写了一个宏以在同一位置复制(并删除旧的),这迫使它以应有的方式出现
    • 如果您使用我的程序,则无需重新创建图表(并使用您应用的任何自定义格式)。重置类别类型和数字格式使图表看起来正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2016-07-17
    相关资源
    最近更新 更多