用 VBA 代码来解决:
首先需要打开 Word 中的 Visual Basic 编辑器,并插入一个「模块」:
在 Word 中打开 Visual Basic 编辑器,并插入「模块」
在新插入的模块的编辑器中输入以下代码,然后点击顶部菜单栏中的三角按钮来运行:
在 Viisual Basic 编辑器中运行 VBA 代码
在弹出的选择窗口中选择要处理的一个或多个 Word 文档(.doc 或 .docx),并点击 “打开”。
等待程序运行,完成后会弹框提示:
注意:运行下面代码时需要谨慎,因为一旦运行结束便无法撤销。对于重要的文件资料,建议运行之前先进行备份,以免程序中途报错而丢失最后一页的内容。
在正式运行此程序之前,也建议大家先创建几个测试用的 Word 文档,在它们上面运行此程序,确认没有问题后再在自己的文档上来运行,以免造成损失。
Sub DeleteLastPageOfDocs()
Dim fd As FileDialog
Dim aDoc As Document
Dim i As Long
Dim count As Long
Set fd = Application.FileDialog(FileDialogType:=msoFileDialogOpen)
With fd
.AllowMultiSelect = True
.Title = "请选择要处理的一个或多个 Word 文档"
.Filters.Add "Word 文档", "\*.doc; \*.docx", 1
If .Show = -1 Then
count = .SelectedItems.count
For Each vrtSelectedItem In .SelectedItems
Set aDoc = Documents.Open(vrtSelectedItem)
With ActiveDocument
.Bookmarks("\\EndOfDoc").Range.Select
.Bookmarks("\\Page").Range.Delete
'Delete the last manual page break if there isn't any text after it
For i = ActiveDocument.Paragraphs.count To 1 Step -1
If Asc(.Paragraphs(i).Range.Text) = 12 Then
.Paragraphs(i).Range.Delete
Exit For
End If
If Len(.Paragraphs(i).Range.Text) > 1 Then
Exit For
End If
Next i
End With
aDoc.Save
aDoc.Close
Next
MsgBox "已处理 " & count & " 个 Word 文档"
End If
End With
End Sub
【更新】
修复了最后两页的页面方向不同时导致的问题,下面的代码在删除最后一页后,不再会将原来的倒数第二页的页面方向修改成与最后一页相同了:
注意,由于在代码中增加了修改最后一页页面布局的操作 [5][6],代码的整体运算速度会比前面一版的代码速度更慢。如果你处理的文档没有页面方向不同的问题,建议还是使用上面的代码,速度更快一些。
Sub DeleteLastPageOfDocs()
Dim fd As FileDialog
Dim aDoc As Document
Dim i As Long
Dim count As Long
Dim orient As Long
Dim flag As Boolean
Set fd = Application.FileDialog(FileDialogType:=msoFileDialogOpen)
With fd
.AllowMultiSelect = True
.Title = "请选择要处理的一个或多个 Word 文档"
.Filters.Add "Word 文档", "\*.doc; \*.docx", 1
If .Show = -1 Then
count = .SelectedItems.count
For Each vrtSelectedItem In .SelectedItems
flag = False
Set aDoc = Documents.Open(vrtSelectedItem)
With ActiveDocument
'Move cursor to the end of document
Selection.EndKey Unit:=wdStory
'Check whether the last and the last but one pages have the same page orientation
nPageC = .ActiveWindow.ActivePane.Pages.count
.GoTo(wdGoToPage, wdGoToAbsolute, nPageC - 1).Select
orient = Selection.PageSetup.Orientation
.GoTo(wdGoToPage, wdGoToAbsolute, nPageC).Select
Debug.Print orient & " <-- " & Selection.PageSetup.Orientation
If Selection.PageSetup.Orientation <> orient Then flag = True
'Delete content in the last page
.Bookmarks("\\EndOfDoc").Range.Select
.Bookmarks("\\Page").Range.Delete
'Change page orientation
If flag Then Selection.PageSetup.Orientation = orient
'Delete the last manual page break if there isn't any text after it
For i = ActiveDocument.Paragraphs.count To 1 Step -1
If Asc(.Paragraphs(i).Range.Text) = 12 Then
.Paragraphs(i).Range.Delete
Exit For
End If
If Len(.Paragraphs(i).Range.Text) > 1 Then
Exit For
End If
Next i
End With
aDoc.Save
aDoc.Close
Next
MsgBox "已处理 " & count & " 个 Word 文档"
End If
End With
End Sub
参考
- ^Remove multiple pages from multiple documents https://answers.microsoft.com/en-us/msoffice/forum/all/remove-multiple-pages-from-multiple-documents/23d6e62d-d240-467b-923f-7ee63ba7851e
- ^loop through all selected items in dialog http://www.vbaexpress.com/forum/showthread.php?16036-loop-through-all-selected-items-in-dialog
- ^Word VBA -- Delete last page https://www.experts-exchange.com/questions/29067732/Word-VBA-Delete-last-page.html
- ^How to delete the last manual page break if there isn't any text after it (with VBA)? https://answers.microsoft.com/en-us/msoffice/forum/all/how-to-delete-the-last-manual-page-break-if-there/92cb9fa0-187e-446f-bf7e-df1234d1da54
- ^[求助] [已解决] 如何使用 WordVBA 遍历所有页面? http://club.excelhome.net/thread-1118598-1-1.html
- ^PageSetup.Orientation property (Word) https://docs.microsoft.com/en-us/office/vba/api/word.pagesetup.orientation
Comments | NOTHING