【发布时间】:2015-12-15 17:21:13
【问题描述】:
在我开始之前,这里有一些历史:
在 Excel 中创建 VBA 以打开和读取三 (3) 个 Excel 文件(包括其自身),并将数据输入到图表/表格/图形中并输入到 PowerPoint 演示文稿中。 此版本运行良好。 VBA 由用户表单启动
修改代码以适应传递给我的要求。在一张特定幻灯片中加载图表时,这会导致对象“ChartData”的 VBA 方法“激活”错误。此数据是从启动 VBA 的工作表中传输的。
我无法稳定地重新创建此错误,直到我开始保存在询问时启动脚本的 Excel 文件。现在我可以了。
PowerPoint 演示文稿中没有 VBA。
测试此功能的用户第一次遇到此错误。我不。但是,我会在运行成功或不成功后保存 Excel 书后进行进一步的迭代。
发生错误时我注意到的屏幕行为:
仅在我保存启动该过程的 Excel 并在尝试重新创建错误时再次测试该过程后才会发生。
当 VBA 在后台运行时,PowerPoint 演示文稿成为“激活”应用程序
发生在同一张幻灯片和图表上(是的,在 PowerPoint 中使用对象标签)。
当发生错误并且我破坏了代码时,我无法使用“文件”菜单关闭 PowerPoint 或 Excel。我必须使用右上角的“红色 X”来关闭。功能区和选项卡也无法使用(不对单击事件做出反应)。微软确实要求保存选项。
我尝试过的:
- 遍历代码并在对象打开后显式关闭它们,这不是必需的。
- 改变 ScreenUpdating 等应用进程的位置
这是它跳闸的函数。它在 trpChartData.Activate 处跳闸,用于特定图形(即 shapeName):
Function insGraphInfo(ByVal numOfSlide As Integer, ByVal shapeName As String, ByVal cellToMod As String, ByVal valToIns As Variant) As Variant
'Inserts data into a CHART TYPE graph
On Error GoTo ERR_INS_GRAPH
Dim trpChart As PowerPoint.Chart
Dim trpChartData As ChartData
Dim trpWkBk As Excel.Workbook
Dim trpChartSheet As Excel.Worksheet
Dim errString As String
Set oPPTSlide = oPPTFile.Slides(numOfSlide)
With oPPTSlide
.Select
End With
Set oPPTShape = oPPTFile.Slides(numOfSlide).Shapes(shapeName)
Set trpChart = oPPTShape.Chart
Set trpChartData = trpChart.ChartData
Debug.Print "Activating: " & shapeName & " in slide number: " & numOfSlide
errString = "Activating: " & shapeName & " in slide number: " & numOfSlide
trpChartData.Activate
Debug.Print shapeName & " activated."
errString = shapeName & " activated."
errString = "Setting Workbook and Worksheet Objects"
Set trpWkBk = trpChartData.Workbook
Set trpChartSheet = trpWkBk.Worksheets(1)
errString = "Inserting Value into appropriate cell)"
With trpChartSheet
.Range(cellToMod).Value = valToIns
End With
insGraphInfo = valToIns
errString = "Refreshing Chart."
With oPPTShape 'Refreshes
.Chart.ChartData.Activate
.Chart.ChartData.Workbook.Close
.Chart.Refresh
End With
Set trpWkBk = Nothing
Set oPPTSlide = Nothing
Set oPPTShape = Nothing
Exit Function
ERR_INS_GRAPH:
MsgBox "An error occurred while: " & errString
Resume Next
End Function
【问题讨论】:
-
这个问题可能是因为函数不应该进行方法调用或改变环境,所以对
.Activate、.Workbook.Close等的调用会引入不稳定。请参阅this 和支持knowledge base article。 -
@xidgel 来自 KB,当工作表单元格中的公式调用时,用户定义的函数无法执行更改 Microsoft Excel 环境的操作。 通常,UDF 可以操作从 VBA 子例程调用时的工作表对象。
-
@DavidZemens 我同意您可以操作工作表对象。通过更改对象属性进行操作很好。通过调用对象方法进行操作 --- 请参阅知识库文章。
-
trpChartData 声明时没有库限定符,因此默认为 Excel.ChartData。尝试将声明更改为“Dim trpChartData As PowerPoint.ChartData”。
-
@RachelHettinger 谢谢,我会试试的。在另一个注意事项上,我继续插入一个变量来将值分配给所需的范围(注意,这个函数在整个模块中被调用)希望这会增加稳定性。我不再遇到 ChartData 错误,但是,经过几次运行(特别是超过 10 次)后,我遇到了无法关闭 Excel 的问题,除非我右键单击 Windows 菜单栏并关闭。我将明确地进行库声明,看看它是如何进行的。
标签: vba excel powerpoint