ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: kerry786032

[分享] 遍历文章段落的时候跳过表格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-3-17 13:24 来自手机 | 显示全部楼层
413191246se 发表于 2018-3-17 13:14
* 楼主,你的态度很好,钻研精神可嘉!谢谢!
* 但是,楼主你的代码,我测试以后,发现文档没有任何变化, ...


他这跳过表格的代码,基本属于初级阶段。呵呵!最佳的算法是:定义一个 指针 ,首先 指针指向文档首,遍历指针 直到文档尾部(反过来也可以定义文档尾指针,然后向上遍历)如果 指针 指向了 表格 那么立即跳过 整个表格 而指向 非表格段落。

TA的精华主题

TA的得分主题

发表于 2018-3-17 14:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
413191246se 发表于 2018-3-17 13:06
楼主,请参见我的代码:http://club.excelhome.net/thread-1389169-1-1.html

几天周末,分享一下我的代码,并做了详细注释!
  1. Sub Skip_Table()
  2. '    本代码是由文档的首部向下遍历非表格段落直到文档尾部,如果需要从文档尾部向上遍历到文档首部,代码完全类似!
  3.     Dim d As Document
  4.     Set d = ActiveDocument
  5.     With d.Range(0, 0) '用With结构定义了一个指针变量并初始化指向文档首,也可以定义一个指针变量Dim p as Range
  6.         Do While .End < d.Content.End - 1 '如果指针指向的地址不是文档尾部的地址,那么进入循环
  7.             If .Information(12) Then '如果指针指向的地址为表格的首地址,那么:
  8.                 .Expand 15: .Move       '指针跳过整个表格而指向该表格之后的段落首地址
  9.             Else
  10. '                根据具体需求,对该段落进行操控!
  11.                 With .Paragraphs(1).Range     '定义另外一个指针而指向整个段落
  12.                     .Font.Name = "黑体"
  13.                     .Bold = -1
  14.                     .Font.Size = 20
  15.                 End With
  16.                 .Move 4                         '指针指向下一个段落首地址
  17.             End If
  18.         Loop                                      '循环到Do开始
  19.     End With
  20. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-3-17 16:26 | 显示全部楼层
duquancai 发表于 2018-3-17 14:02
几天周末,分享一下我的代码,并做了详细注释!

杜前辈好!
第一次见您带注释的代码!虽然不懂,还是惊喜!

TA的精华主题

TA的得分主题

发表于 2018-3-18 06:19 | 显示全部楼层
413191246se 发表于 2018-3-17 13:17
* 楼主,我昨天下午重新写了 3 种跳过表格只处理文字的代码,请参考:

师傅好!
3个一起收藏了!谢谢!

TA的精华主题

TA的得分主题

发表于 2018-3-18 10:20 | 显示全部楼层
* 谢谢 杜先生!辛苦了!
* 去年,就得到 杜先生 不厌其烦的帮助,写了不少关于设置标题2345的代码,内心十分感激。
* 杜先生 去年写了两段《正则表达式》代码,一个是修改格式,一个是查找替换,最近我认真对比后,觉得喜欢第一段代码(修改格式);但也不大会用,感觉是正则表达式比WORD查找替换还是会快上许多;
* 周五下午,我重新写了 3 段《处理表格外段落》的代码,对比了一下运行时间,选了最快的,也是最简单的方法:首先选中第1段,然后,用 Do...Loop 循环,一旦光标落到表格中,就选择表格下面一段文字,但循环到最后一段,停不下来,只好先在文尾插入一个字符`来,再删除,速度还是比较快的;但与昨晚 杜先生 代码一比较,还是败下阵来,决定采用 杜先生 的这段《指针》代码;杜先生 做了详细的注释,但我还是不大理解,因为本人太愚钝了!
* 下面是我周五最快的一种跳过表格的代码,让 杜先生 见笑了!——并请 杜先生 注意休息,适当给我们指导帮助:
  1. Sub test()
  2. '目标:设置表格外段落!
  3.     Dim d As Document
  4.     Set d = ActiveDocument
  5.     d.Content.InsertAfter Text:="`"
  6.     d.Paragraphs(1).Range.Select
  7.     With Selection
  8.         Do
  9.             If .Information(wdWithInTable) = False Then
  10.                 With .Font
  11.                     .Name = "黑体"
  12.                     .Bold = -1
  13.                     .Size = 20
  14.                 End With
  15.                 If Selection Like "*`*" Then Exit Do
  16.                 .Next(unit:=wdParagraph, Count:=1).Select
  17.             Else
  18.                 .Tables(1).Range.Next(unit:=wdParagraph, Count:=1).Select
  19.             End If
  20.         Loop
  21.     End With
  22.     d.Characters.Last.Previous.Delete
  23. End Sub
  24. Sub a计算宏运行所用时间()
  25.     Dim t As Single
  26.     t = Timer
  27.     test '宏名------杜先生 .5'/.29/.437       我的代码 .468/.437/.390
  28.     MsgBox "OK!用时 " & Timer - t & " 秒!", vbOKOnly + vbExclamation, "计算宏运行所用时间"
  29. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-3-18 11:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
413191246se 发表于 2018-3-18 10:20
* 谢谢 杜先生!辛苦了!
* 去年,就得到 杜先生 不厌其烦的帮助,写了不少关于设置标题2345的代码,内心 ...

只是针对你说的:“进入死循环”,我在你的代码基础上修改如下
  1. Sub test()
  2. '    目标:设置表格外段落!
  3.     Dim d As Document
  4.     Set d = ActiveDocument
  5.     d.Paragraphs(1).Range.Select
  6.     With Selection
  7.         Do While .End < d.Content.End - 1
  8.             If .Information(wdWithInTable) = False Then
  9.                 With .Font
  10.                     .Name = "黑体"
  11.                     .Bold = -1
  12.                     .Size = 20
  13.                 End With
  14.                 .Next(unit:=wdParagraph, Count:=1).Select
  15.             Else
  16.                 .Tables(1).Range.Next(unit:=wdParagraph, Count:=1).Select
  17.             End If
  18.         Loop
  19.     End With
  20. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-3-18 13:54 | 显示全部楼层
* 呵呵!不好意思!杜先生——你的代码败北了!
* 我决定还是采用我原来的原创《跳过表格只处理文本》代码。
* 杜先生 也不妨测试一下,全部代码如下:(请注意看宏运行时间比较,在处理有表格文档时)
  1. Sub a计算宏运行所用时间()
  2.     Dim t As Single
  3.     t = Timer
  4.     test '宏名------杜先生 6.39/6.21/6.31       我的代码----1.76/1.76/1.42
  5.     MsgBox "OK!用时 " & Timer - t & " 秒!", vbOKOnly + vbExclamation, "计算宏运行所用时间"
  6. End Sub
  7. Sub test_du()
  8.     Dim d As Document, t As Table
  9.     Set d = ActiveDocument
  10.     With d
  11.         For Each t In .Tables
  12.             With t.Range
  13.                 .Rows.WrapAroundText = False '取消表格环绕
  14.                 .Rows.Alignment = wdAlignRowCenter
  15.                 .Font.Name = "仿宋_GB2312"
  16.                 .Font.Name = "Times New Roman"
  17.             End With
  18.         Next
  19.         With .Range(0, 0)
  20.             Do While .End < d.Content.End - 1
  21.                 If .Information(12) Then
  22.                     .Expand 15: .Move
  23.                 Else
  24.                     With .Paragraphs(1).Range
  25.                         .Select
  26.                         正文样式
  27.                         If Len(Selection) = 1 And Asc(Selection) = 13 Then .Delete: GoTo skip '分页符后面的回车符删不掉!
  28.                     End With
  29.                     .Move 4
  30.                 End If
  31. skip:
  32.             Loop
  33.         End With
  34.     End With
  35. End Sub
  36. Sub test()
  37.     On Error Resume Next
  38.     Dim doc As Document, t As Table, i As Paragraph, j&, k&, r As Range, v&
  39.     Set doc = ActiveDocument

  40.     If doc.Paragraphs(1).Range.Information(wdWithInTable) = False Then
  41.         Selection.HomeKey unit:=wdStory
  42.         doc.Tables.Add Range:=Selection.Range, NumRows:=1, NumColumns:=1
  43.         v = 1
  44.     End If

  45.     For Each t In doc.Tables
  46.         With t.Range
  47.             .Rows.WrapAroundText = False
  48.             .Rows.Alignment = wdAlignRowCenter
  49.             .Font.Name = "仿宋"
  50.             .Font.Name = "Times New Roman"
  51.             .Previous(unit:=wdParagraph, Count:=1).Characters.Last.InsertBefore Text:="`"
  52.         End With
  53.     Next
  54.     doc.Content.InsertAfter Text:="`"

  55.     k = doc.Tables.Count
  56.     Do
  57.         j = j + 1
  58.         doc.Tables(j).Range.Next(unit:=wdParagraph, Count:=1).Characters(1).Select
  59.         Selection.MoveEndUntil cset:="`", Count:=wdForward
  60.         Selection.MoveEnd unit:=wdCharacter, Count:=2
  61.         
  62.         正文样式
  63.         Selection.Characters.Last.Previous.Delete

  64.         Set r = Selection.Range
  65.         For Each i In r.Paragraphs
  66.             If Len(i.Range) = 1 And Asc(i.Range) = 13 Then i.Range.Delete
  67.         Next
  68.         r.Select
  69.     Loop Until j = k
  70.     If v = 1 Then doc.Tables(1).Delete
  71. End Sub
  72. Sub 正文样式()
  73. '更新
  74.     With Selection
  75.         .ClearFormatting
  76.         CommandBars.FindControl(ID:=122).Execute
  77.         CommandBars.FindControl(ID:=123).Execute
  78.         With .Font
  79.             .Name = "仿宋_GB2312"
  80.             .Name = "Times New Roman"
  81.             .Size = 16
  82.             .Color = wdColorBlue
  83.             .Kerning = 0
  84.             .DisableCharacterSpaceGrid = True
  85.         End With
  86.         With .ParagraphFormat
  87.             .LineSpacing = LinesToPoints(1.25)
  88.             .CharacterUnitFirstLineIndent = 2
  89.             .AutoAdjustRightIndent = False
  90.             .DisableLineHeightGrid = True
  91.         End With
  92.     End With
  93. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-3-18 14:31 | 显示全部楼层
* 杜先生,请有空指导一下,假设现在要设置所有表格外段落:
* 有两种方式:
* 第一种:表1/文1/表2/文2/表3/文3
* 第二种:文1/表1/文2/表2/文3/表3
* 如何选定文1、文2、文3设置蓝色,要选定文字区域,不逐段设置
*** 最终幻想:既然不连续的表格能一次全部选定,为何文字不能一次选定而一次设置格式呢?
* 请 杜先生 指教(我试了,一次选定所有文字区域,当然按住CTRL键,能一次设置为正文样式)。
* 附《全选表格》代码:
  1. Sub 表格全选()
  2.     Dim doc As Document, t As Table
  3.     Set doc = ActiveDocument
  4.     With doc
  5.         .DeleteAllEditableRanges wdEditorEveryone
  6.         For Each t In .Tables
  7.             t.Range.Editors.Add wdEditorEveryone
  8.         Next
  9.         .SelectAllEditableRanges wdEditorEveryone
  10.         .DeleteAllEditableRanges wdEditorEveryone
  11.     End With
  12. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-3-18 14:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 413191246se 于 2018-3-18 18:13 编辑

(略)。。。。。。

TA的精华主题

TA的得分主题

发表于 2018-3-18 14:36 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-28 20:04 , Processed in 0.046874 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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