我正在尝试使用vbscript将Excel工作簿的不同工作表中的某些图表(嵌入)复制到PowerPoint的不同幻灯片中。这样做时,我想保留excel工作表和powerpoint之间的链接,因此我使用了下面的代码来保持格式和链接(而不是简单的粘贴或PasteSpeical。还有其他方法吗?) :
For i = 1 to TotalNumWorkSheets 'I iterated with indices.
Set pptSlide = pptPres.Slides.Add(i, 11) 'There is one opening slide before this.
set ws = wb.Worksheets(i)
ws.ChartObjects(1).Chart.ChartArea.Copy
pptApp.CommandBars.ExecuteMso("PasteExcelChartSourceFormatting")
pptApp.CommandBars.ReleaseFocus
With pptSlide
.Shapes.Title.TextFrame.TextRange.Text = objCurSheet.Name
'Adding some more textboxes here. Working fine. Position checks out in PPT.
.Shapes(.Shapes.Count).Left = 20 'Doesn't work for all slides.
End With
Next
代码可以正常工作并复制所有图表,创建标题,按预期添加新文本,但是我无法将图表放置在单个幻灯片上,因为在执行ExecuteMso命令后,我不知道如何访问对图表。我读过一篇SO文章,使用此方法粘贴会松散图表选择,但您可以访问最后一个.Shapes对象,因为粘贴始终会将对象添加到列表的末尾。总是这样吗?我尝试通过访问最后一个对象来访问和定位图表,但它仅适用于循环的第一张幻灯片(即,粘贴的第一个图表移至Left = 20)。其他幻灯片中的其余所有图表均居中。有人可以解释在何处以及如何添加格式图表选项吗?我遇到了一个更奇怪的问题。如果我增加工作表的数量,那么即使第一个图也失去了它的Left格式。上面的代码是我添加格式的唯一地方,所以我不知道发生了什么。我确定我没有正确格式化它。
非常感谢您的建议。
编辑:我测试了另一件事。我在用 WScript.Sleep 500 For循环结束之前的代码,因为它为完成较早的操作提供了足够的时间(至少我从许多其他Google搜索中了解到这一点)。
答案 0 :(得分:0)
因此,在进行了更多搜索和测试之后,我找到了一个解决方案(至少就我的情况而言)。
- 将WScript.Sleep 1000(500对我不起作用)语句移到了CommandBars.ReleaseFocus下方。
现在有意义了,因为从Excel复制,粘贴和链接图表需要时间。尤其是源格式。在那之后,我相信只有文字生成不那么繁重。
- 不使用时清除所有设置的Object变量。尤其是与“ With”关键字相关的关键字。
set obj = CreateObject()
With obj
'Do something here.
End With
set obj = Nothing
显然,不清除它们也会阻止您关闭应用程序,即使您使用了.Close和.Quit方法也是如此。至少那是我观察到的。当没有打开任何内容时,我发现PowerPoint.exe在任务管理器中运行。
完成上述操作后,我可以使用格式复制图表,也可以设置图表的位置。大量工作表的怪异问题也消失了。希望它可以帮助其他人。如果有人认为观察结果不正确或有麻烦,请更正。