インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

Powerpoint VBA ActiveXリストボックスの制御

知らない機能,あんまり使ったことない機能として,ActiveXコントロールはあんまり使ったことないなぁと今日職場で思いました。

その時は,パワーポイントでActiveXコントロールVBAで挿入したいと思い,Excelの記録マクロでは簡単だなーと確認できたので,パワーポイントで同じことをやろうとすると,無い。。

見た目はそっくりなのに違うところがたくさんあるExcel VBAPowerpoint VBA

なぜそうなった。。。。共通仕様にしてくれればいいのに。

まぁ,VBAで挿入からやることはとりあえずあきらめて,どんなことができるかな,と軽く試しました。

今日はリストボックスです。

オブジェクトへのアクセスの仕方も通常のShapeとはけっこう違いますし,パワーポイントVBA始めたての時理解できず悩んだことを思い出します。


f:id:chemiphys:20170228212649p:plain

とても簡単なものを用意しました。
f:id:chemiphys:20170228215148g:plain
パワーポイントでは,イベントが最初からは動きませんので,スタートになんらかのアクションが必要になります。

ここでは,リストボックスに値を設定するボタンをスタートトリガーとして考えます。

オブジェクトの名前が見てもらえると思いますが,

SetItems Buttonというのに,標準モジュールの SetItems を関連付けます。
ListBox1というのがActiveXのリストボックスです。
NormalTextBoxというのは,通常の図形のテキストボックスです。

ExcelActiveXリストボックスなら,LinkedCellやListFillRangeというプロパティがあるので,マクロなんかなくても最低限の動きはしてくれます。

ですが,パワーポイントではそんな便利なプロパティは無いので,値を設定してあげることからやらないといけません。

標準モジュール

Option Explicit

Sub SetItems()
    Slide1.ListBox1.Clear
    
    Dim Items As String: Items = "str1,str2,str3,str4,str5"
    
    Dim i As Long
    For i = 0 To UBound(Split(Items, ","))
        Slide1.ListBox1.AddItem Split(Items, ",")(i)
    Next

End Sub

Sub ClearItems()

    Slide1.ListBox1.Clear
    
End Sub

SetItemsでリストに値を入れます。私はSplit関数が大好きなので,Split関数で,区切りの値リストから値をセットする,ということをしています。

ClearItemsというほうでは,値を明示的に消したいときにできるようにしています。

また,SetItemsの最初のほうでもListBox1.Clearと書いていますが,これを書かないと実行するたびに値が増え続けます。
セットする前に一度リセットしているわけです。
f:id:chemiphys:20170228214158p:plain
ActiveXコントロールを挿入すると,ExcelにおけるSheet1などのようなオブジェクトがプロジェクトエクスプローラーに現れます。

ActiveXはイベントを持っていますので,そこにマクロを書きこむんです。

Private Sub ListBox1_Click()
    Slide1.Shapes("NormalTextBox").TextFrame.TextRange.Text = ListBox1.Value
End Sub

オブジェクトへのアクセスの仕方の違いを示すために,上記のようなコードをListBox1のクリックイベントに書きました。

オブジェクトとしてSlide1が出ているときは,いつもの TargetSlideがどうのこうのというのは不要で Slide1 で指定できます。
そして,ListBox1へのアクセスは Slide1の中では単にListBox1 と指定できるのに対し,
標準モジュールでは Slide1.ListBox1 と指定します。書く場所によってそのオブジェクトまで到達する方法が異なるんですね。

ActiveXのリストボックスの値は
   ListBox1.Value
と簡単にアクセスできるのに対して,通常のテキストボックスには
   Slide1.Shapes("NormalTextBox").TextFrame.TextRange.Text
こんなに深いところまでアクセスしないと目的のテキストにはたどり着きません。

でも,このあたりの扱いに慣れてくると,パワーポイントのVBAも結局ExcelやWordと変わらずに扱えるようになるので,

簡単なものから試してみるのが大事ですね。。

ActiveXコントロールに関しては ほぼ触れずに来たので,しばらくいじってみて,簡単に載せていこうと思います。

ちょっと今はネタ切れなので軽めに・・・(;´▽`A``