XY散点图和字典问题

时间:2013-07-18 00:03:22

标签: excel vba excel-vba office-2010

我有一个函数可以根据任意数量的字典生成XY散点图(每个字典代表图中的一条线),每个字典都包含一个日期键和一个数字值。到目前为止,这些值似乎在Y轴上起作用,但是日期轴(X)似乎被打破了。每次我从字典中将系列添加到图形时,它会强制它到条形图,当我特别想要散点图时。如果我在分配之后强制它回到散点图,它完全拒绝显示日期轴。

以下是一些例子。

我希望图表看起来像这样 enter image description here

如果我告诉它不使用日期,图表就像这样

enter image description here

当我专门将系列的数据类型设置为xlDate时,图形会更改为此。它神秘地改为条形图

enter image description here

如果我在将其设置为使用xlDate之后将其特别更改回散点图,则它看起来像这样

enter image description here

非常感谢任何帮助。这是我的VBA代码

Sub GenerateProgressGraph()


Dim Dictionaries(1 To 2) As New Dictionary

    Dictionaries(1).Add DateValue("1/2/2012"), 1
    Dictionaries(1).Add DateValue("2/2/2012"), 2
    Dictionaries(1).Add DateValue("3/2/2012"), 3
    Dictionaries(1).Add DateValue("4/2/2012"), 4

    Dictionaries(2).Add DateValue("1/2/2012"), 1
    Dictionaries(2).Add DateValue("2/2/2012"), 1
    Dictionaries(2).Add DateValue("3/2/2012"), 3
    Dictionaries(2).Add DateValue("4/2/2012"), 4

    Call ProcessProgressGraph(Dictionaries)
End Sub

Sub ProcessProgressGraph(Dict() As Dictionary)

    Dim Graph As Shape
    Dim GraphRange As Range

    With ActiveSheet

        'set graph area
        Set GraphRange = Application.Range("E4:P21")

        'add a new chart
        Set Graph = Shapes.AddChart(xlXYScatterLinesNoMarkers, GraphRange.Left, _
                                    GraphRange.Top, GraphRange.Width, GraphRange.Height)

        With Graph.Chart

            With .Axes(xlCategory)
                .HasTitle = True
                .AxisTitle.Characters.Text = "Dates"
            End With

            .HasTitle = True
            .ChartTitle.Text = "Chart Title"
            .ChartType = xlXYScatterLinesNoMarkers

            'clear all chart data
            '(Excel has a tendency to give us silly resultsets by default)
            For Each srs In .SeriesCollection
                srs.Delete
            Next

            For Each Dictionary In Dict
                Dim ss As Series
                Set ss = .SeriesCollection.NewSeries
                ss.Name = "Values"
                ss.XValues = Dictionary.Keys
                ss.Type = xlDate
                .ChartType = xlXYScatterLinesNoMarkers 'this forces it back into a scatter plot since it auto makes a bar graph
                ss.Values = Dictionary.Items
            Next
        End With
    End With
End Sub

1 个答案:

答案 0 :(得分:2)

问题在于Excel对X轴值的本机处理。说实话,我不知道为什么会这样,但我知道如何解决它:

  1. 获取您的X轴日期值并使用以下内容将它们转换为Long:

    ReDim longDates(Dictionary.Count) as Long
    For i = LBound(Dictionary.Keys) to UBound(Dictionary.Keys)
        longDates(i) = Dictionary.Keys(i)
    Next
    
  2. 使用ss.XValues = longDates

  3. 将longDates指定为X轴值
  4. 使用以下功能将TickLabel数字格式设置为函数 end 的日期:

    .Axes(xlCategory).TickLabels.NumberFormat = "d/mm/yyyy"
    
  5. 那应该有用