ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 提速乐!Move4 远远快于 ForEachNext(循环遍历所有段落)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-14 22:01 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 413191246se 于 2019-10-14 23:36 编辑

* 特别感谢 小花鹿 老师!前一段 老师 总说 Move 4,当时没太重视,前几天偶然试验,发现提速秘密。
* 经过对比测试,在循环遍历每个段落时,“.Move 4”(4 是“段落”的值)方法远远快于 ForEachNext方法。
  1. Sub Move4()
  2. '循环遍历所有段落
  3. '.Move 4 进入表格可以马上跳出/ForEachNext不能跳出
  4. '.Move 4/极速/远远快于 ForEachNext
  5. '.Move 4=.05秒/ForEachNext=.40秒/有表格/极速
  6. '.Move 4=.05秒/ForEachNext=.33秒/无表格
  7.     Dim doc As Document
  8.     Set doc = ActiveDocument
  9.     With Selection
  10.         .HomeKey 6
  11.         Do
  12.             .Move 4
  13.             If .Information(12) Then .Start = .Tables(1).Range.Next.Start
  14.             .Paragraphs(1).Range.Font.Color = wdColorRed '红色
  15.         Loop Until .Paragraphs(1).Range.End = doc.Content.End
  16.     End With
  17. End Sub
  18. Sub ForEachNext()
  19. '循环遍历所有段落
  20.     Dim i As Paragraph
  21.     For Each i In ActiveDocument.Paragraphs
  22.         With i.Range
  23.             If Not .Information(12) Then
  24.                 .Font.Color = wdColorRed '红色
  25.             End If
  26.         End With
  27.     Next
  28. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-14 22:05 | 显示全部楼层
* 删除空行宏:.Move 4 方法也快于 ForEachNext 方法:(我要将所有 ForEachNext 宏重写为 .Move 4)
  1. Sub 删除空行()
  2. '.Move 4=.34'快于ForEachNext=.56'
  3.     With Selection
  4.         .HomeKey 6
  5.         Do
  6.             If .Information(12) Then
  7.                 .Start = .Tables(1).Range.Next.Start
  8.             Else
  9.                 If .Paragraphs(1).Range.Text = vbCr Then .Paragraphs(1).Range.Delete Else .Move 4
  10.             End If
  11.         Loop Until .Paragraphs(1).Range.End = ActiveDocument.Content.End
  12.     End With
  13. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-10-14 22:38 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-14 22:52 | 显示全部楼层
本帖最后由 413191246se 于 2019-10-14 23:14 编辑

楼上朋友,好!——速度快啊!的确是提速了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-14 22:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 413191246se 于 2019-10-14 23:39 编辑

* 重要补充:由于刚才发帖时有些匆忙,考虑不周,再补充一下。* 区别:明显区别是前者光标移动,后者不移动;最重要区别是:Move4 进入表格后可以马上跳出!而 ForEachNext 却不能跳出。
* 刚才发现,Move 4 不是万能的,不能循环表格,而 ForEachNext 却可以。
* ".Move 4"方法的直观效果就是:光标到达下一个段落的段首。
* ".Move 4"方法:主要是在循环遍历所有(每个)段落时大放异彩,远远快于 ForEachNext;其它方面,还是得应用 For Each ... Next 方法来循环遍历集合中的每个元素。
*
* “全面取代”看来不成立!应该是在循环遍历每个段落这一点,可以取代。
* 希望各位朋友了解,谢谢大家!



TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-14 23:17 | 显示全部楼层

朋友,你好!——提速是关键。

TA的精华主题

TA的得分主题

发表于 2019-10-15 10:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-10-15 11:00 | 显示全部楼层
.Information(12) 改成 .tables.count 试一下会更快!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-15 20:15 | 显示全部楼层
* ming 老师:两个提议,我均不会用,可否给个示意代码?(Range也Move试了不行;.Information(12) 改成 .tables.count什么意思呢?)以逐段变红但跳过表格为例。

TA的精华主题

TA的得分主题

发表于 2019-10-16 21:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这样:
  1. Sub 删除空行()
  2.     With ActiveDocument.Range(0, 0)
  3.         Do
  4.             If .Tables.Count Then
  5.                 .Start = .Tables(1).Range.Next.Start
  6.             Else
  7.                 If .Paragraphs(1).Range.Text = vbCr Then .Paragraphs(1).Range.Delete Else .MoveStart 4
  8.             End If
  9.         Loop Until .Paragraphs(1).Range.End = ActiveDocument.Content.End
  10.     End With
  11. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 05:45 , Processed in 0.043841 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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