【问题标题】:Occasional VBA Method 'Activate' of object 'ChartData' failed对象“ChartData”的偶尔 VBA 方法“激活”失败
【发布时间】: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


【解决方案1】:

Excel 和 PowerPoint 由两个不同的开发团队创建。

PowerPoint.ChartExcel.Chart

不同

是的,它们看起来一样,您会认为您对它们的属性具有相同级别的访问权限,但那是您错的地方。 PowerPoint 版本非常有限。

无论如何,据我所知,你在声明时出错了

Dim trpChartData As ChartData

代替

Dim trpChartData As PowerPoint.ChartData

正如雷切尔指出的,

trpChartData 声明时没有库限定符,因此默认为 Excel.ChartData

除此之外,您从未使用

清除 trpChartData
Set trpChartData = Nothing

我也看不到你在哪里.Quit 必须创建的Chart.Workbook 的 Excel 应用程序。这可以解释为什么之后在任务管理器中打开了 Excel 版本。试试添加这个...

Dim xlApp as Excel.Application
'
'
Set xlApp = .Chart.ChartData.Workbook.Application
'
'
xlApp.Quit
Set xlApp = Nothing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2015-07-17
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多