【Word VBA】カーソル位置の文頭文字の大・小文字を切り替えるWordマクロ(その2)

2015年3月12日

以前の記事「カーソル位置の文頭文字の大・小文字を切り替えるWordマクロ」では、文中にピリオドを含む単語(FIG.など)があると、Wordが文末だと勘違いしてしまう不具合がありました。

作り込むのは面倒なので、まあしょうがないなと思ってそのままにしておいたのです。

ところが、先日の勉強会の参加者からいろいろ工夫をされていることを伺いまして、それをヒントに私もマクロを作ってみました。

やっぱり、出かけて行って情報交換って大切ですね。

ちなみに、その方にこのマクロを差し上げたときにいただいたお返事が粋でした。

ショートカットキーが一つ空いた」ことへの感謝の言葉だったのです(笑)。

この方はかなり高度にキーボードをカスタマイズされていまして、この大文字・小文字の切り替えマクロがいくつかのキーを押して操作するタイプだったようです。

このマクロを使うと、1つのキーで実行できますので、ショートカットキーが1つ空いたというわけです。

どうぞお試しください。

このマクロでできること

カーソルが置かれている文章の先頭の単語の1文字目を大文字・小文字で切り替えます。

特許文献における段落番号(【0001】や、[0001]など)を除外して文章の先頭の1文字を特定します。

マクロの解説

以前の「カーソル位置の文頭文字の大・小文字を切り替えるWordマクロ」とは比べものにならないくらい長くて面倒な(笑)マクロになります。

様々な条件を踏まえてしっかり作り込むとこんなことになってしまうという例です。

技術文で使えるようになっています。文中で、文末ではないけれども使われているピリオドには、Mr. や Ms. や No. などいろいろあります。

除外する必要がある場合には、赤文字部分に追記してください。

また、文頭にピリオド付きの単語が記載されている場合に、その単語の先頭1文字を大文字・小文字変換しない場合には、青文字部分に除外文字を追記してください。

マクロ


Sub 文頭の文字の大文字_小文字変換()

 Dim myRange As Range
 Dim myTempRange As Range
 Dim myText As String
 Dim myStopChr As String

 '文末の判定のためにカーソルを移動させる記号
 'myStopChr の直前で移動終了(MoveStartUntilメソッドを利用)
 myStopChr = ".】]" & Chr(9) & Chr(11) & Chr(12) & Chr(13) & Chr(14)

 'Rangeオブジェクトでカーソルを移動→カーソル移動は目に見えない
 Set myRange = Selection.Range
 myRange.MoveStartUntil Cset:=myStopChr, Count:=wdBackward

 Do
  '見つけたピリオドが小数点の場合(前後に数字がある場合)には
  'さらにカーソルを移動させる
  If myRange.Characters.First.Text Like "[0-9]" And _
    myRange.Characters.First.Previous(wdCharacter, 1).Text = "." And _
    myRange.Characters.First.Previous(wdCharacter, 2).Text Like "[0-9]" Then
    myRange.Start = myRange.Start - 1
    myRange.MoveStartUntil _
     Cset:=myStopChr, Count:=wdBackward
  Else
   Set myTempRange = myRange.Duplicate
   myRange.SetRange Start:=myRange.Start - 1, End:=myRange.Start
   myRange.MoveStartUntil _
    Cset:=Chr(9) & Chr(11) & Chr(12) & Chr(13) & Chr(14) & Chr(32), _
    Count:=wdBackward
    
   myText = myRange.Text
  
   'ピリオドの直前の文字列がFIG.等の場合には、さらにカーソルを移動する
   Select Case myText
    Case "FIG.", "Fig.", "FIGS.", "Figs.", "FIGs", "e.g.", "i.e.", "etc."
     myRange.MoveStartUntil _
      Cset:=myStopChr, Count:=wdBackward
    
    Case Else
     Exit Do
   End Select
  End If
 Loop

 myTempRange.MoveStartWhile _
  Cset:=Chr(32), Count:=wdForward

 '文頭の文字列がFIG.等の場合には、大文字・小文字の変換をしない
 Select Case myTempRange.Text
  Case "FIG.", "Fig.", "FIGS.", "Figs.", "FIGs."
   '何もしない
  
  Case Else
   With myTempRange.Characters.First
    If .Case = wdUpperCase Then
     .Case = wdLowerCase
    ElseIf .Case = wdLowerCase Then
     .Case = wdUpperCase
    End If
   End With
  
 End Select

 Set myRange = Nothing
 Set myTempRange = Nothing

End Sub

 

-コード
-,