通过VBA将分散的数据添加到饼图中
我正在为我的论文做一个项目,当我试图用VBA在excel中绘制饼图时,我遇到了一个错误 我处理的数据的性质使我无法使用直线范围,因为数据分散在工作表上通过VBA将分散的数据添加到饼图中,vba,excel,charts,Vba,Excel,Charts,我正在为我的论文做一个项目,当我试图用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")) I
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)的此结果:
这与我手动选择相同数据并运行宏记录器时得到的字符串完全相同。那代码就行了,但这行不通。按代码创建新图表时会出现此问题
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
我们将非常感谢您解释为什么会发生这种情况或提供任何帮助
谢谢 不要将字符串用于
Series.Values
和Series.XValues
。改用范围的联合
简单的例子:
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
我通过以一种完全不同的方式构造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):
以及obseg(0)与:
饼图接受这一点
Fort Ash更正:显然宏记录器生成的代码也不起作用。有没有办法让饼图接受我正在接收的数据字符串?饼图只有一个系列,因此需要先清除任何现有系列。饼图通常也不是图表类型的最佳选择。但是,图表完全独立于工作表上的数据。如果工作表上的数据发生更改,则图表在再次运行宏之前不会更改。
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
={"1"; "5"; "12"; "neznana"}
={265; 76; 857; 8444}