2016-04-13 67 views
1
Sub printDashboard() 

    Dim sheet1 As Excel.Worksheet 
    Set sheet1 = ActiveWorkbook.Sheets("PM Dashboard") 

    Dim pptChart2 As Excel.ChartObject 

    'Open PowerPoint template 
    Dim sPath As String 
    sPath = ActiveWorkbook.Path 
    Dim pp As PowerPoint.Application, pps As PowerPoint.Presentation 
    Set pp = New PowerPoint.Application 
    pp.Visible = True 
    Set pps = pp.Presentations.Open(sPath & "\template_Slides.pptx") 
    Dim firstSlide As PowerPoint.Slide 
    Set firstSlide = pps.Slides(1)  

    'Paste the second chart 
    Set pptChart2 = sheet1.ChartObjects("chartPM2") 
    pptChart2.Copy 
    Dim myShape2 As Object 
    Set myShape2 = firstSlide.Shapes.PasteSpecial() 
    'myShape2.Chart.ApplyChartTemplate (sPath & "\pipelineManagementChartFormat.crtx") 
    With myShape2 
     .Top = 1.52 * 72 
     .Left = 5.33 * 72 
     .Width = 4.08 * 72 
     .Height = 2.6 * 72 
    End With 

End Sub 

所以这段代码完全在它:VBA - 如何粘贴Excel图表后应用图表模板到PowerPoint

  • 正确打开
  • Excel图表粘贴在PowerPoint文件并调整大小/重新定位

但是,我无法弄清楚如何应用一个保存的图表模板,我已经在同一目录。您可以看到我试图通过在“粘贴第二个图表”部分注释掉的“ApplyChartTemplate”行来完成此操作。

我很感谢这里的任何帮助。我已经尝试了许多不同的方法,将图表模板粘贴到幻灯片后应用。我还没有取得任何成功。

由于

+0

的.ApplyChartTemplate方法的工作原理,以便为它注释掉了,因为它没有做任何事情,或者因为它抛出一个错误,如果以后,哪个错误? –

+0

如果我取消注释,我收到“运行时错误445:对象不支持此操作” – bounty252

回答

0

PasteSpecial返回形状范围,而不是形状,但您需要将模板应用于单个形状(即图表对象)。试试这个:当我用它来预先保存的自定义模板应用到图表上滑动

Set myShape2 = firstSlide.Shapes.PasteSpecial()(1) 
+0

Doh。没有看到史蒂夫! “()(1)”语法在哪里用btw记录? bounty52:如果可能的话,我会建议在变量声明中使用期望的对象类型,因为如果myShape2已被声明为PowerPoint.Shape而不是通用对象类型,它将指向“Set myShape2”行上的错误。 –

+0

已记录。嗯。我不知道它是什么,但是返回范围的任何东西都可以(有时必须)像集合一样对待,所以如果你需要一个范围的成员而不是整个范围,那么你必须指定一个索引到范围。顺便说一句,只要你在做早期绑定,我完全同意myShape2应该变成PowerPoint.Shape而不是Object。 –

+0

对不起,迟到的回应 - 这绝对是正确的答案。谢谢!关于为什么这样工作的解释也很有帮助。 – bounty252

0

它可能是一个机器相关的定时问题(粘贴从剪贴板可以导致VBA代码之前的粘贴操作完成前面行驶)。尝试在PasteSpecial行之后立即调用此Delay子项。

Delay 1, True 

Public Sub Delay(Seconds As Single, Optional DoAppEvents As Boolean) 
    Dim TimeNow As Long 
    TimeNow = Timer 
    Do While Timer < TimeNow + Seconds 
    If DoAppEvents = True Then DoEvents 
    Loop 
End Sub 
+0

史蒂夫的答案直接解决了我的问题,但此延迟功能也是一个奇妙的想法。我遇到了一些代码在20%的时间内失败的问题,并解决了这个问题。 – bounty252

相关问题