【问题标题】:Data is graphing in Excel 2010, but not in Excel 2013数据在 Excel 2010 中绘制,但在 Excel 2013 中没有
【发布时间】:2014-06-11 19:56:24
【问题描述】:

我正在使用 VBA 绘制在 Excel 2010 中创建的程序中的数据。我将其发送到另一台装有 Excel 2013 的计算机上,我发现除了这个绘图问题之外,一切都运行良好。

我的代码将创建图表,并完美地调整它们的大小,但它实际上不会绘制任何数据点。在我的代码中,我还添加和删除了系列,我注意到侧面的系列数量是正确的,但系列没有保留我给它们的自定义名称。

但这就是转折点。当我右键单击图表并单击“选择数据”时,所有数据都会立即弹出,包括我为该系列自定义的所有名称。我什至不进入选择数据或任何东西。我点击它的那一刻,所有的值都会立即弹出。

Here is an imgur album of what it looks like before/after. Note that I do absolutely nothing other than right click and select the option "select data". 就像数据已经被选中,但直到我点击“选择数据”才显示出来。

为什么 Excel 2013 会这样做?如何使这些值通过 VBA 方法实际显示?我将在下面添加我使用的图形代码示例。

'Setting the range the chart will cover

Set rngChart = ActiveSheet.Range(Cells(Counter + 3, 4), Cells(Counter + 27, 10))

'Dimensioning the chart and choosing chart type

Set co = ActiveSheet.Shapes.AddChart(xlXYScatter, rngChart.Cells(1).Left, rngChart.Cells(1).Top, rngChart.Width, rngChart.Height)
Set cht = co.Chart
Set sc = cht.SeriesCollection

'Remove any default series

Do While sc.Count > 0
    sc(1).Delete
Loop

'Setting chart data

'Series 1
With sc.NewSeries
    .Name = "=Sheet1!$C$1"
    .XValues = "=Sheet2!$A$2:$A$" & SimpleTracker + 1
    .Values = "=Sheet2!$B$2:$B$" & SimpleTracker + 1
    .MarkerSize = 3
    .MarkerStyle = xlMarkerStyleCircle

End With

'Series 2
With sc.NewSeries
    .Name = "=Sheet1!$B$1"
    .XValues = "=Sheet1!$A$2:$A$" & Counter + 1
    .Values = "=Sheet1!$B$2:$B$" & Counter + 1
    .MarkerSize = 5
    .MarkerStyle = xlMarkerStyleCircle
    .MarkerBackgroundColorIndex = 10
    .MarkerForegroundColorIndex = 10
End With


'Setting chart labels
With cht
    .HasTitle = True
    If n = 0 Then
        .ChartTitle.Characters.Text = "Simple Fit - CFL Over Time"
    ElseIf Range("I" & n) = "Regression Title" Then
        .ChartTitle.Characters.Text = Range("J" & n).Text
    Else
        .ChartTitle.Characters.Text = "Simple Fit - CFL Over Time"
    End If
    .Axes(xlCategory, xlPrimary).HasTitle = True
    If DayTracker = 1 Then
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Days)"
    ElseIf HourTracker = 1 Then
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Hours)"
    Else
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Minutes)"
    End If
    .Axes(xlValue, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "CFL"
    .Axes(xlCategory).HasMajorGridlines = True
    .Axes(xlCategory).HasMinorGridlines = True
End With

我还想指出,此代码在 Excel 2010 中仍然可以完美运行,并且图形仍然可以在那里工作。它只是在 Excel 2013 中不起作用。

感谢您的阅读!如果您有任何问题或需要任何说明,请告诉我。

【问题讨论】:

    标签: vba excel excel-2010 excel-2013


    【解决方案1】:

    替换

    With sc.NewSeries
    

    With cht.SeriesCollection.NewSeries
    

    我在 Excel 2013 中遇到了同样的问题。我不知道为什么,但这个解决方案对我有用。

    【讨论】:

    • 这很完美!我想知道为什么它会修复它?不过还是谢谢!在我做之前我就知道有人会遇到这个问题!
    • 这很有趣。我不知道为什么它解决了这个问题,但我知道我从未使用变量来引用 SeriesCollection。也许很久以前我就有问题了。
    【解决方案2】:

    简短的故事是我无法复制不当行为。

    长话短说:我假设您的代码是 Sub 的主体,因此我创建了一个包含以下内容的模块:

    Sub DoItOriginal()
        'Setting the range the chart will cover
    
        Set rngChart = ActiveSheet.Range(Cells(Counter + 3, 4), Cells(Counter + 27, 10))
    
        'Dimensioning the chart and choosing chart type
    
        Set co = ActiveSheet.Shapes.AddChart(xlXYScatter, rngChart.Cells(1).Left, rngChart.Cells(1).Top, rngChart.Width, rngChart.Height)
        Set cht = co.Chart
        Set sc = cht.SeriesCollection
    
        'Remove any default series
    
        Do While sc.Count > 0
            sc(1).Delete
        Loop
    
        'Setting chart data
    
        'Series 1
        With sc.NewSeries
            .Name = "=Sheet1!$B$1"
            .XValues = "=Sheet2!$A$2:$A$" & SimpleTracker + 1
            .Values = "=Sheet2!$B$2:$B$" & SimpleTracker + 1
            .MarkerSize = 3
            .MarkerStyle = xlMarkerStyleCircle
    
        End With
    
        'Series 2
        With sc.NewSeries
            .Name = "=Sheet1!$B$1"
            .XValues = "=Sheet1!$A$2:$A$" & Counter + 1
            .Values = "=Sheet1!$B$2:$B$" & Counter + 1
            .MarkerSize = 5
            .MarkerStyle = xlMarkerStyleCircle
            .MarkerBackgroundColorIndex = 10
            .MarkerForegroundColorIndex = 10
        End With
    
    
        'Setting chart labels
        With cht
            .HasTitle = True
            If n = 0 Then
                .ChartTitle.Characters.Text = "Simple Fit - CFL Over Time"
            ElseIf Range("I" & n) = "Regression Title" Then
                .ChartTitle.Characters.Text = Range("J" & n).Text
            Else
                .ChartTitle.Characters.Text = "Simple Fit - CFL Over Time"
            End If
            .Axes(xlCategory, xlPrimary).HasTitle = True
            If DayTracker = 1 Then
                .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Days)"
            ElseIf HourTracker = 1 Then
                .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Hours)"
            Else
                .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Minutes)"
            End If
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "CFL"
            .Axes(xlCategory).HasMajorGridlines = True
            .Axes(xlCategory).HasMinorGridlines = True
        End With
    
    End Sub
    

    接下来,我需要一些数据来处理,所以在另一个模块中我编写了一个填充 Sheet1 和 Sheet2 的数据生成器。以下是该模块的内容:

    Option Explicit
    
    Sub Setup()
        SetupSheet "Sheet1", 5
        SetupSheet "Sheet2", 2.5
    End Sub
    
    Sub SetupSheet(nm As String, divisor As Double)
        Dim i As Long
        With ThisWorkbook.Worksheets(nm)
            .[A2].CurrentRegion.ClearContents
            .[B1].Value = "Chart" & Right(nm, 1)
            With .[A1]
                For i = 1 To SimpleTracker
                    .Offset(i).Value = i
                    .Offset(i, 1).FormulaR1C1 = "=1-EXP(-RC[-1]/" & divisor & ")"
                Next i
            End With
        End With
    End Sub
    

    然后我从 VB 编辑器执行 Setup(),并创建第三个工作表并激活它。

    然后我从 VB 编辑器运行 DoItOriginal(),我没有观察到您描述的问题。我想到一个可能的解释是从 VBE 切换回 Excel 用户界面确实隐藏了不当行为,所以我在工作表上安装了一个按钮并从那里执行 DoItOriginal,但仍然没有观察到 2010 年的行为、2011 年或 2013 年。

    我注意到的是这条线 .Name = "=Sheet1!$B$1" 在系列 1 的设置中可能要参考 Sheet2。

    试试上面的代码,看看你是否仍然观察到不当行为。如果你这样做而我不这样做,那可能会很有趣。如果您不这样做,那么难题是这种安排与您确实看到不当行为的上下文有何不同。既然你没发,那我就等着看吧。 -hth

    【讨论】:

    • 上面的一个人发现了问题!我不完全确定它为什么修复它,但是用With cht.SeriesCollection.NewSeries 替换With sc.NewSeries 解决了我的问题。谢谢你付出这么多的工作!非常感谢您的帮助。
    • 不客气。我也不确定为什么要修复它。据我所知,它不应该有。仍然很神秘,为什么我的代码版本没有显示错误行为。嗯。我希望它最终会变得清晰。前进。
    【解决方案3】:

    尝试添加

    DoEvents
    

    添加每个图表元素后,尤其是添加每个系列后。

    【讨论】:

    • 遗憾的是,这似乎不起作用。但我确实在上面找到了答案。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多