2015年2月5日 星期四

[VB] 透過 Macro (巨集) 亂數挑選句子 @ Microsoft Powerpoint / OpenOffice Impress

前幾天接到朋友的一個需求,我想了一會覺得應該不難,就下海摸索一下,使用情境如下:

活動中讓賓客可以跟一些世界名句拍照合影(例如七言絕句等),希望每個賓客都可以透過抽籤(亂數)機制跟不同句子拍照。

分析一下技術:
  • 亂數功能
  • 有一個文字區域,每次亂數得到的結果要更新在文字區
原本朋友是說用網頁也行,但我覺得活動場所要連網路好像有點危險(雖然純HTML+JS也能離線),於是乎還是來用用投影片模式 XD 方向:試試看巨集吧!

簡言之,以 Microsoft Office 2007 / OpenOffice Impress 為例,亂數用法:

Public Function chooseWords As String
Dim MyArray As Variant

REM *** Comment ***
MyArray = Array("懶人包", "天龍人", "卡卡獸", "給開司一罐啤酒", "完全沒有××", "數學老ㄙ常請假", "天大地大臺科大","雅量背影出師表")

REM *** Random ***
ArraySize = UBound(MyArray)
index = Int(Rnd * ArraySize ) + 1

REM *** Return
chooseWords = MyArray(index)
REM MSGBox(MyArray(index))
End Function


至於更換掉投影片內的文字框,以 OpenOffice Impress 為例,假定投影片只有第一張,且只有一個文字框:

Sub Main
Dim Doc As Object
Dim SlideList as Object
Dim Slide AS Object
Dim Target As Object

Doc = ThisComponent
SlideList = Doc.getDrawPages()
Slide = SlideList.getByIndex(0)
Target = Slide.getByIndex(0)
REM MSGBox(chooseWords())
Target.setString( chooseWords() )
End Sub


以 Microsoft Office 2007 - Powerpoint 為例:

Sub Main()
    For Each sld In ActivePresentation.Slides
        For Each sh In sld.Shapes
            Rem MsgBox sh.Type
            If sh.Type = msoPlaceholder Or sh.Type = msoTextBox Then
                sh.TextFrame.TextRange.Text = chooseWords()
            End If
        Next
    Next
End Sub


上述 Microsoft 文件比較豐富(至少對沒經驗的我來說比較快找到),發現可以判斷物件的型態( msoPlaceholder 和 msoTextBox )。

最後則是事件綁定,例如在什麼事件下,呼叫巨集(Macro: Main) ,在 Microsoft Office - PowerPoint 方面,發現在插入圖片後,點擊圖片時,可以替他增加"動作",這時就可以輕鬆綁定巨集,至於 OpenOffice Impress 的部分...由於需求解掉,就沒再繼續鑽了。

沒有留言:

張貼留言