Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在PowerPoint中为图表指定系列公式_Vba_Excel_Powerpoint - Fatal编程技术网

Vba 如何在PowerPoint中为图表指定系列公式

Vba 如何在PowerPoint中为图表指定系列公式,vba,excel,powerpoint,Vba,Excel,Powerpoint,在我的尽职调查过程中,我成功地解决了这个问题。我之所以发布它,是因为它可能会对其他人有所帮助,也可能会考虑其他可能的解决方案 chartData对象工作表包含ListObject表中嵌入的图表数据 我可以成功地操作这个ListObject,但是我很难得到正确反映数据的结果图表。我希望第1行有类别标签,第A列有系列名称,例如: A B C 1 | Cat1 | Cat2 | 2 srs1| 75% | 25% | 3 srs

在我的尽职调查过程中,我成功地解决了这个问题。我之所以发布它,是因为它可能会对其他人有所帮助,也可能会考虑其他可能的解决方案

chartData对象工作表包含ListObject表中嵌入的图表数据

我可以成功地操作这个ListObject,但是我很难得到正确反映数据的结果图表。我希望第1行有类别标签,第A列有系列名称,例如:

    A       B       C
1      |   Cat1  |  Cat2   |
2  srs1|   75%   |   25%   |
3  srs2|   68%   |   32%   |
对于大多数图表,我可以这样做:

Sub Main()
Dim c as Chart
Set c = ActivePresentation.Slides(1).Shapes("Chart 1")
UpdateChart c
End Sub

Sub UpdateChart(cht As Chart)
Dim chtFormula$
Dim chtSheet As Worksheet
Dim lTable As ListObject
Set chtSheet = cht.chartData.Workbook.Sheets(1)
Set lTable = chtSheet.ListObjects(1)
        chtFormula = "='" & chtSheet.name & "'!" & lTable.Range.Address
        cht.ApplyDataLabels
        cht.SetSourceData chtFormula, xlRows
End Sub
这将生成如下示例图表:

但是,当列A中的系列名称为数字字符串时,会出现问题,例如,如果系列名称为2012和2011,则该函数将返回以下错误:

手动打开“选择数据”对话框确认:

如果我手动编辑该系列,我可以获得所需的结果:

但到目前为止,我还无法在VBA中实现这一点。debug语句生成一个series.Formula,正如我所期望的:

=系列,第1张$A$1:$C$1,张1$A$2:$C$2,1

但如果我尝试操作公式字符串,然后将其赋值给.formula属性,则会得到对象“Series”的“Method”.formula”失败:

我仔细阅读了文档,并在PowerPoint图表中看到了这些内容。但它不起作用


有什么想法吗?

当我在发布问题之前测试各种方法时,我突然意识到我可以直接公式化地引用系列“.Name and.Values”和“.XValues”

以前,我从字符串文字和数组数据为这些属性赋值,例如.Name=str$和.Values=Array0,3,5,7

这是Power that be的初衷——当然已经改变了——因为从用户/客户的角度来看,这有一个问题,他们无法与图表交互,例如,轻松添加新系列或重新排列它们,等等

下面是我的想法:

Sub TestUpdate()
Dim cht As Chart
Dim chtSheet As Worksheet
Dim lTable As ListObject
Dim chtRange As Range
Dim srs As Series
Dim SC As SeriesCollection
Dim srsRow As Long

Set cht = ActivePresentation.Slides(2).Shapes(2).Chart

cht.chartData.Activate
Set chtSheet = cht.chartData.Workbook.Sheets(1)
Set lTable = chtSheet.ListObjects(1)

'## Define a range object to represent the part of the table containing the 
'   Headers (category labels) and the series data (but omitting the Series Labels)
Set chtRange = lTable.Range.Offset(, 1).Resize(, lTable.ListColumns.count - 1)

Set SC = cht.SeriesCollection

'## Get rid of any previous series data, 
'   A previous routine has assigned new data
'   and a subsequent routine will custom format the data labels, etc.
'   So it is best to start with a clean slate.
Do Until SC.count = 0
    cht.SeriesCollection(1).Delete
Loop

'## Add new series from each row in the Table, ignoring the header
For srsRow = 2 To chtRange.Rows.count
    Set srs = cht.SeriesCollection.NewSeries
    With srs
        .name = "=" & chtSheet.name & "!" & lTable.DataBodyRange.Cells(srsRow - 1, 1).Address
        .Values = "=" & chtSheet.name & "!" & chtRange.Rows(srsRow).Address
        .XValues = "=" & chtSheet.name & "!" & chtRange.Rows(1).Address
    End With
Next

cht.chartData.Workbook.Application.WindowState = -4140
End Sub

因此,它的长短不一之处在于,似乎无法指定.Formula属性,但如果分解公式的各个组成部分,则可以分别指定它们。

要使PowerPoint 2013崩溃吗?运行此代码。它执行良好,直到End Sub之前的最后一行

Sub CrashPowerPoint()
  Dim sl As Slide
  Dim sh As Shape
  Dim ch As Chart
  Dim srs As Series
  Dim sFmla As String

  Set sl = ActiveWindow.View.Slide
  Set sh = sl.Shapes(sl.Shapes.Count)
  Set ch = sh.Chart
  Set srs = ch.SeriesCollection(1)
  sFmla = srs.Formula
End Sub
我一直在尝试转换一些Excel图表VBA,使其在PowerPoint中运行。根据MSDN文档,系列公式是一个东西,但它无法访问


我已经开始使用.Values和.XValues,虽然取得了一些小的成功,但与Excel中的一样,它仍然感觉有点不自然。

因为问题的关键是数字XValues会产生问题,所以有一个解决方法。对于每个XValue,只需在字符串的开头加上“,”即可将其视为文本


这使您可以执行chart.SetSourceDataSheet1$A$1:$C$4,一切正常,无需为每一行创建单独的序列。

在sFmla分配中崩溃?我在2010年无法访问该属性,但您可以构建一个公式字符串并将其分配为:ch.SetSourceData(公式)(公式)(列)。崩溃。当它重新打开时,尝试恢复您的工作。您正在构建的公式不是系列公式,它只是图表源数据的一个范围。不幸的是,许多图表的数据过于复杂,无法使用SetSourceData,必须一次分配一个系列。这就是PowerPoint比Excel更难的地方…是的,PPT是不必要的复杂,尤其是需要激活chartData工作表。这是一个巨大的痛苦。是的,关于setSourceData方法中的公式,您是对的,它实际上不是级数公式,而是一个范围。正如你所看到的,我在PPT2010中也尝试过这样做,但没有失败,只是给出了438。