Wordで文ごとに選択
Wordで翻訳をしていると、文単位で選択範囲を動かしたいときがあります。 そんな時はマクロの出番。 早速実装してみましょう。
Option Explicit
Sub next_sentence()
Selection.Range.Next(wdSentence, 1).Select
End sub
文を選択しているときに、このマクロを実行すると、次の文が選択されます。
ただ、何も選択していないときには「今の場所から文終わり」ではなく、「次の文の初めから終わりまで」が選択されてしまいます。 というわけで、もう一工夫。
Option Explicit
Sub next_sentence()
If Selection.Range.Text = "" Then
Selection.MoveEnd unit:=wdSentence
Else
Selection.Range.Next(wdSentence, 1).Select
End If
End Sub
何も選択されていない場合(=テキストが空の場合)は、Rangeオブジェクトの移動ではなく、Rangeオブジェクトの終了場所を拡張するように変更しています。 これで「次の文を選ぶ」という操作が実現できます。
# マクロをショートカット化するには……
まずはこのnext_sentenceが入ったファイルを保存します。 必ず 「マクロ有効文書」 で保存するようにしてください。 次に「ファイル」>「オプション」>「リボンのユーザー設定」と進みます。 少し分かりづらいですが、左下の「ショートカットキー:」の隣にある「ユーザー設定」ボタンを押します。 すると、ショートカットキーの設定画面に入れます。 左のボックスから「マクロ」を探し、右のボックスに表示される next_sentence を選択します。次に下にあるテキストボックスにカーソルを合わせたら、割り当てたいショートカットキーを押します。 これが他のショートカットキーと競合していなければ問題ありません。 「割り当て」をクリックする前に、Normal.dotではなくこのdocmファイルに保存するようにしましょう。
# Wordファイルのテンプレート化
次に、このファイルを「マクロ有効文書」から「マクロ有効テンプレート」に作り替え、毎回Wordの起動時に読み込まれるようにします。 まずは「ファイル」>「名前を付けて保存」を選択し、「マクロ有効テンプレート」を選択します。 すると、dotmファイルが C:\Users\%USERNAME%\Documents\Office のカスタム テンプレート に保存されます。
次にこれを C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Word\STARTUP に移動してやります。
最後に、Wordの開発タブを開いて、「文書テンプレート」を選択、先ほど保存したファイルを有効にすれば、Wordの起動時にマクロが読み込まれ、どのファイルでも使えるようになります。
ファイルの移動が面倒だ、という方は下記のPowerShellコマンドレットで処理してしまいましょう。
Copy-Item "C:\Users\${env:USERNAME}\Documents\Office のカスタム テンプレート\*.dotm" "C:\Users\${env:USERNAME}AppData\Roaming\Microsoft\Word\STARTUP"
PowerShellで環境変数のユーザー名を利用する方法は、
$env:USERNAME
とします。
# Office 2019/365の場合
上記のフォルダはWord2016までのものです。 2019以降は次の場所に移動しているようです。
調べてもなかなか情報はでてきませんが、「文書テンプレート」の追加ボタンからSTARTUPの場所が開かれます。 ファイル選択ダイアログのパス部分をクリックして、ファイルパスを控えておきましょう。
# 2020/10/12 追記
PowerShellでWordのCOMオブジェクトを作って調べる方法がありました!
$wd = New-Object -ComObject "Word.Application"
$startup = $wd.StartupPath
Write-Host $startup
$wd.Quit()
[System.GC]::Collect()
# もう一工夫
さて、これでどのWordファイルでも next_sentence が呼び出せるようになりました。これなら効率も一気に向上……と残念ながらそうはいかず、図のようなエラーがでます。
その理由を探るために、次のような簡易マクロを組み込みます。
Option Explicit
Sub display_thisdocument()
MsgBox (ThisDocument.Name)
End sub
ダイアログを表示して、現在のドキュメントの名前を表示させるだけの単純なマクロです。
もちろん、普通に実行すればこのように表示されます。
このマクロを同じようにマクロ有効テンプレートにして、STARTUPに保存し、Wordを再起動します。
そして、新規文書でAlt + F8から実行してみると……
ファイル名がテンプレートに!?
今編集中のファイル名ではなく、テンプレート名が表示されました。 つまり、このマクロを実行しているとき、”Selection” とは今見えている文書ではなく、テンプレートファイルの選択場所を参照しにいっているんですね。
これを解決するために、Selectionのドキュメントを確認します。 エディタ画面でSelectionを選んで F1 を押すのが早いでしょう。
https://docs.microsoft.com/ja-jp/office/vba/api/word.global.selection
この解説によると、まずSelectionはグローバルオブジェクトのプロパティだそう。 そうすると、どうやって識別したらいいのか……
しかしこの説明、Selectionの説明にしては短すぎる気がします。 そんなわけで、Selectionオブジェクトをもう少し探してみると……
ありました!
https://docs.microsoft.com/ja-jp/office/vba/api/word.selection
ここでは
Microsoft Word はアクティブなドキュメント ウィンドウのアクティブなウィンドウ枠から選択範囲を返します。
となっていますね。
そしてサンプルコードも載っています。
Documents(3).ActiveWindow.Selection.Cutf
ということは”ActiveWindow”のSelectionであることを明示してやれば解決しそうです。
修正後のコードがこちら
Option Explicit
Sub next_sentence()
If Selection.Range.Text = "" Then
ActiveWindow.Selection.MoveEnd unit:=wdSentence
Else
ActiveWindow.Selection.Range.Next(wdSentence, 1).Select
End If
End sub
これを再度マクロ有効テンプレートにして保存すると…… 今度は無事成功しました!
いかがでしたか? このマクロを応用すれば、「1つ前の文」というショートカットも作ることができます。
# PR
Wordの使い方を初歩から徹底的に勉強したい人向けの本を紹介します。

ゴールデンブリッジでは、
翻訳・通訳・インバウンドツアー・国際会議運営など
ご用命をお待ちしております!
また、翻訳に関わるツール・ソフトウェアの開発等についてもお気軽にお声掛けください。