PowerPointプレゼンテーションとしてレポートを自動的に生成しようとしています。現在うまく機能していない機能は、テキストが図形の境界をオーバーフローするときに発生するPowerPointの自動テキスト自動フィッティングです。アプリケーションウィンドウを表示せずにPowerPointテキストの自動調整の動作を
テキストが図形(デフォルト)に適合するように図形が設定されている場合、図形内のすべてのテキストのフォントサイズは、テキストが追加されると自動的に縮小されます。この動作は、アプリケーションが表示されているときにのみ有効になります。これは、実際にテキストをレンダリングする行為が、オーバーフローが発生したことをPowerPointに通知し、フォントダウンサイズがトリガーされるためです。
アプリケーションウィンドウを非表示にしてプレゼンテーションを行うと、この自動フィッティングは発生しません。プレゼンテーションを開き、テキストボックスを変更すると、フォントが縮小します。スライドを隠してから再度表示すると、フォントも正常に更新されます。プレゼンテーションが表示されていない間にVBAからこれらの同じ操作を実行しても、フォントサイズの更新は実行されません。
誰でも、アプリケーションのウィンドウを表示せずにPowerPointのフォントの自動調整動作をトリガーする方法を知っていますか?
Sub new_presentation()
Dim pres As Presentation
Dim sl As Slide
Dim textbox As Shape
Dim tf As TextFrame
Dim tr As TextRange
Set pres = Application.Presentations.Add(WithWindow:=msoFalse)
' For Each Layout In pres.SlideMaster.CustomLayouts
' Debug.Print Layout.Name
' Next
Set sl = pres.Slides.AddSlide(1, pres.SlideMaster.CustomLayouts.Item(2))
Set textbox = sl.Shapes.Placeholders(2)
Set tf = textbox.TextFrame
Set tr = tf.TextRange
tr.Text = "Some text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text"
pres.SaveAs FileName:="D:\Documents\Python\powerpoint\vba_demo.pptx"
pres.Close
End Sub
はそれを動作させるためにあなたのシステム上で有効なフォルダを名前を付けて保存するファイル名を更新することを忘れないでください:
は、次のような問題を実証するための最小限の例です。
私はWindows 7でPowerPoint 2013を使用しています。この動作は他のバージョンにも存在する可能性があります。
私は実際にpython-pptxとCOMの組み合わせを使ってPythonでこれをやっていますが、VBAの例は同じ動作をします。この例は、他のプログラミングのものよりも遊びやすい言語。
EDIT: PowerPointアプリケーションウィンドウを表示せずに生成されたファイルへのリンクです。テキストを編集したり、スライドを隠したり、スライドを追加したりすると、強制的に自動フィットの動作がトリガーされます。 Example File
ここには、自動生成ファイルを作成したマクロを含むPowerPointファイルがあります。 Macro File
テキストを手動で拡大縮小するための回避策として以下に使用されているコードはコメントアウトされています。
EDIT: 次のコードでは、テキストが収まるまでフォントサイズを縮小しています。これは手書きの自動フィットです。私はいくつかのインデントレベルを追加して、異なるフォントサイズのレベルがすべて相対的なスケーリングであることを確認しました。私はまだPowerPointの自動作成にはそれができるようにする方法があるかどうかを知りたいので、質問を開いたままにしておきます。
Sub new_presentation()
Dim pres As Presentation
Dim sl As Slide
Dim textbox As Shape
Dim tf As TextFrame
Dim tr As TextRange
Set pres = Application.Presentations.Add(WithWindow:=msoFalse)
' For Each Layout In pres.SlideMaster.CustomLayouts
' Debug.Print Layout.Name
' Next
Set sl = pres.Slides.AddSlide(1, pres.SlideMaster.CustomLayouts.Item(2))
Set textbox = sl.Shapes.Placeholders(2)
Set tf = textbox.TextFrame
Set tr = tf.TextRange
tr.Text = "Row 1" & vbCrLf & _
"Row 2" & vbCrLf & _
"Row 3" & vbCrLf & _
"Row 4" & vbCrLf & _
"Row 5" & vbCrLf & _
"Row 6" & vbCrLf & _
"Row 7" & vbCrLf & _
"Row 8" & vbCrLf & _
"Row 9" & vbCrLf & _
"Row 10" & vbCrLf & _
"Row 11" & vbCrLf & _
"Row 12" & vbCrLf & _
"Row 13" & vbCrLf & _
"Row 14"
' Indent some rows out to levels 2 and 3
tr.Paragraphs(2, 1).IndentLevel = 2
tr.Paragraphs(3, 3).IndentLevel = 3
tr.Paragraphs(6, 1).IndentLevel = 2
tr.Paragraphs(7, 3).IndentLevel = 3
tr.Paragraphs(10, 1).IndentLevel = 2
tr.Paragraphs(11, 3).IndentLevel = 3
' Get the max height for the text to fit in the box...
h_max = textbox.Height - tf.MarginTop - tf.MarginBottom
overflow = tr.BoundHeight - h_max
iLoop = 0
While overflow > 0 And iLoop < 20
prev_overflow = overflow
For i = 1 To tr.Paragraphs.Count
Set p = tr.Paragraphs(i, 1)
before = p.Font.Size
after = Round(before * 0.9, 0)
p.Font.Size = after
Next
overflow = tr.BoundHeight - h_max
iLoop = iLoop + 1
Debug.Print "Iteration: " & iLoop & " Overflow: " & overflow
Wend
pres.SaveAs FileName:="D:\Documents\Python\powerpoint\vba_demo.pptx"
pres.Close
End Sub
素敵な実験!私が望むのは、生成されたファイルを(たとえ最小化されたとしても)PowerPointアプリケーションウィンドウに表示する必要はありませんが、それを静かに生成して初めてユーザーに表示されると、テキストはすでに自動的にフィットしています。上記の例のファイルリンクを追加して、現在私が得ていることを示しています。助けてくれてありがとう!最小化されたウィンドウを使用することは、おそらく別の回避策です。 – flutefreak7
Doh。最初に私は自分自身に言っている質問を正しく読んだ(私は隠されたウィンドウの部分を逃した)。はい、今あなたの例で遊んで...すでに好奇心が強いと思われるものが見つかりました。すぐに報告してください。 –