Word VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


208 / 308 ツリー ←次へ | 前へ→

【323】複数の見出しの設定 tootsie 05/8/16(火) 13:25 質問[未読]
【324】Re:複数の見出しの設定 H. C. Shinopy 05/8/16(火) 22:32 回答[未読]
【325】Re:複数の見出しの設定 tootsie 05/8/17(水) 16:15 お礼[未読]

【323】複数の見出しの設定
質問  tootsie  - 05/8/16(火) 13:25 -

引用なし
パスワード
   ようやく猛暑も一段落している今日この頃です。
いつもお世話になります。

さっそくですが、以下のようなワードのマクロを作成するにはどのようにしたらよいでしょうか。

「◎」を検索し、その行に「見出し1」を設定する。(◎は文書中複数存在する)

以下のように、「マクロの記録」と「loop」を使って作ってみましたが、◎を検索したところで、作業が終わってしまいます。つらつら思うに、◎は見出し設定後も常に存在しつづけるので、true or faulse で判断するやり方ではだめでしょうか。

よい方法があればご指導ください。
よろしくお願いします。


以下、試しに作成したマクロ

Sub マクロ試作()

ここは蛇足です。

  'EEEEを削除する
  Dim tf As Boolean 'ブール型
  Selection.HomeKey Unit:=wdStory
  Selection.Find.ClearFormatting
  With Selection.Find
    .Text = "EEEE"
    .Replacement.Text = "^x"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = True
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = False
    .MatchFuzzy = False
  '繰り返すのはここから
   tf = .Execute '検索実行:成功したらTRUE
   Do While tf = True 'tf = True 間、Do〜Loop間を繰り返す
  Selection.MoveDown Unit:=wdLine, Count:=2, Extend:=wdExtend
  Selection.EndKey Unit:=wdLine, Extend:=wdExtend
  Selection.Delete Unit:=wdCharacter, Count:=1
  '次を実行
      tf = .Execute
     Loop
    '========================
  End With
 
  '[BoxNo]を削除する
  Selection.HomeKey Unit:=wdStory
  Selection.Find.ClearFormatting
  With Selection.Find
    .Text = "[BoxNo]"
    .Replacement.Text = "^x"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchFuzzy = False
    .MatchWildcards = True
  '繰り返すのはここから
   tf = .Execute '検索実行:成功したらTRUE
   Do While tf = True 'tf = True 間、Do〜Loop間を繰り返す
  Selection.HomeKey Unit:=wdLine
  Selection.MoveDown Unit:=wdLine, Count:=5, Extend:=wdExtend
  Selection.Delete Unit:=wdCharacter, Count:=1
  '次を実行
      tf = .Execute
     Loop
    '========================
  End With

ここからが見出しの設定です。

  '見出し1を設定する
  Selection.HomeKey Unit:=wdStory
  Selection.Find.ClearFormatting
  With Selection.Find
    .Text = "◎"
    .Replacement.Text = "^x"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchFuzzy = False
    .MatchWildcards = True
'繰り返すのはここから
   tf = .Execute '検索実行:成功したらTRUE
   Do While tf = True 'tf = True 間、Do〜Loop間を繰り返す
  Selection.Style = ActiveDocument.Styles("見出し 1")
    '次を実行
      tf = .Execute
     Loop
    '========================
   End With
End Sub

【324】Re:複数の見出しの設定
回答  H. C. Shinopy  - 05/8/16(火) 22:32 -

引用なし
パスワード
   残暑お見舞い申し上げます。

まず、マクロ処理の前提として、
文書の先頭から末尾まで検索したらそれで処理を終わること、
「◎」が行の先頭・途中・末尾のどこかにあるということにします。

マクロの記録では、「.Wrap = wdFindContinue」となり、
検索・置換の内容によっては、処理が無限ループに陥ります。
これが、tootsieさんを困惑させている原因です。

ヘルプで「Wrap」を調べると、次のような説明が表示されます。
wdFindAsk 選択範囲または指定範囲を検索し、
 文書の残りの部分も検索するかどうかをたずねるメッセージを表示します。
wdFindContinue 検索範囲の先頭または末尾まで検索し、さらに検索を続けます。
wdFindStop 検索範囲の先頭または末尾まで検索したら、検索を終了します。

「.Wrap = wdFindStop」を指定すれば、文書の末尾まで検索すると、
Do〜Loop内の「If Not .Found Then Exit Do」で
処理を終わらせることができます。

Sub myStyle1()
 ' 文書の先頭から末尾まで「◎」を検索する。
 ' 見出し1を設定する。
 Selection.HomeKey Unit:=wdStory
 Selection.Find.ClearFormatting
 '
 With Selection.Find
  .Text = "◎"
  .Forward = True
  .Wrap = wdFindStop ' wdContinueではなく…
  .MatchAllWordForms = False
  .MatchSoundsLike = False
  .MatchFuzzy = False
  .MatchWildcards = False
  Do
   .Execute
   If Not .Found Then Exit Do
   '
   Selection.HomeKey Unit:=wdLine, Extend:=wdMove
   Selection.MoveDown Unit:=wdLine, Extend:=wdExtend
   '
   Selection.Style = ActiveDocument.Styles("見出し 1")
   Selection.Collapse wdCollapseEnd
  Loop
 End With
End Sub


また、ヘルプでStyleを調べてみたら、
次のような例が出てきました。御参考までに。

Sub myStyle2()
 ' 次の使用例は、
 ' 作業中の文書の "第 " という語から始まる各段落に
 ' [見出し 1] スタイルを適用します。
 '
 For Each para In ActiveDocument.Paragraphs
  If para.Range.Words(1).Text = "第 " Then
    para.Style = ActiveDocument.Styles(wdStyleHeading1)
  End If
 Next para
End Sub

【325】Re:複数の見出しの設定
お礼  tootsie  - 05/8/17(水) 16:15 -

引用なし
パスワード
   早速のご教示ありがとうございました。
快適かつスマートに機能してくれています。

今回、ワードでマクロの「ヘルプ機能」を使えるようにしたので(いままでリムーバルディスクからダウンロードされておらず使用できませんでした)理解の助けになります。
ただ、専門用語が多く、技術的な基礎知識がないので難解です。コンピュータ・プログラムの門外漢でも簡単にマクロを組める仕組みがあれば、労働集約的作業から解放されるオフィスワーカーも少なくないのではないかしらん、と想像したりします。

まずは略儀ながらお礼申し上げます。

208 / 308 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
207140
(SS)C-BOARD v3.8 is Free