自动化Powerpoint宏

时间:2015-09-08 23:13:41

标签: vba powerpoint powerpoint-vba office-addins

我有一个PowerPoint演示文稿,通​​过附加到它的VBA脚本填充图片。我想自动打开演示文稿并运行宏。以下是我的尝试:

  • 将脚本转换为加载项,如图所示here:当我点击激活它时它会运行,但是当我只是打开powerpoint时它就不会运行。
  • 下载了一个预先构建的插件,并调用了我的脚本sub auto_open()。这很有用,但是因为它是一个启用宏的文件(?),但我必须打开powerpoint并在打开文件之前启用add,因此它不比仅运行宏更自动
  • 通过MatLab运行PowerPoint。我使用了以下命令here,它打开了powerpoint,以及我感兴趣的文件。

    • g = actxserver('PowerPoint.Application');
    • Presentation = invoke(g.Presentations,'Open','\\path\Automatic_NEdN_Template2.pptm')
    • a = invoke(Presentation.Application,'Run','Auto_Open',[])

    对于小测试用例,它甚至似乎工作 - 我可以调用一个从文件中读取数据的vba函数,它会将数据返回给matlab,但是当我试图调用制作图片的那个时,它返回NaN和PowerPoint没有填写。

理想情况下,我想双击某些内容,然后打开PowerPoint,然后运行我的脚本。

以下是一些代码段,如果他们有帮助的话:

    Function read_in_data_from_txt_file(strFileName As String) As String()

    Dim dataArray() As String
    Dim i As Integer

    'Const strFileName As String = "C:\H5_Samples\Plots\WeeklyPlots\zz_avgTemp.txt"
    Open strFileName For Input As #1

     ' -------- read from txt file to dataArrayay -------- '

     i = 0
     Do Until EOF(1)
        ReDim Preserve dataArray(i)
        Line Input #1, dataArray(i)
        i = i + 1
     Loop
     Close #1

    read_in_data_from_txt_file = dataArray
    End Function

以下是图片的代码:

   Function Auto_Open() As String  

   Dim oSlide As Slide
   Dim oPicture As Shape
   Dim oText As Variant
   Dim heightScaleFactor As Single
   Dim widthScaleFactor As Single
   Dim width As Single
   heightScaleFactor = 2.1
   widthScaleFactor = 2.1
   width = 205
   Height = 360

   ActiveWindow.View.GotoSlide 2

    Set oSlide = ActiveWindow.Presentation.Slides(2)

    Set oPicture = oSlide.Shapes.AddPicture("C:\H5_Samples\Plots\WeeklyPlots\Nominal DS Real spectra.png", _
        msoFalse, msoTrue, 1, 150, Height, width)


    Set oPicture = oSlide.Shapes.AddPicture("C:\H5_Samples\Plots\WeeklyPlots\Nominal DS Imaginary spectra.png", _
        msoFalse, msoTrue, 350, 150, Height, width)

    'Full Resolution
    ActiveWindow.View.GotoSlide 3

    Set oSlide = ActiveWindow.Presentation.Slides(3)

    Set oPicture = oSlide.Shapes.AddPicture("C:\H5_Samples\Plots\WeeklyPlots\Full Resolution DS Real spectra.png", _
        msoFalse, msoTrue, 1, 150, Height, width)


    Set oPicture = oSlide.Shapes.AddPicture("C:\H5_Samples\Plots\WeeklyPlots\Full Resolution DS Imaginary spectra.png", _
        msoFalse, msoTrue, 350, 150, Height, width)
    End Function

1 个答案:

答案 0 :(得分:1)

有两种方法可以实现:

  1. 具有应用程序级事件处理程序的加载项。然后,您可以利用应用程序类PresentationOpen事件,将文件名与要操作的已知文件进行比较,然后仅在打开正确文件时运行宏。有关创建应用程序级事件处理程序类的一些信息,请参阅this MSDN link

  2. 使用功能区XML框架从功能区的OnLoad事件中调用过程。

  3. 第二种方法基本上是自包含的,而前一种方法需要至少一个额外的外接程序文件来控制该过程。

    第二种方法将使用类似于以下内容的VBA:

    Option Explicit
    Public Rib As IRibbonUI
    
    'Callback for customUI.onLoad
    Sub RibbonOnLoad(ribbon As IRibbonUI)
        Set Rib = ribbon
        Call Auto_Open()  '### I would recommend changing your procedure name just to avoid confusion...
    End Sub
    Sub Auto_Open()
        '### This is your procedure/macro that you want to run
        ' etc
        ' etc
    
    End Sub
    

    你需要功能区XML(使用CustomUI editor来插入它,否则可以这样做,但这可能是最简单的):

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
       <customUI onLoad="RibbonOnLoad" xmlns="http://schemas.microsoft.com/office/2009/07/customui">
       </customUI>
    

    这种方式的工作方式是,当文件打开时,调用RibbonOnLoad过程,然后该过程调用执行宏代码的过程。请注意unhandled run-time errors may cause the loss of the ribbon object variable在较大的应用程序中可能是灾难性的,但在您的特定用例中,这不应该是一个问题,因为从磁盘重新打开文件将始终重新加载功能区。

    This link还有关于功能区自定义基础知识的更多信息,但出于您的目的,我认为上面的代码是您应该需要的。