0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

要約

PowerPointのVBAマクロに音声データを埋め込もうとしたら、容量制限でできなかった。

動機

VBAマクロで外部の音声ファイルを再生するPowerPointアドイン(マクロを含むプレゼンテーションだけではなく、そのPCのPowerPointで開くすべてのプレゼンテーションに反映されるタイプ)を作成したが、音声ファイルのデータをマクロのソースに埋め込んだら他のPCへ移転する時に管理するファイルが2つから1つだけに減るので扱いやすくなるのではと思った。

方法

調べてみるとBase64エンコードすればできるはずと出たので、音声ファイルをBase64エンコードしてVBAマクロへの埋め込みを試みた。

結果

コードを書くことはできるのだが、保存の際にエラーが出て書き込めないという事態になった。エラーメッセージに記載される原因が「空文字列」になるケースが多かったが、コードの分量を減らせば保存できるようになることから、容量制限が原因であると考えられる。

以下に各種制限を挙げていく。

1行の文字数制限

1行の最大文字数に1023文字という制限がある。音声データファイルのBase64エンコードは当然1023文字には収まらない。ただ、この制限には継行文字_を使うと次の行と結合できるという抜け道がある。

結合回数の制限

継行文字には24個までという制限があり、前述の方法でも「行継続文字を使いすぎています」という指摘を受ける。

AIに聞いたら「配列に分割して結合する方法」を提案された。

モジュールの容量制限

ところが、実際には1000くらいの要素を持つ配列を書いて保存しようとすると、原因を明示されないエラーが出る。要素数を10くらいまで絞らないと保存できるようにならないことから、やはり制限にひっかかるようだ。

調べると、1つのモジュールに記述できるコードは約64KB(テキストの文字数で約3万文字〜6万文字)が上限と出てきた。定義した配列は1要素が1000文字以下のASCII文字列なので、2万字いっていないはずなのだが、他にもStaticデータが64kB以下という制限もあるので、そちらにひっかかっているのかもしれない。

全体の容量制限

それなら、「文字列の配列に分割して結合」した文字列を複数のモジュールで定義し、最後にそれを一括して結合すればとおもい、分割とマクロ登録するスクリプトまで書いて登録しようとしたが、結局2つ目のモジュールが登録できなかった。

Staticデータが64kB以下はモジュールに対すると言われたが、実際はプロジェクト全体での制限のように思える。

考察

Staticデータではないデータにする方法もあるかもしれないが、ファイルを2つ管理した方がまだましだと判断して、断念することにした。

.ppamファイル内のスライドに隠し図形として埋め込む方法を提案されたが、他のスライドを開いたときの動作が予想できず、煩雑すぎるので試さなかった。

更新履歴

日付降順。表現の修正などは除く。

  • 2026/7/13: 公開
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?