【Word VBA】蛍光ペンの色を入れ替えるWordマクロ

2011年9月9日

一括置換翻訳の支援ソフト「ぱらぱら」のユーザーの方から、デフォルトで用意されている蛍光ペン以外の色を使いたいという要望をいただきました。

特定の蛍光ペンの色を別の色に変換するマクロをご紹介いたします。

このマクロでできること

蛍光ペンの特定の色を指定して、その蛍光ペンのみを別の特定の色に変換します。

ただし、連続して複数の蛍光ペンが付けられている場合で、さらに単独でスペースが着色されている場合には、その色を変換することができませんので、ご了承ください。

以下のようになります。

例として、赤い蛍光ペンを青い蛍光ペンに変えます。

(実行前)

(実行後)

このように、連続して複数の色の蛍光ペンが並ぶ場合で、単独の半角・全角スペースに着色された蛍光ペン(矢印で示した赤色部分)は変換できません。

 

さらに、この処理にはパソコンに負荷を与えますので、フリーズしたように見えますが、少し辛抱強くお待ちください。

またフリーズしたときのために、念のため文書を保存してからこのマクロを実行してください。

マクロの解説

赤と青以外にも様々な色で使えます。「特定の蛍光ペンを消すマクロ」でご紹介した色を使ってみてください。

なおこのマクロを作成にあたり、有益な情報をコメントしてくださる「イニシャルKさん」から多くのアドバイスをいただきました。

どうもありがとうございました。

マクロ


Sub Pen_Replace()
 '特定の蛍光ペンの色を別の蛍光ペンに変換
 Dim myRange As Range
 
 Set myRange = ActiveDocument.Range(0, 0)
   
 With myRange.Find
  .Forward = True
  .Text = ""
  .Wrap = wdFindStop
  .Format = True
  .Highlight = True
  Do While .Execute = True
   Do While myRange.HighlightColorIndex = wdUndefined
     myRange.MoveEnd Unit:=wdCharacter, Count:=-1
   Loop
   If myRange.HighlightColorIndex = wdRed Then
     myRange.HighlightColorIndex = wdBlue
   End If
   myRange.Collapse direction:=wdCollapseEnd
  Loop
 End With
 
 Set myRange = Nothing

End Sub

コメント

 

  • 4. Re:■■処理に時間がかかる場合のマクロに関して(続き)

    D*isukeさん

    お返事が遅くなりまして大変失礼いたしました。

    1週間ほど海外旅行に行っておりまして、昨日帰国いたしました。

    コメントおよびマクロコードも、どうもありがとうございます。

    早速いただいたコードを試してみました。

    これいいですね!

    実は、StatusBar プロパティのことを知ったのはごく最近なのですが、まだ使ったことがありませんでした。

    現在私が作成しているマクロは、このような待ち時間がかかるものがいくつかありますので、さっそく使わせていただきます。

    本当にどうもありがとうございました。

  • 3. ■■処理に時間がかかる場合のマクロに関して(続き)
    具体的には、このページのマクロであれば、
    下記のように書くことができます。Sub Pen_Replace()
    Dim myRange As Range
    Set myRange = ActiveDocument.Range(0, 0)
    Dim count As Integer
    count = 0 '動作していることを示すためのカウンタ(新たに追加)With myRange.Find
    .Forward = True
    .Text = ""
    .Wrap = wdFindStop
    .Format = True
    .Highlight = True
    Do While .Execute = True
    Do While myRange.HighlightColorIndex = wdUndefined
    myRange.MoveEnd Unit:=wdCharacter, Count:=-1
    '//============================================
    DoEvents
    count = count + 1
    Application.StatusBar = "処理実行中" & String(count Mod 5, ". ")
    '============================================//
    Loop
    If myRange.HighlightColorIndex = wdRed Then
    myRange.HighlightColorIndex = wdBlue
    End If
    myRange.Collapse direction:=wdCollapseEnd
    Loop
    End With
    End Sub今回のマクロに関しては、
    PCの性能や文章量によっては、ほとんど時間がかからず
    ここまでする必要性が薄いので、
    省略されたのかもしれませんが、
    気になったのでコメントさせて頂きました。ご参考までに。

    D*isuke 返信する
  • 2. ■処理に時間がかかる場合のマクロに関して(続き)
    解決方法としては
    "進行状況 VBA"などのキーワードでググれば色々出てきますが、
    比較的簡便なもの一例として、
    繰り返し行われる箇所に下記のコードを挟む方法があります。DoEvents
    Application.StatusBar = "処理実行中..."
    '表示する文字列は動的に書き換わる(動いていることがわかる)ように適宜調整
    D*isuke 返信する
  • 1. 処理に時間がかかる場合のマクロに関して
    はじめまして。
    趣味でプログラムを書いているD*isukeと申します。
    上田様のサンプルコードはたびたび参考にさせて頂いています。さて、
    不躾なコメントで失礼かとは存じますが、マクロで時間のかかる処理を行う場合は、
    > フリーズしたように見えますが、少し辛抱強くお待ちください。
    と書くのではなく、
    処理中である旨をマクロ側で表示した方がいいと思います。ユーザーからすると、
    ・PCが本当にフリーズしているのか
    (※ 処理が無限ループに陥っている場合を含む)
    ・まだマクロの処理が続いているのか
    は、通常 "判別できない"ため、
    画面が長時間固まった場合は、
    ユーザーからフリーズしたと判断され易く
    ユーザーを不安にさせることがあるのに加え上記コメントは実質的に
    「フリーズしたように見えることもある一方、
    実際にフリーズしていることもあります。」
    と書いているに過ぎず、
    ユーザーからすれば、この2つの状態を判別できない以上、
    さほど意味があるとはいえないのではないかと思います。

    このため、
    比較的処理に時間がかかることが分かっている場合は、
    たとえテストコードであっても、
    「マクロの処理状況が見えないうえに、Wordの画面が操作不可能になる」
    という状況は避ける方がよいかと思います。

    (その方が、ユーザーにとって親切というだけでなく、
    コードを書く/デバッグする際にも
    マクロの実行状況を把握でき便利かと思います。)

    D*isuke

関連記事

-コード
-, ,