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

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

関連記事

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

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

トップへ戻る