我一直在为此喋喋不休,似乎无法想出一个解决方案.我必须通过通配符搜索自定义标记从头到尾搜索文档.为了这个问题,我们会说{something}当我找到一个特定的匹配时,它会被另一个字符串的内容替换,该字符串也可能包含标记.标记必须按照它在最终文档中出现的顺序进行替换.我必须知道每次替换所做的递归级别.

这基本上就是我提出的.请注意,ProcessReplacement函数是为示例设计的 – 文本被外部程序替换:

Option Explicit
Private replaced As Integer
Public Sub Demo()Dim pos As RangeSet pos = ActiveDocument.Contentreplaced = 0pos.Text = "{fizz}{fizz}{more}{buzz}{buzz}"Expand pos
End Sub
Private Sub Expand(incoming As Range, Optional depth = 1)Dim sub_range As RangeDim end_pos As Longend_pos = incoming.EndWith incoming.Find.ClearFormatting.MatchWildcards = True.Forward = True.Wrap = wdFindStopEnd WithDo While incoming.Find.Execute("\{*\}")If incoming.Start < incoming.End ThenDebug.Print "Replaced " & incoming.Text & " at " & depthend_pos = end_pos + ProcessReplacement(incoming)Set sub_range = incoming.DuplicateExpand sub_range, depth + 1incoming.End = end_posincoming.Start = sub_range.End - 1End IfLoop
End Sub
Private Function ProcessReplacement(replacing As Range) As LongDim len_cache As Longlen_cache = Len(replacing.Text)If replacing.Text = "{more}" Thenreplacing.Text = "{foo}{evenmore}{bar}"ElseIf replacing.Text = "{evenmore}" Then'This kind of works.replacing.Text = "{fizzbuzz} "'This doesn't work at all.
'        replacing.Text = "{fizzbuzz}"Elsereplaced = replaced + 1replacing.Text = "<" & replaced & ">"End IfProcessReplacement = Len(replacing.Text) - len_cache
End Function

第一个问题是我无法想象如何将.Find.Execute限制在正确的范围内.这就是文档和输出的样子({fizzbuzz}之后的空格 – 后面会有更多内容):

Document text: <1><2><3><4> <5><6><7>
Output:
Replaced {fizz} at 1
Replaced {fizz} at 1
Replaced {more} at 1
Replaced {foo} at 2
Replaced {evenmore} at 2
Replaced {fizzbuzz} at 3
Replaced {bar} at 2
Replaced {buzz} at 2    <---This was outside of the range at that depth.
Replaced {buzz} at 1

如果我在{fizzbuzz}之后取出空间,它甚至不会匹配,即使我在监视窗口中确认它基本上是该函数在替换后递归时的范围内容.没有空格的输出:

Document text: <1><2><3>{fizzbuzz}<4><5><6>
Output:
Replaced {fizz} at 1
Replaced {fizz} at 1
Replaced {more} at 1
Replaced {foo} at 2
Replaced {evenmore} at 2
Replaced {bar} at 3  <---No clue how this happens - wdFindStop is ignored.
Replaced {buzz} at 3
Replaced {buzz} at 3

预期输出(有或没有空格):

Document text: <1><2><3><4><5><6><7>
Output:
Replaced {fizz} at 1
Replaced {fizz} at 1
Replaced {more} at 1
Replaced {foo} at 2
Replaced {evenmore} at 2
Replaced {fizzbuzz} at 3
Replaced {bar} at 2
Replaced {buzz} at 1
Replaced {buzz} at 1

有人看到我遗失的任何东西吗?

最佳答案 Word的查找行为非常奇怪.

除了其他特性之外,如果您的搜索文本与Range的文本完全匹配,则忽略Wrap选项,并根据此article重新定义搜索范围:

When the Find object .Execute method determines that the thing to find exactly matches the search range, the search range is dynamically redefined. The new search range starts at the end of the old search range and ends at the end of the document (or targeted storyRange). Processing continues in the redefined range.

这就是{fizzbuzz}(带尾随空格)的原因 – 它不是完全匹配的原因.

您需要调整代码来处理:

> Range.Text是通配符搜索的完全匹配,和/或:
>调用Execute后,检查Range的开始是否在预期结束之前.

通过在每个Execute调用之前和之后以及每个Text分配之前和之后添加Range.Select语句,可以看到Range更改的操作

无法获得递归Range.Find在Word VBA中工作相关推荐

  1. Word VBA中的光标操作

    一. 光标对象及其位置属性 在Word VBA中,光标对象的名称为Selection.一个Selection实际上由两个位置指示器组成,其中一个指示器称为Start,一个指示器称为End,分别代表光标 ...

  2. 为什么selection.find在word vba中不返回所有结果?_工作表查询中,内连接Inner join的讲解...

    大家好,我们继续讲解VBA数据库解决方案,今日讲解第56讲内容: 数据表查询中,内连接Inner join的讲解.从这讲开始给大家实例讲解在查询中各种连接方式的应用.为什么到现在才讲解这块内容呢?是的 ...

  3. Word VBA:结合网友的自定义函数对汉字批量增 / 删拼音

    一.已有方法 1.Word中有对汉字加拼音的方法--拼音指南 拼音指南 通过这种方法手动加拼音是有字符串长度的限制的,因此很多网友基于此也写过VBA自动化批量添加拼音的方法. 常规方法代码截图 2.常 ...

  4. Word VBA:批量导出Visio对象为图片

    目录 一.思路 1.遍历文档中的域fd 2.判断每一个域fd 3.二进制存储 二.示例代码 1.代码 2.运行效果 (1)示例文件 (2)复制代码-运行 (3)选择存储位置 (4)存储完成 (5)查看 ...

  5. word vba 打开弹出msgbox,每隔10秒刷新一次域值。

    word vba 打开弹出msgbox,每隔10秒刷新一次域值. Option Explicit'Private WithEvents WdApp As Word.Application'Public ...

  6. Word 2010 中的 VBA 入门

    摘要:  介绍新程序员使用 Visual Basic for Applications (VBA) 编程来扩展 Microsoft Word 2010.本主题汇总了 VBA 语言.有关如何访问 Wor ...

  7. VBA中关于WORD的基本应用 比如批量改页眉页脚,从文件名取数字作为页眉等等。

    VBA中关于WORD的基本应用 比如批量改页眉页脚,从文件名取数字作为页眉等等. 以下是代码,直接在Word的VBA编辑器里粘贴上去就OK了. Sub 批量转PDF() Dim i As Varian ...

  8. Word VBA 宏 Bookmarks 报错5828 错误的书签名称 解决办法

    问题描述: 在用 Word VBA 编写自动添加书签的宏时,出现以下错误: 代码: Sub AddBookmark(prefix As String)Selection.HomeKey Unit:=w ...

  9. Word VBA 常用语句

    原文地址:Word VBA 常用语句作者:cathay 转帖:从n多地方google出来的......... '定制模块行为 '(1)强制对模块内所有变量进行声明    Option Explicit ...

最新文章

  1. FIR.im Weekly - 上周微博热转资源精选
  2. Jmeter CSV 参数化/检查点/断言
  3. python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05...
  4. xshell1分钟就会自动断_手术室自动门不能正常控制开关门维修案例
  5. MVC三层架构在各框架中的特征
  6. 理解 static 关键字
  7. html段落排版,美化网页段落排版的css教程
  8. 计算机驱动程序检测,驱动人生(检测电脑硬件自动安装驱动程序)
  9. 8个免费恶搞照片在线生成网站
  10. 通达OA工作流插件--保存OA流程中的所有附件+流程表单到指定目录(2013adv,2015,2016)
  11. iOS 第三方登录之 微信登录
  12. Google 常用镜像收集
  13. 吴彩强:从表征到行动---意向性的自然主义进路
  14. Java 拆分PDF文档
  15. 第三章数程序设计初步--分支结构项目3利息计算器
  16. 为PANDA制作的DWI按扫描次数分类的toolkit
  17. SE:17.网络编程
  18. SCEF引入需求分析及部署应用【转】
  19. Python列表数字元素加权和
  20. STM32自学笔记-6-RS485串口通信

热门文章

  1. 互动作业组的计算机在哪,互动作业和作业互动组区别介绍 看起来有很相似
  2. CentOS7.6(1810)安装
  3. 电容笔和Apple pencil的区别?双十一值得买电容笔排行榜
  4. 【英译中】如何拍好沙滩照2——2014年7月24日
  5. 开发框架文档体系化的思考
  6. iOS证书及描述文件制作流程
  7. flutter file_picker文件选择器具体用法
  8. 中国偶氮二异丁腈市场供需动态与投资前景展望报告(新版)2022-2027年
  9. 微信或企业微信实现扫码登录的三种方式
  10. Unity中Switch的用法