エクセルVBAでよく使うコードの備忘録。VBAでワードファイルを操作して指定したページを削除するコード。ちなみにワードファイルの空白ページのみを削除するコードについてはこちら。
事前準備
VBAでワードファイルを操作するには、参照設定が必要です。VBAのコードエディタから「ツール > 参照設定」と進み、「Microsoft Word XX.X Object Library」にチェックを入れておきます。
指定ページを削除する
指定したページのみを削除する方法はいくつか考えられますが、今回は単純に指定したページの冒頭から末尾の位置を検索して削除したいページをまず選択し、選択部分をDeleteすることで実現したいと思います。
指定ページの冒頭・末尾の検索には、SelectionオブジェクトのGoToメソッドを使用しています。GoToメソッドの使い方についてはマイクロソフトのこちらのページが詳しいですので適宜ご参照ください。
指定ページの冒頭を取得するのは、GoToメソッドの引数「Which」に「wdGoToFirst」という定数を与えてやることで簡単に実現できます。しかし、削除するために指定ページの末尾を取得するには、GoToメソッドの引数「Which」に「wdGoToLast」を指定してもうまくいきませんでした。GoToメソッドで取得するページの末尾と、ページの区切り位置の認識がずれているためと思われます。そのため、ページの末尾を指定する際は、「次ページの冒頭を取得して1文字戻る」という操作をしています。最終ページには当然次のページが存在しないので、下記のサンプルコードでは最終ページとそれ以外で場合分けをしてうまく処理しています。
サンプルコード
指定ページを削除するサンプルコードです。各ページの最初から最後までを選択して削除することで指定ページの削除を実現しています。
なお、コードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。
Public Sub DeletePageTest()
'--- Wordのアプリケーションオブジェクト ---'
Dim objWord As Word.Application
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
'--- ドキュメントオブジェクト ---'
Dim objDoc As Word.Document
Set objDoc = objWord.Documents.Open("[ワードファイルのパス]")
'--- 削除ページの開始と終了位置 ---'
Dim startTmp As Long
Dim endTmp As Long
'--- ドキュメントのページ数 ---'
Dim pageNum As Long
pageNum = objDoc.Content.Information(wdNumberOfPagesInDocument)
'--- 削除するページ番号 ---'
Dim delPage As Long
delPage = [削除するページ番号]
'--- 文書の冒頭にカーソルを移動 ---'
objDoc.Activate
objWord.Selection.Start = 0
objWord.Selection.End = 0
'--- 削除するページ番号(delPage)がドキュメントのページ数以下の時だけ処理を行う ---'
If (delPage <= pageNum) Then
'--- 削除ページの一番初めを取得 ---'
objWord.Selection.GoTo What:=wdGoToPage, Which:=wdGoToFirst, Count:=delPage
startTmp = objWord.Selection.Start
'--- 削除ページの一番最後を取得 ---'
'--- 最終ページ以外は次のページから一つ戻って最後を取得 ---'
If (delPage < pageNum) Then
objWord.Selection.GoTo What:=wdGoToPage, Which:=wdGoToFirst, Count:=delPage + 1
endTmp = objWord.Selection.Start - 1
Else
objWord.Selection.EndKey Unit:=wdStory
endTmp = objWord.Selection.End
End If
'--- 削除ページの最初から最後を選択し削除 ---'
objWord.Selection.Start = Application.WorksheetFunction.Max(startTmp - 1, 0)
objWord.Selection.End = endTmp + 1
objWord.Selection.Delete
End If
End Sub