###前提・実現したいこと
VBAでwordのshapeの大きさにあわせてtextのフォントサイズを変更する方法を実装したいですが、
何か方法が合ったりしますでしょうか。
変更したい対象:
shape in section.Headers(wdHeaderFooterFirstPage).range.ShapeRange
###試したこと
Shape.TextFrame.AutoSizeでフォントの大きさ似あわせてフレームのサイズを変更すること
が可能ですが、その逆を実現したい。
###補足情報
実行環境:office 2013,2016
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
AutoSizeを利用した方法をご紹介します。
手順は、
①元の幅・高さを取得する ②元のフォントサイズのままAutoSizeする ③AutoSize後の幅・高さにより処理を分岐 ③_A: AutoSizeにより元の幅・高さよりも小さくなった場合 ⇒フォントサイズを1つずつ上げていく ⇒元の幅・高さを超えない最大フォントまで繰り返す ③_B: AutoSizeにより幅・高さのどちらか一方でも大きくなった場合 ⇒フォントサイズを1つずつ下げていく ⇒元の幅・高さに収まるフォントサイズになるまで繰り返す
という流れです。
下記は少し長いですが上記手順をコード化したものです。
Sub test() 'AutoFontSize ThisDocument.Shapes(1) Dim shp As Shape For Each shp In ThisDocument.Sections(1).Headers(wdHeaderFooterFirstPage).Shapes 'Range.ShapeRange AutoFontSize shp Next End Sub Sub AutoFontSize(shp As Shape) Dim orgH As Double '元の高さ Dim orgW As Double '元の幅 Dim newH As Double 'AutoSize後の高さ Dim newW As Double 'AutoSize後の幅 Dim newSize As Double Dim addMode As Integer 'サイズ変更モード With shp 'シェイプの元のサイズを記憶 orgH = .Height orgW = .Width '元のフォントサイズのままAutoSize .TextFrame.AutoSize = True 'AutoSize後のサイズを取得 newH = .Height newW = .Width If (orgH >= newH) And (orgW >= newW) Then '幅も高さも小さくなった場合 addMode = 1 'フォントを大きくするモード Else '幅または高さが大きくなった場合 addMode = 2 'フォントを小さくするモード End If '現在のフォントサイズを格納 'newSize = .TextFrame2.TextRange.Font.Size shp.Select newSize = Int(Selection.Font.Size) Do 'サイズ変更 Select Case addMode Case 1 'フォントを上げるモード If newSize > 99 Then Exit Do Else 'フォントサイズを+1 '.TextFrame2.TextRange.Font.Size = .TextFrame2.TextRange.Font.Size + 1 .TextFrame.AutoSize = False Selection.Font.Size = Selection.Font.Size + 1 .TextFrame.AutoSize = True End If Case Else 'フォントを下げるモード If newSize < 2 Then Exit Do Else 'フォントサイズを-1 '.TextFrame2.TextRange.Font.Size = .TextFrame2.TextRange.Font.Size - 1 .TextFrame.AutoSize = False Selection.Font.Size = Selection.Font.Size - 1 .TextFrame.AutoSize = True End If End Select '変更後のフォントでAutoSize '.TextFrame.AutoSize 'AutoSize後のサイズを取得 newH = .Height newW = .Width Select Case addMode Case 1 'フォントを上げるモード If (orgH >= newH) And (orgW >= newW) Then '幅も高さも小さくなった場合、まだ小さい。⇒ループ継続 Else '大きくなりすぎた為、前回のフォントサイズが最適。⇒ループ終了 Exit Do End If Case Else 'フォントを下げるモード If (orgH >= newH) And (orgW >= newW) Then '幅も高さも小さくなった場合 '現在のフォントサイズが最適。⇒ループ終了 'newSize = .TextFrame2.TextRange.Font.Size newSize = Selection.Font.Size Exit Do Else '幅または高さが大きくなった場合、まだ大きい。⇒ループ継続 End If End Select '現在のフォントサイズを格納 'newSize = .TextFrame2.TextRange.Font.Size newSize = Selection.Font.Size Loop '最適フォントサイズを適用 .TextFrame.AutoSize = False ' .TextFrame2.TextRange.Font.Size = newSize Selection.Font.Size = newSize '元のサイズに戻す .Height = orgH .Width = orgW End With End Sub
投稿2016/09/08 07:21
編集2016/09/09 08:07総合スコア3020
0
完ぺきではないですが、こんな感じでどうでしょうか。
VBA
1With Shapes(1) 2 l = Len(.TextEffect.Text) 3 w = .Width - .TextFrame.MarginLeft - .TextFrame.MarginRight 4 h = .Height - .TextFrame.MarginTop - .TextFrame.MarginBottom 5 s = w / l 6 If s > h Then s = h 7 .TextEffect.FontSize = s 8End With
Word用
VBA
1For Each sh In Sections(1).Headers(wdHeaderFooterFirstPage).Shapes 2 sh.TextFrame.MarginLeft = 0 3 sh.TextFrame.MarginTop = 0 4 sh.TextFrame.MarginRight = 0 5 sh.TextFrame.MarginBottom = 0 6 l = Len(sh.TextFrame.TextRange.Text) - 1 7 w = sh.Width 8 h = sh.Height 9 s = w / l 10 If s > h Then s = h 11 sh.TextFrame.TextRange.Font.Size = s 12Next
投稿2016/09/08 05:31
編集2016/09/09 07:55総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
ご回答ありがとうございました。変更したい対象の説明が不足して申し訳ありません。質問内容を一部修正させていただきました。
変更したいのはword.shape in section.Headers(wdHeaderFooterFirstPage).range.ShapeRange
ご教示頂いた方法で試してみましたが、見た目上は何も変更が実施されていませんでした。
WordのVBAということですね。
手直してしてみましたが、Shapeの扱いがExcelほど柔軟じゃないのでかなり精度が落ちます。
あとrange.ShapeRangeを使うとうまく参照できなかったのでshapesに置き換えています。
ご教示頂いた方法で試してみたところ、
For Each sp In .Headers(wdHeaderFooterFirstPage).Shapes
str = sp.Name
If InStr(str, "PowerPlusWaterMarkObject") > 0 Then
sp.TextFrame.TextRange.Font.size = 100
End If
Next
sp.TextFrame.TextRange.Font.size = 100の行で、run-time error '5917' This object does not support attached text.のエラーに遭遇しました。
うーん、手元の環境がOffice2010なので挙動が違うのでしょうかね。
もしくはこちらが考えている図形の使い方をしていないか。
ちなみにsp.TextEffect.FontSizeのプロパティも変更して見たのですが、こちらはエラーはでないものの、何も効果がないように見えました。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/09 06:52
2016/09/09 07:50
2016/09/14 03:51
2016/09/14 12:52
2016/09/14 12:59
2016/09/16 01:46