【问题标题】:Adding scattered data to a pie chart through VBA trouble通过VBA麻烦添加散点数据到饼图
【发布时间】:2015-09-10 09:56:00
【问题描述】:

我正在为我的论文做一个项目,当我尝试使用 VBA 在 Excel 中绘制饼图时遇到错误。

我正在处理的数据的性质使我无法使用直线范围,因为数据分散在工作表上。

obseg(0) = "=List3!"
obseg(1) = "=List3!"
Range("K6").Select
Do Until completed
    ActiveCell.Offset(1, 0).Select
    'Application.Wait (Now() + TimeValue("00:00:01"))
    If (ActiveCell.Value = "Čas:") Then
        obseg(0) = obseg(0) & CStr(ActiveCell.Offset(-1, 0).Address) & ";List3!"
        obseg(1) = obseg(1) & CStr(ActiveCell.Offset(-2, 1).Address) & ";List3!"
    End If
    If (IsEmpty(ActiveCell.Value)) Then
        obseg(0) = obseg(0) & CStr(ActiveCell.Offset(-1, 0).Address)
        If (IsEmpty(ActiveCell.Offset(-2, 1).Value)) Then
            ActiveCell.Offset(-2, 1).Value = "neznana"
            obseg(1) = obseg(1) & CStr(ActiveCell.Offset(-2, 1).Address)
        Else
            obseg(1) = obseg(1) & CStr(ActiveCell.Offset(-2, 1).Address)
        End If
        Exit Do
    End If
Loop

这是收集这些数据并将字符串写入 obseg(0) 和 obseg(1) 的代码。 特定运行的结果给出了 obseg(0) 的结果:

=List3!$K$19;List3!$K$63;List3!$K$69;List3!$K$79;List3!$K$114;List3!$K$118;List3!$K$122;List3!$K$126;List3!$K$136;List3!$K$142;List3!$K$145

这是我在手动选择相同数据并运行宏记录器时得到的完全相同的字符串。然后该代码可以工作,但不能。代码新建图表时出现问题。

Charts.Add
ActiveChart.ChartType = xlPie
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).values = obseg(0)
ActiveChart.SeriesCollection(1).XValues = obseg(1)

这会返回并出错,停在第三行:

Runtime error '1004'
Application-defined or object-defined error

非常感谢您解释为什么会发生这种情况或任何帮助。

谢谢!

【问题讨论】:

  • 更正:显然宏记录器生成的代码也不起作用。有什么方法可以让饼图接受我收到的数据字符串?
  • 饼图只有一个系列,因此您需要先清除所有现有系列。饼图通常也不是图表类型的最佳选择。

标签: vba excel charts


【解决方案1】:

不要对Series.ValuesSeries.XValues 使用字符串。请改用 Union 范围。

简单示例:

Sub Makro1()

    Set oXValues = Worksheets("List3").Range("$B$2:$B$4")
    Set oXValues = Union(oXValues, Worksheets("List3").Range("$B$8:$B$10"))
    Set oXValues = Union(oXValues, Worksheets("List3").Range("$B$13:$B$14"))

    Set oValues = Worksheets("List3").Range("$C$2:$C$4")
    Set oValues = Union(oValues, Worksheets("List3").Range("$C$8:$C$10"))
    Set oValues = Union(oValues, Worksheets("List3").Range("$C$13:$C$14"))

    Set oChart = Charts.Add
    oChart.ChartType = xlPie
    oChart.SeriesCollection.NewSeries
    oChart.SeriesCollection(1).Name = "=""test"""
    oChart.SeriesCollection(1).Values = oValues
    oChart.SeriesCollection(1).XValues = oXValues

End Sub

【讨论】:

    【解决方案2】:

    我设法通过以完全不同的方式构建 obseg 字符串来使其工作。事实证明,饼图只接受数字数据作为第一系列,任何类型作为第二系列。

    对于那些感兴趣的人来说,这里是从电子表格中收集数据的新代码:

    obseg(0) = "={"
    obseg(1) = "={"
    Range("K6").Select
    Do Until completed
        ActiveCell.Offset(1, 0).Select
        'Application.Wait (Now() + TimeValue("00:00:01"))
        If (ActiveCell.Value = "Čas:") Then
            obseg(0) = obseg(0) & CStr(ActiveCell.Offset(-1, 0).Value) & "; "
            obseg(1) = obseg(1) & Chr(34) & CStr(ActiveCell.Offset(-2, 1).Value) & Chr(34) & "; "
        End If
        If (IsEmpty(ActiveCell.Value)) Then
            obseg(0) = obseg(0) & CStr(ActiveCell.Offset(-1, 0).Value) & "}"
            If (IsEmpty(ActiveCell.Offset(-2, 1).Value)) Then
                ActiveCell.Offset(-2, 1).Value = "neznana"
                obseg(1) = obseg(1) & Chr(34) & CStr(ActiveCell.Offset(-2, 1).Value) & Chr(34) & "}"
            Else
                obseg(1) = obseg(1) & Chr(34) & CStr(ActiveCell.Offset(-2, 1).Value) & Chr(34) & "}"
            End If
            Exit Do
        End If
    Loop
    

    特定运行的结果将数组 obseg(1) 填充为:

    ={"1"; "5"; "12"; "neznana"}
    

    还有 obseg(0) 与:

    ={265; 76; 857; 8444}
    

    饼图接受这个。

    阿什堡

    【讨论】:

    • 但是图表完全独立于工作表上的数据。如果工作表上的数据发生变化,图表不会改变,直到您再次运行宏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多