2016-11-25 1 views
0

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 

答えて

0

非常に簡単なテストは、空のスライドにテキストボックスを追加して行いました。私は、次のプロパティを設定します。私は、その後、ウィンドウを最小化し、新しいプレゼンテーションを作成した(つまり、アクティブウィンドウとなるように)、次いでプログラムVBEを介して第一プレゼンテーション内の形状にテキストの長い文字列を追加

.TextFrame2.AutoSize = msoAutoSizeTextToFitShape ' Shrink text on overflow 
.TextFrame.WordWrap ' Wrap text in shape 

イミディエイトウィンドウ:

プレゼンテーション(1).Slides(1).Shapes(1).TextFrame.TextRange.Text = "Loremのイプサム嘆き、AMET consectetuerのadipiscingのELIT座るマエケナスporttitor congueマッサFusceのお問い合わせ今、マグナは、視床枕をsedの。超宗教、宗教、宗教、宗教、宗教、宗教、

WindowsのタスクバーにあるPowerPointのサムネイルの上にマウスを移動すると、すでにテキストサイズが縮小されていることがわかりました。だから、オートフィット機能は私のために働いているようだ。

UPDATE:

だから、PowerPointがする機会を得る前にPRESが閉じられているので、AutoSizeプロパティ機能を使用すると、(最小化または他の)可視ウィンドウを持つようにPRESを設定した場合でも適用されていないことが表示されますそれを更新する。

Set pres = Application.Presentations.Add(WithWindow:=msoFalse) 

私は、あなたの名前を付けて保存ラインにブレークポイントを設定します。私は、コードは、コードの1行を変更することにより、停止するまで、PowerPointがビューを更新していないという理論をテストしました。コードが中断されると、AutoSizeが機能することがわかります。自由に実行すると、AutoSizeは機能しません。私は可視ウィンドウでそれを実行し、最後の2行をコメントアウトして同じことが起こります。これは、コードが実行されている間にPowerPointがコンテンツをリフレッシュできない、またはコードが終了したときにウィンドウが表示されているように見えます。私はDoEventsとSleep(WinAPIを使用して)のあらゆる種類の組み合わせを試してみましたが、何も働いていませんでした。私はまた、スリープを使用すると、スライドにはウィンドウが表示されますが、コンテンツが表示されていないことに注意してください(ウィンドウがリフレッシュされる前にコードの実行が完了するまでPowerPointが待機しているかのように)。だから、ファイルを閉じる前にコードを完成させない限り、これはうまくいかないと思っています。

+0

素敵な実験!私が望むのは、生成されたファイルを(たとえ最小化されたとしても)PowerPointアプリケーションウィンドウに表示する必要はありませんが、それを静かに生成して初めてユーザーに表示されると、テキストはすでに自動的にフィットしています。上記の例のファイルリンクを追加して、現在私が得ていることを示しています。助けてくれてありがとう!最小化されたウィンドウを使用することは、おそらく別の回避策です。 – flutefreak7

+0

Doh。最初に私は自分自身に言っている質問を正しく読んだ(私は隠されたウィンドウの部分を逃した)。はい、今あなたの例で遊んで...すでに好奇心が強いと思われるものが見つかりました。すぐに報告してください。 –

関連する問題