エクセルVBAでよく使うコードの備忘録。VBAでワードファイルを操作して、ドキュメントに含まれる空白ページを削除するコード。
事前準備
VBAでワードファイルを操作するには、参照設定が必要です。VBAのコードエディタから「ツール > 参照設定」と進み、「Microsoft Word XX.X Object Library」にチェックを入れておきます。
空白ページを削除する
下記のサンプルコードでは、ワードドキュメント内のすべてのページを走査して、空白のみのページを削除しています。空白ページの定義としては「半角・全角スペース」、「セクション区切り」、「ページ区切り」、「改行」以外の文字が含まれないページとしています。コードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。
サンプルコード
Public Sub DeleteBlankPage()
'--- 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 pageN As Long
pageN = objDoc.Content.Information(wdNumberOfPagesInDocument)
'--- ドキュメントの冒頭にカーソルを移動 ---'
objDoc.Activate
objWord.Selection.Start = 0
objWord.Selection.End = 0
'--- 各ページの最初と最後を格納する変数 ---'
Dim startTmp As Long
Dim endTmp As Long
'--- 各ページの内容を格納する変数 ---'
Dim tmp As String
'--- 全てのページを走査 ---'
Dim i As Long
For i = 1 To pageN
'iページに移動
Call objWord.Selection.Goto(What:=wdGoToPage, which:=wdGoToFirst, Count:=i)
'iページのスタートとエンドを取得
startTmp = objWord.Selection.Start
'最終ページでない時
If (i < pageN) Then
'一度次のページの冒頭にカーソルを移動し一つ戻る(そこがページの最後)
Call objWord.Selection.Goto(What:=wdGoToPage, which:=wdGoToFirst, Count:=i + 1)
endTmp = objWord.Selection.Start - 1
'最終ページの時
Else
'文書の最後に移動
Call objWord.Selection.EndKey(Unit:=wdStory)
endTmp = objWord.Selection.End
End If
'iページ全体を選択
objWord.Selection.Start = startTmp
objWord.Selection.End = endTmp
'iページに含まれる文字列を取得
tmp = objWord.Selection.Text
'iページに含まれる文字列から空白とみなす文字列を削除
tmp = Replace(tmp, " ", "") '半角スペース
tmp = Replace(tmp, " ", "") '全角スペース
tmp = Replace(tmp, "^b", "") 'セクション区切り
tmp = Replace(tmp, "^m", "") 'ページ区切り
tmp = Replace(tmp, Chr(12), "") '改行
tmp = Replace(tmp, vbCr, "") '改行
tmp = Replace(tmp, vbCrLf, "") '改行
tmp = Replace(tmp, vbLf, "") '改行
tmp = Replace(tmp, vbNewLine, "") '改行
'iページに含まれる文字列が空欄のみ、あるいは一文字も含まれない場合は削除
If (tmp = "" Or startTmp = endTmp) Then
objWord.Selection.Start = Application.WorksheetFunction.Max(startTmp - 1, 0)
objWord.Selection.End = endTmp + 1
objWord.Selection.Delete
End If
Next i
'--- ドキュメントを閉じる ---'
objDoc.Close
'--- ワードを閉じる ---'
objWord.Quit
End Sub