ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3173|回复: 6

[求助] VBA删除空页5941错误代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-9-3 10:04 | 显示全部楼层 |阅读模式
VBA删除空页5941错误代码
请高手老师帮帮看看,是什么问题,谢谢大家了!
代码如下:(代码由论坛老师提供)

Sub 检查和删除WORD文档末空白页()
    Dim IsDelete As Boolean
    Dim PageCount As Long
    Dim rRange As Range
    Dim iInt As Integer, DelCount As Integer
    Dim tmpstr As String
    IsDelete = True
    PageCount = ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)
    For iInt = 1 To PageCount
        '超过PageCount退出
        If iInt > PageCount Then Exit For
        '取每一页的内容
        If iInt = PageCount Then
            Set rRange = ActiveDocument.Range(Start:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt).Start)
        Else
            Set rRange = ActiveDocument.Range(Start:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt).Start, End:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt + 1).Start)
        End If
        If Replace(rRange.Text, Chr(13), "") = "" Or Replace(rRange.Text, Chr(13), "") = Chr(12) Then
            'tmpstr = tmpstr & "第 " & iInt & " 页是空页" & vbCrLf
            tmpstr = "第 " & iInt & " 页后是空页"
            '删除
            If IsDelete Then
                DelCount = DelCount + 1
                '删除空白页
                rRange.Text = Replace(rRange.Text, Chr(13), "")
                rRange.Text = ""
                '重算页数
                PageCount = ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)
                If iInt <> PageCount Then
                    '页删除后,页码变化,重新检查当前页
                    iInt = iInt - 1
                Else
                    '最后一个空页
                    Set rRange = ActiveDocument.Range(Start:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, PageCount - 1).Start, End:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, PageCount + 1).Start)
                    '如果是分页符,删除上一页中的换页符
                    If InStr(1, rRange.Text, Chr(12)) > 0 Then
                        rRange.Characters(InStr(1, rRange.Text, Chr(12))) = ""
                    Else
                        '没有分页符,通过选中后删除,最好不这样做,如果判断错误,有误删除的风险
                        Set rRange = ActiveDocument.Range(Start:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt).Start)
                        rRange.Select
                        Selection.Delete
                    End If
                    Exit For
                End If
            End If
        End If
    Next
    If 1 = 1 Or Not IsDelete Then
        If tmpstr = "" Then
            MsgBox "没有空页", vbInformation + vbOKOnly
        Else
            MsgBox tmpstr, vbInformation + vbOKOnly
        End If
    Else
        If DelCount > 0 Then MsgBox "删除空页 " & DelCount, vbInformation + vbOKOnly
    End If
End Sub

VBA删除空页5941错误代码.rar (13.25 KB, 下载次数: 17)

无标题.jpg




TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-3 10:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请高手老师帮帮忙,谢谢大家了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-3 11:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请老师们帮帮忙,谢谢大家了!

TA的精华主题

TA的得分主题

发表于 2015-9-3 18:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Debug.Print rRange.Characters.Count,得到的字符数只有24个。分页符的位置是32。characters并不能包含所有的字符。
表格自身也是字符,但是这个字符却不在characters中。故实际的位置比characters多了8个。可以使用替换的方式解决:
  1. Sub 检查和删除WORD文档末空白页()
  2.     Dim IsDelete As Boolean
  3.     Dim PageCount As Long
  4.     Dim rRange As Range
  5.     Dim iInt As Integer, DelCount As Integer
  6.     Dim tmpstr As String

  7.     IsDelete = True
  8.     PageCount = ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)
  9.     For iInt = 1 To PageCount
  10.         '超过PageCount退出
  11.         If iInt > PageCount Then Exit For

  12.         '取每一页的内容
  13.         If iInt = PageCount Then
  14.             Set rRange = ActiveDocument.Range(Start:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt).Start)
  15.         Else
  16.             Set rRange = ActiveDocument.Range(Start:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt).Start, End:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt + 1).Start)
  17.         End If

  18.         If Replace(rRange.Text, Chr(13), "") = "" Or Replace(rRange.Text, Chr(13), "") = Chr(12) Then
  19.             'tmpstr = tmpstr & "第 " & iInt & " 页是空页" & vbCrLf
  20.             tmpstr = "第 " & iInt & " 页后是空页"
  21.             '删除
  22.             If IsDelete Then
  23.                 DelCount = DelCount + 1
  24.                 '删除空白页
  25.                 rRange.Text = Replace(rRange.Text, Chr(13), "")
  26.                 rRange.Text = ""
  27.                 '重算页数
  28.                 PageCount = ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)
  29.                 If iInt <> PageCount Then
  30.                     '页删除后,页码变化,重新检查当前页
  31.                     iInt = iInt - 1
  32.                 Else
  33.                     '最后一个空页
  34.                     Set rRange = ActiveDocument.Range(Start:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, PageCount - 1).Start, End:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, PageCount + 1).Start)
  35.                     '如果是分页符,删除上一页中的换页符
  36.                     If InStr(1, rRange.Text, Chr(12)) > 0 Then
  37.                         rRange.Find.Execute findtext:=Chr(12), MatchWildcards:=1, replacewith:="", Replace:=2
  38.                     Else
  39.                         '没有分页符,通过选中后删除,最好不这样做,如果判断错误,有误删除的风险
  40.                         Set rRange = ActiveDocument.Range(Start:=ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt).Start)
  41.                         rRange.Select
  42.                         Selection.Delete
  43.                     End If
  44.                     Exit For
  45.                 End If
  46.             End If
  47.         End If
  48.     Next

  49.     If 1 = 1 Or Not IsDelete Then
  50.         If tmpstr = "" Then
  51.             MsgBox "没有空页", vbInformation + vbOKOnly
  52.         Else
  53.             MsgBox tmpstr, vbInformation + vbOKOnly
  54.         End If
  55.     Else
  56.         If DelCount > 0 Then MsgBox "删除空页 " & DelCount, vbInformation + vbOKOnly
  57.     End If
  58. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-3 20:11 | 显示全部楼层
zhanglei1371 发表于 2015-9-3 18:46
Debug.Print rRange.Characters.Count,得到的字符数只有24个。分页符的位置是32。characters并不能包含所 ...

老师你好,感谢你的帮助,我测试了下

像下面这个文件,其中,第一页有内容、第二页没有内容、第三页有内容

正常情况下执行代码,应该是删除第二页,保留第一页和第三页内容
但,执行代码后,只有第一页了,请老师斧正下,谢谢了!
测试.rar (3.32 KB, 下载次数: 17)

TA的精华主题

TA的得分主题

发表于 2015-9-4 08:58 | 显示全部楼层
原来你不懂这些东西阿。早知道就不去那么费劲给你解释了。
既然是简单的问题,就用简单的方法:
Sub sdf()
    Selection.HomeKey wdStory
    For i = 1 To ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)
        sr = Selection.Bookmarks("\page").Range.Text
        For Each m In Array(Chr(13), Chr(12), " ", Chr(9))      ‘这里可添加空白页的空白字符
            sr = Replace(sr, m, "")
        Next
        If Len(sr) = 0 Then Selection.Bookmarks("\page").Range.Delete
        Application.Browser.Next
    Next
End Sub
多运行几次,就OK了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-4 09:48 | 显示全部楼层
zhanglei1371 发表于 2015-9-4 08:58
原来你不懂这些东西阿。早知道就不去那么费劲给你解释了。
既然是简单的问题,就用简单的方法:
Sub sdf( ...

感谢老师的帮助

4楼的代码,能删除有表格的WORD文档中的空白页。但会出来五楼的情况

6楼的代码,能删除五楼的附件,却删除不了有表格的WORD文档中的空白页。

想用一个代码,即能满足一楼的需要,也能满足五楼的需要

麻烦老师了,非常的感谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-15 21:46 , Processed in 0.024325 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表