4年前に書いた記事「【コード】文字列を横方向に移動するWordマクロ」の書き直しです。
この記事では、選択されている文字列を左右に単語単位で移動させるマクロを紹介しました。
今読み返してみると、文書の末尾や先頭で不具合があることと、マクロを修正した方がすっきりする箇所とがありましたので書き直しました。
<目次>
このマクロでできること
選択されている文字列を単語単位で左右に移動させます。文字列が選択されていない場合には、カーソル位置の単語を選択するだけで終了します。
実行前
実行後
マクロの解説
前回のマクロでは、選択されている文字列が文書の先頭や末尾の場合に、誤動作して文字列を削除してしまいました。
今回のマクロでは、カーソルをそれ以上移動できるかどうかをMoveメソッドの戻り値で判定しています(24行目)。
このことで、カーソルが動いた場合にだけ処理を進め、カーソルが動かなかった場合(つまり、文書やテキストボックスの先頭でカーソル位置を今の場所から左に動かせなかった場合)には、処理を終了するようにしています。
また、前回のマクロで移動先の位置をmyDestRangeとしてRangeオブジェクトで設定しました。
このような処理はなくてもいいと思いまして、Rangeオブジェクトは作らずにシンプルにまとめてみました。
マクロ1
Sub 文字列移動_左() Dim myRange As Range '元の文字列 Dim blnPaste As Boolean '貼り付け時の自動調整 Set myRange = Selection.Range If Selection.Type = wdSelectionIP Then Selection.Expand wdWord Exit Sub End If '貼り付け時の自動調整(設定変更) blnPaste = Options.PasteSmartCutPaste Options.PasteSmartCutPaste = False '移動先の設定 With Selection '選択の解除 .Collapse wdCollapseStart '左方向にカーソルを移動 If .Move(unit:=wdWord, Count:=-1) < 0 Then 'コピペ(文字書式も貼り付けます) .FormattedText = myRange.FormattedText '移動先の文字列を選択 .End = .End + Len(myRange.Text) '元の文字列を削除 myRange.Delete Else 'カーソル位置を元の場所に戻す myRange.Select End If End With '貼り付け時の自動調整(設定復帰) Options.PasteSmartCutPaste = blnPaste 'Rangeオブジェクトの解放 Set myRange = Nothing End Sub
マクロ2
Sub 文字列移動_右() Dim myRange As Range '元の文字列 Dim blnPaste As Boolean '貼り付け時の自動調整 Set myRange = Selection.Range If Selection.Type = wdSelectionIP Then Selection.Expand wdWord Exit Sub End If '貼り付け時の自動調整(設定変更) blnPaste = Options.PasteSmartCutPaste Options.PasteSmartCutPaste = False '移動先の設定 With Selection '選択の解除 .Collapse wdCollapseEnd '右方向にカーソルを移動 If .Move(unit:=wdWord, Count:=1) > 0 Then 'コピペ(文字書式も貼り付けます) .FormattedText = myRange.FormattedText '移動先の文字列を選択 .End = .End + Len(myRange.Text) '元の文字列を削除 myRange.Delete Else 'カーソル位置を元の場所に戻す myRange.Select End If End With '貼り付け時の自動調整(設定復帰) Options.PasteSmartCutPaste = blnPaste 'Rangeオブジェクトの解放 Set myRange = Nothing End Sub