【VBA】ワードの指定ページを削除する

エクセル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