【Word VBA】文字列を横方向に移動するWordマクロ

2013年9月9日

(追記)2017年10月12日
不具合を修正しました。こちらをご覧ください。
【コード】文字列を横方向に移動するWordマクロ(その2) 

週末は、富井篤先生の合宿型の翻訳勉強会に参加してきました。

プレイベントから参加させていただき、リフレッシュしました。

いろんな方々と情報交換をさせていただきました。ありがとうございました。

ご準備、運営をされていたみなさま、どうもありがとうございました。多くのお心遣いがあり、大変なご尽力だったと思います。

 

この合宿の帰り道、合宿に参加されていた方と電車でお話をしているときに面白いアイディアをいただきました。

その方は、かつて翻訳支援ソフトのメーカーに勤務されていたとのことで、当時(数十年前)の翻訳支援ソフトの便利な仕様を覚えていらっしゃいました。

それをWordでできないかという話になりました。

当然答えは「できます」ということで、帰りの新幹線はマクロ作りになったわけです。

面白いマクロなので、お試しください。

 

開発提案をいただいた方に命名いただきました。

文字列が横に移動するので、カニのようだということで(笑)、"crab walk"です。

このマクロでできること

選択した文字列を、左右に「単語」単位で移動させます。

文章の校正や、翻訳作業で使えると思います。

 

文字列を選択します。

この状態で右方向へ移動させるマクロを実行します。

さらにもう一度右方向へ移動させます。

 

文字列を選択していない場合には、カーソル位置の単語(Wordが識別する単語です。念のため)が自動的に選択されて移動させます。

文字列を選択していない場合でマクロを実行する場合、移動方向に半角スペースがある場合には、マクロは実行を中止します。

英文で実行する場合、半角スペースだけが移動してしまうことを回避するためです。

 

例えば、以下の状態で右側に文字列を移動させようとしても何も起こりません。

以下の状態で左側に文字列を移動させようとしても、同様に何も起こりません。

 

キーボードのショートカットキーに登録して使いたいですね。

右側に移動させるマクロと左側に移動させるマクロの二種類を作りました。

 

マクロの解説

移動先の位置をmyDestRangeとしてRangeオブジェクトで設定しました。

FormattedText プロパティを使用して、文字列をコピペしています(36行目)。

書式を保持するためです。単純に文字列情報だけを取ると、上付き、下付き、文字の色などの情報がおちるため、書式付でコピペをしています。

クリップボードを介さないので、クリップボードを介するコピペよりも処理速度が速いです。

数百回以上連続してコピペを繰り返すような作業では、処理速度の差を体験できると思います。

ヘルプによると、FormattedText プロパティは、文字列のコピペ用のプロパティです。

表や図のコピペもできる場合がありますが、エラーになることがあります。

 

貼り付け時の自動調整も一時的にオフにしています。

Options.PasteSmartCutPaste プロパティで、以下のボタンのオンオフを切り替えられます(24行目、25行目、45行目)。

オフにしないと、文字列を削除する場合に、半角スペースも一緒に消されてしまいます。

Wordのおせっかい機能の一つです。

通常は非常に便利なのですが(実際、不要と思われる半角スペースが自動的に削除されていることに気づかれていない方が多いと思います)、このマクロの実行時に半角スペースが勝手になくなるのはよろしくないので、貼り付け時の自動調整をオフにします。

最後に元の状態に戻します。

マクロ1


Sub 文字列移動_左()

 Dim myRange As Range '元の文字列
 Dim myDestRange As Range '移動先の文字列
 Dim Pos_Start As Long
 Dim blnPaste As Boolean '貼り付け時の自動調整

 Set myRange = Selection.Range
 Pos_Start = myRange.Start
 
 If Selection.Type = wdSelectionIP Then
  '進行方向の1文字をmyRangeに設定
  myRange.SetRange Pos_Start - 1, Pos_Start
  
  If myRange.Text <> " " Then
   myRange.Expand unit:=wdWord
  Else
   Set myRange = Nothing
   Exit Sub
  End If
 End If
 
 '貼り付け時の自動調整(設定変更)
 blnPaste = Options.PasteSmartCutPaste
 Options.PasteSmartCutPaste = False
 
 '移動先の設定
 Set myDestRange = myRange.Duplicate
 
 With myDestRange
  .MoveStart unit:=wdWord, Count:=-1
  .End = .Start
 End With
 
 'コピペ(文字書式も貼り付けます)
 myDestRange.FormattedText = myRange.FormattedText
 
 '元の文字列を削除
 myRange.Delete
 
 '移動先の文字列を選択
 myDestRange.Select
 
 '貼り付け時の自動調整(設定復帰)
 Options.PasteSmartCutPaste = blnPaste
 
 'Rangeオブジェクトの解放
 Set myRange = Nothing
 Set myDestRange = Nothing
 
End Sub

マクロ2


Sub 文字列移動_右()

 Dim myRange As Range '元の文字列
 Dim myDestRange As Range '移動先の文字列
 Dim Pos_Start As Long
 Dim blnPaste As Boolean '貼り付け時の自動調整
  
 Set myRange = Selection.Range
 Pos_Start = myRange.Start
 
 If Selection.Type = wdSelectionIP Then
  '進行方向の1文字をmyRangeに設定
  myRange.SetRange Pos_Start, Pos_Start + 1
  
  If myRange.Text <> " " Then
   myRange.Expand unit:=wdWord
  Else
   Set myRange = Nothing
   Exit Sub
  End If
 End If
 
 '貼り付け時の自動調整(設定変更)
 blnPaste = Options.PasteSmartCutPaste
 Options.PasteSmartCutPaste = False
 
 '移動先の設定
 Set myDestRange = myRange.Duplicate
 
 With myDestRange
  .MoveEnd unit:=wdWord, Count:=1
  .Start = .End
 End With
 
 'コピペ(文字書式も貼り付けます)
 myDestRange.FormattedText = myRange.FormattedText
 
 '元の文字列を削除
 myRange.Delete
 
 '移動先の文字列を選択
 myDestRange.Select

 '貼り付け時の自動調整(設定復帰)
 Options.PasteSmartCutPaste = blnPaste

 'Rangeオブジェクトの解放
 Set myRange = Nothing
 Set myDestRange = Nothing
 
End Sub

関連記事

文字列を横方向に移動するWordマクロ(WordBasic編)

【コード】文字列を横方向に移動するWordマクロ(その2)

【コード】文字列を縦方向に移動するWordマクロ

-コード
-,