Powerpoint VBA ActiveXリストボックスの制御
知らない機能,あんまり使ったことない機能として,ActiveXコントロールはあんまり使ったことないなぁと今日職場で思いました。
その時は,パワーポイントでActiveXコントロールをVBAで挿入したいと思い,Excelの記録マクロでは簡単だなーと確認できたので,パワーポイントで同じことをやろうとすると,無い。。
見た目はそっくりなのに違うところがたくさんあるExcel VBAとPowerpoint VBA。
なぜそうなった。。。。共通仕様にしてくれればいいのに。
まぁ,VBAで挿入からやることはとりあえずあきらめて,どんなことができるかな,と軽く試しました。
今日はリストボックスです。
オブジェクトへのアクセスの仕方も通常のShapeとはけっこう違いますし,パワーポイントVBA始めたての時理解できず悩んだことを思い出します。
とても簡単なものを用意しました。
パワーポイントでは,イベントが最初からは動きませんので,スタートになんらかのアクションが必要になります。
ここでは,リストボックスに値を設定するボタンをスタートトリガーとして考えます。
オブジェクトの名前が見てもらえると思いますが,
SetItems Buttonというのに,標準モジュールの SetItems を関連付けます。
ListBox1というのがActiveXのリストボックスです。
NormalTextBoxというのは,通常の図形のテキストボックスです。
ExcelのActiveXリストボックスなら,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と書いていますが,これを書かないと実行するたびに値が増え続けます。
セットする前に一度リセットしているわけです。
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``