vba 处理特定段落前的表观空行中的分页符

news/2025/11/19 19:17:05/文章来源:https://www.cnblogs.com/geyee/p/19243705

存在 word 文档另存为 wps 时,出现页码变多,与 word 中的不一致的情况。对于其中的某页标题行前有空行,空行内包含分页符与前面的文字在同一段落。需要删除改分页符,同时使原标题段落格式(大纲级别,编号,下划线等)不变,还要使其不上提到前一页。

Rem Attribute VB_Name = "ProcessSelectedParagraphs"
Sub ProcessSelectedParagraphs()
'
' 终极版:处理选定段落的分页符、空行及标题排版
' 1. 智能处理标题前的分页符/换行符 (保护标题样式,防止误删段落标记)
' 2. 自动删除完全空白的页面
' 3. 替换段落内部分页符
'Dim para As ParagraphDim i As LongDim deletedCount As LongDim pageBreaksReplaced As LongDim emptyPagesDeleted As LongDim report As StringDim undoRecord As undoRecorddeletedCount = 0pageBreaksReplaced = 0emptyPagesDeleted = 0report = "处理结果报告:" & vbCrLf & vbCrLf' 创建撤销记录Set undoRecord = Application.undoRecordundoRecord.StartCustomRecord "智能排版处理"Application.ScreenUpdating = False' ==========================================================================================' 第一步:倒序遍历,处理分页符替换和标题规则' ==========================================================================================For i = Selection.Paragraphs.Count To 1 Step -1Set para = Selection.Paragraphs(i)Dim paraText As StringparaText = para.Range.text' --- 规则 A: 标题行处理 ---' 如果是标题行 (大纲级别 1-9)If IsHeading(para) ThenDim prevPara As ParagraphSet prevPara = para.PreviousIf Not prevPara Is Nothing ThenDim prevRng As RangeSet prevRng = prevPara.RangeDim prevText As StringprevText = prevRng.text' 检查前一段是否包含分页符Dim hasPageBreak As BooleanhasPageBreak = (InStr(prevText, Chr(12)) > 0)' 情况1: 前一段是纯粹的分页符/空行 (例如只有 ^m^p 或 ^p)If IsJustBreak(prevText) Then' 再次确认不是图片If prevRng.InlineShapes.Count = 0 And prevRng.ShapeRange.Count = 0 ThenprevRng.DeletedeletedCount = deletedCount + 1' 【关键修正】如果删除了分页符,为了保持标题在页首,' 将标题段落设置为"段前分页"If hasPageBreak Thenpara.Format.PageBreakBefore = TrueEnd IfEnd If' 情况2: 前一段包含文本,但末尾有分页符 (Text...^m^p)' 策略:只删除分页符(^m),保留段落标记(^p),同时设置标题段前分页ElseIf hasPageBreak ThenWith prevRng.Find.ClearFormatting.text = "^m".Replacement.text = "" ' 仅移除分页符.Forward = True.Wrap = wdFindStop.Execute Replace:=wdReplaceAllEnd With' 【关键修正】显式分页符转为样式分页para.Format.PageBreakBefore = TrueEnd IfEnd IfEnd If' --- 规则 B: 替换段落内部的分页符 (非标题前的情况) ---' 如果段落文本中包含分页符 (Chr(12))' 注意:如果上面规则A已经处理了该段(作为某标题的前一段),这里可能会重复处理?' 由于是倒序,当前 para 是 i。规则A处理的是 i-1。' 所以当前 para (i) 如果含有分页符,说明它不是作为标题前缀被处理的(或者它本身就是标题但含有分页符)If InStr(para.Range.text, Chr(12)) > 0 ThenDim replaced As Longreplaced = ReplacePageBreaksAdvanced(para.Range.Duplicate)If replaced > 0 ThenpageBreaksReplaced = pageBreaksReplaced + replacedEnd IfEnd IfNext i' ==========================================================================================' 第二步:检测并删除空页 (全页为空行或不可见字符)' ==========================================================================================Dim searchRange As RangeSet searchRange = Selection.RangeIf Selection.Paragraphs.Count > 0 ThensearchRange.Start = Selection.Paragraphs(1).Range.StartsearchRange.End = Selection.Paragraphs(Selection.Paragraphs.Count).Range.EndEnd IfDim pBreak As RangeSet pBreak = searchRange.DuplicateWith pBreak.Find.ClearFormatting.text = "^m".Forward = True.Wrap = wdFindStopDo While .ExecuteDim checkRange As RangeSet checkRange = pBreak.DuplicatecheckRange.Collapse wdCollapseEndDim nextBreakFinder As RangeSet nextBreakFinder = searchRange.Document.Range(checkRange.Start, searchRange.End)Dim endOfPage As LongIf nextBreakFinder.Find.Execute(FindText:="^m", Forward:=True, Wrap:=wdFindStop) ThenendOfPage = nextBreakFinder.StartElseendOfPage = searchRange.EndEnd IfcheckRange.End = endOfPageIf IsRangeEmpty(checkRange) ThenIf checkRange.InlineShapes.Count = 0 And checkRange.ShapeRange.Count = 0 ThenDim deleteRange As RangeSet deleteRange = searchRange.Document.Range(pBreak.Start, checkRange.End)deleteRange.DeleteemptyPagesDeleted = emptyPagesDeleted + 1End IfEnd IfpBreak.Collapse wdCollapseEndIf pBreak.Start >= searchRange.End Then Exit DoLoopEnd WithApplication.ScreenUpdating = TrueundoRecord.EndCustomRecordreport = report & "替换分页符: " & pageBreaksReplaced & vbCrLfreport = report & "清理标题前分隔符: " & deletedCount & vbCrLfreport = report & "删除空页: " & emptyPagesDeleted & vbCrLfMsgBox report, vbInformation, "处理完成"
End Sub' ==========================================================================================
' 辅助函数
' ==========================================================================================Function IsHeading(para As Paragraph) As BooleanIsHeading = (para.OutlineLevel >= wdOutlineLevel1 And para.OutlineLevel <= wdOutlineLevel9)
End FunctionFunction IsJustBreak(text As String) As Boolean' 检查文本是否只包含 分页符、换行符、空白Dim temp As Stringtemp = texttemp = Replace(temp, Chr(13), "")temp = Replace(temp, Chr(12), "")temp = Replace(temp, Chr(11), "")temp = Replace(temp, " ", "")temp = Replace(temp, vbTab, "")temp = Replace(temp, ChrW(12288), "")temp = Replace(temp, Chr(160), "")IsJustBreak = (Len(temp) = 0)
End FunctionFunction IsRangeEmpty(rng As Range) As BooleanDim txt As Stringtxt = rng.textIf Len(txt) > 5000 ThenIsRangeEmpty = FalseExit FunctionEnd Iftxt = Replace(txt, Chr(13), "")txt = Replace(txt, Chr(11), "")txt = Replace(txt, Chr(12), "")txt = Replace(txt, " ", "")txt = Replace(txt, vbTab, "")txt = Replace(txt, ChrW(12288), "")txt = Replace(txt, Chr(160), "")IsRangeEmpty = (Len(txt) = 0)
End FunctionFunction ReplacePageBreaksAdvanced(rng As Range) As LongDim replaceCount As LongDim findRange As RangereplaceCount = 0If InStr(rng.text, Chr(12)) = 0 ThenReplacePageBreaksAdvanced = 0Exit FunctionEnd IfSet findRange = rng.DuplicateWith findRange.Find.ClearFormatting.text = "^m".Replacement.text = "^p".Forward = True.Wrap = wdFindStop.Format = False.MatchWildcards = FalseDo While .Execute(Replace:=wdReplaceOne)replaceCount = replaceCount + 1findRange.Collapse wdCollapseEndIf findRange.Start >= rng.End Then Exit DoLoopEnd WithReplacePageBreaksAdvanced = replaceCount
End Function

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/970305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能之编程进阶 Python高级:第六章 文件类模块

人工智能之编程进阶 Python高级:第六章 文件类模块人工智能之编程进阶 Python高级 第六章 文件类模块@目录人工智能之编程进阶 Python高级前言一、csv 模块:读写 CSV 文件1. 写入 CSV2. 读取 CSV二、json 模块:处理…

PQ v.Next Alpha阶段发布

Alpha 阶段的发布 1、新闻稿发布 我们的PQ v.Next v1.1.9版本顺利发布!PQ 是一款专为知识分享场景设计的AI驱动型互动平台。它旨在通过动态题目生成和即时反馈,将传统的单向演讲转变为一场沉浸式、可量化的双向交流,…

国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照框架中的深度应用

国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照框架中的深度应用2025-11-19 19:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; over…

三分稀疏图染色的多项式时间证明

别看(简介 三分图染色指对于一个图进行三种颜色的染色,每条边的两个端点颜色不同 本文旨解决 m-n$\le$7的染色问题,即边数只比点数多7 做法 考虑对于每个度数$\ge$3的结点作暴力dfs染色,代码差不多就是这样的 即能…

251119

JT-JY14T3S1Hello, FL conference hotel. Hi, i want to ask about conference facilities of the hotel. Have i came through to the right person? You have, i am the customer services manager. My name is Ang…

实用指南:分布式架构未来趋势:从云原生到智能边缘的演进之路

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

人工智能之编程进阶 Python高级:第七章 数据库类模块

人工智能之编程进阶 Python高级:第七章 数据库类模块人工智能之编程进阶 Python高级 第七章 数据库类模块@目录人工智能之编程进阶 Python高级前言🗄️ 一、MySQL(关系型数据库)1. 安装(本地开发)Windows / mac…

linux for 跳出循环

在 Linux 中,如果你想“跳出循环”,通常是指在 for 循环中提前终止循环。这可以通过 break 或 exit 命令实现。下面是几种常见方式:1. 使用 break 跳出 for 循环 for i in {1..5}; doif [ $i -eq 3 ]; thenecho +…

用USB BLASTER II 下载sof文件没有问题,debug波形也没有问题。但是下载jic问题异常?

用USB BLASTER II 下载sof文件没有问题,debug波形也没有问题。但是下载jic问题异常? 1. 概述USB Blaster II是用于Intel(Altera) FPGA/CPLD高速编程设备。并且用于Intel FPGA有快的速度,最高24M运行工作。支持FPGA…

Linux用户管理相关知识

Linux用户管理 1.Linux操作系统开机流程 打开电源: 1.开机自检BIOS # BIOS(Basic Input/Output System) 检查cpu、内存、磁盘、硬件是否有问题。 2.MBR引导 # 主引导记录,通过硬盘启动 MBR--> /boot/swap…

AI浪潮下的机遇与挑战:从巨头动态看未来趋势

标签:AI技术、云服务、职业发展、行业观察最近刷新闻,发现AI领域又炸开了锅。从云服务故障到巨头战略升级,再到人才流动,整个行业像打了鸡血一样高速运转。作为一个对技术敏感的人,我忍不住把这些碎片信息拼凑起来…

CCF GESP 五级真题考频与知识点速查表

CCF GESP 五级真题考频与知识点速查表 (按 2023-2025 共 7 场正式考试出现次数降序,同频次按时间倒序)序号 题号 标题 出现次数 核心知识点(五级大纲) 难度标签1 B3871 因数分解 3 次 质因数分解 + 质数筛 普及−…

人工智能之编程进阶 Python高级:第五章 时间类模块

人工智能之编程进阶 Python高级:第五章 时间类模块人工智能之编程进阶 Python高级 第五章 时间类模块@目录人工智能之编程进阶 Python高级前言一、time 模块:底层时间操作(Unix 时间戳)常用函数时间格式化代码(st…

NSSCTF(WebFTP —— easyupload1.0) - 实践

NSSCTF(WebFTP —— easyupload1.0) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

推迟win11更新137年的方法

1、打开cmd2、粘贴命令并运行(注意引号是英文)reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" /v FlightSettingsMaxPauseDays /t reg_dword /d 5000 /f3、打开windows更新…

linux for 死循环

在 Linux 中, + #引号 + 死循环 + #引号 + (Dead Loop)通常指的是程序或脚本在执行过程中无限循环,无法正常退出。这可能是因为逻辑错误、未处理的异常、或未正确终止循环等原因导致的。 以下是一些常见的 Lin…

注册表禁用/启用Windows系统更新

在WindowsCenter中会通过注册表执行禁用windows更新的操作。 注册表位置\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate 禁用windows更新和关闭禁用windows更新的脚本如下。 禁用更新 reg ad…

CF954H

Sol 神秘观察题。 首先特判链一端在 LCA 的情况,这个是容易的。 首先不难想到一个暴力:\(f_{i,j}\) 表示链 LCA 在 \(i\),长度为 \(j\) 的个数,然后可以得到 \(f_{i,j}=\binom{a_i}{2}w_{1,i-1}\displaystyle\sum_…

PID 文件不一致导致 REDIS 一直重启

PID 文件不一致导致 REDIS 一直重启问题现象:Redis 服务每隔几十秒自动重启,systemd 状态显示为 activating,无法正常进入 active(running) 状态。排查过程: (1)日志显示没有找到/var/run/redis/redis-server.pi…

实用指南:centos7.2安装HAProxy1.5.18

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …