(追記)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