显示PowerPoint幻灯片时刷新文本框

时间:2019-02-13 15:50:01

标签: sql-server vba powerpoint powerpoint-vba

我正在使用PowerPoint 2016进行Wallboard显示,我希望它从MSSQL-Server表中提取一个数字。我可以很容易地将SQL数据输入到Powerpoint中,但是我希望数据每天自动刷新并保持墙板连续运行。

我在幻灯片上有一个文本框,可从SQL VBA脚本中提取数据。有没有一种方法可以在演示文稿运行时每次显示幻灯片时自动运行脚本,或者每24小时运行一次脚本以刷新文本框?

1 个答案:

答案 0 :(得分:0)

这是一个棘手且有趣的问题,我承认这是解决方案的,但是缺少一部分。我在Powerpoint中没有做太多编程,所以这是一个挑战。当您打开VBE时,没有任何可用的模块,类或对象。这与Word和Excel完全不同。这意味着我们全靠自己...

我创建了一个演示文稿,其中包含五张幻灯片。在第三张幻灯片上,我插入了一些对象,看起来像这样:

enter image description here

对于VBA,我必须学习的第一件事是创建一个class module that will catch all of the events for the presentation。我非常简单的类称为EventClassModule,看起来像这样:

Option Explicit

Public WithEvents App As Application

Private Sub App_SlideShowNextSlide(ByVal Wn As SlideShowWindow)
    If Wn.View.CurrentShowPosition = 3 Then
        UpdateTheCount Wn.View.Slide
    End If
End Sub

因此,现在在常规模块中,您必须运行某些内容来创建并将此类初始化为全局对象。

Option Explicit

Dim eventClass As EventClassModule

Sub InitializeApp()
    Set eventClass = New EventClassModule
    Set eventClass.App = Application
End Sub

在测试中,我只是手动运行了InitializeApp过程来创建全局对象。 这是我解决方案的缺失部分...-我不知道如何自动运行此初始化来创建对象。也许是功能区按钮?

然后,在常规代码模块中,也是更新文本框的过程:

Public Sub UpdateTheCount(ByRef thisSlide As Slide)
    '--- loop through all the shapes to find the correct textbox,
    '    then update the value for display
    Const LABEL_TEXT As String = "Value to update:"
    Dim shp As Shape
    For Each shp In thisSlide.Shapes
        If shp.Type = msoTextBox Then
            Dim theText As String
            theText = shp.TextFrame.TextRange.Text
            If InStr(1, theText, LABEL_TEXT, vbTextCompare) = 1 Then
                Dim colonPos As Long
                Dim theValue As Long
                colonPos = InStr(1, theText, ":", vbTextCompare)
                theValue = CLng(Right$(theText, Len(theText) - colonPos))
                theValue = theValue + 1
                theText = LABEL_TEXT & " " & theValue
                shp.TextFrame.TextRange.Text = theText
            End If
        End If
    Next shp
End Sub

一旦代码到位并且手动运行了InitializeApp()子级,就可以开始幻灯片放映(并可能将其设置为从头开始循环播放)并逐步执行。文本框值将自动更新和增加。

我有兴趣学习如何从有经验的人那里自动将其开始。