ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 获取不连续区域的文本

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-6-25 23:03 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 loquat 于 2015-6-25 23:10 编辑

看这个帖子中守柔大侠的代码有感,写了个获取不连续区域文本的宏:
http://club.excelhome.net/forum.php?mod=viewthread&tid=200648&page=1#pid1322412
刚好也有朋友问到怎么不使用剪贴板实现这个代码的功能:
  1. Sub 获取不连续字符()
  2.      On Error Resume Next
  3.      Dim MyData As Object
  4.      Set MyData = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
  5.      Selection.Copy
  6.      MyData.GetFromClipboard
  7.      t = MyData.GetText
  8.      For i = 0 To UBound(Split(t, Chr(13))) - 1
  9.        t1 = t1 & Split(t, Chr(13) & Chr(10))(i)
  10.      Next i
  11.      MsgBox t1
  12.      Set MyData = Nothing
  13. End Sub
复制代码
以上代码为liuhoubin168提供
以下是小弟loquat的代码:
以下代码一:执行效率还行,但是有个问题,执行完毕后不会恢复代码执行前的选取状态
以下代码二:执行效率比较低,但是没有上述不足之处
以上代码都有个BUG:当选取包含了文档末尾的段落标记时,运行将会出错。
容后有空再修正。
  1. Sub 获取不连续区域文本一()
  2. Dim aRange As Word.Range, docEnd&, aBool As Boolean, aStr$
  3. If Application.Version < 11 Then Exit Sub  '判断当前Word应用程序版本,如低于2003则退出
  4. If Selection.type <> wdSelectionNormal Then Exit Sub      '如果所选内容为非常规文本则退出
  5. With ActiveDocument
  6.     If .ProtectionType <> wdNoProtection Then Exit Sub    '如果文档处于保护状态时则退出
  7.     Application.ScreenUpdating = False
  8.     aBool = .ActiveWindow.View.ShowHiddenText
  9.     .ActiveWindow.View.ShowHiddenText = True  '显示隐藏文字
  10.     .ActiveWindow.View.ShadeEditableRanges = False '不显示用户可编辑区域的底纹
  11.     Set aRange = .Content
  12.     docEnd = aRange.End - 1
  13.     With aRange.Find
  14.         .ClearFormatting     '清除查找格式
  15.         .Font.Hidden = True  '查找隐藏文字
  16.         Do While .Execute = True '成功查找时
  17.             Set aRange = .Parent '重置Range对象,为查找到的目标区域
  18.             aRange.Editors.Add wdEditorEveryone  '使用可编辑区域保存原始隐藏文字
  19.             aRange.Font.Hidden = False  '取消隐藏文字属性
  20.             aRange.SetRange aRange.End, docEnd  '重置Range对象
  21.         Loop
  22.     End With
  23.     Selection.Font.Hidden = True  '设置选择区域隐藏文字属性
  24.     Set aRange = .Content         '再次全文搜索
  25.     With aRange.Find
  26.         .ClearFormatting
  27.         .Font.Hidden = True  '查找隐藏文字
  28.         Do While .Execute = True
  29.             Set aRange = .Parent
  30.             aStr = aStr & aRange.Text
  31.             aRange.Font.Hidden = False  '恢复原选区隐藏文字属性
  32.             aRange.SetRange aRange.End, docEnd   '重置Range对象
  33.         Loop
  34.     End With
  35.     MsgBox aStr  '返回原选区文字
  36.     .SelectAllEditableRanges
  37.     Selection.Font.Hidden = True  '恢复原始的隐藏文字
  38.     .DeleteAllEditableRanges wdEditorEveryone  '删除所有可编辑区域
  39.     .ActiveWindow.View.ShowHiddenText = aBool
  40.     Application.ScreenUpdating = True
  41. End With
  42. End Sub
复制代码
  1. Sub 获取不连续区域文本二()
  2. Dim aRange As Word.Range, docEnd&, aBool As Boolean, aStr$
  3. Dim aBookmark As Word.Bookmark, k&
  4. If Application.Version < 11 Then Exit Sub  '判断当前Word应用程序版本,如低于2003则退出
  5. If Selection.type <> wdSelectionNormal Then Exit Sub      '如果所选内容为非常规文本则退出
  6. With ActiveDocument
  7.     If .ProtectionType <> wdNoProtection Then Exit Sub    '如果文档处于保护状态时则退出
  8.     Application.ScreenUpdating = False
  9.     aBool = .ActiveWindow.View.ShowHiddenText
  10.     .ActiveWindow.View.ShowHiddenText = True  '显示隐藏文字
  11.     .ActiveWindow.View.ShadeEditableRanges = False '不显示用户可编辑区域的底纹
  12.     Set aRange = .Content
  13.     docEnd = aRange.End - 1
  14.     With aRange.Find
  15.         .ClearFormatting     '清除查找格式
  16.         .Font.Hidden = True  '查找隐藏文字
  17.         Do While .Execute = True '成功查找时
  18.             Set aRange = .Parent '重置Range对象,为查找到的目标区域
  19.             aRange.Editors.Add wdEditorCurrent  '使用当前用户可编辑区域保存原始隐藏文字
  20.             aRange.Font.Hidden = False  '取消隐藏文字属性
  21.             aRange.SetRange aRange.End, docEnd  '重置Range对象
  22.         Loop
  23.     End With
  24.     Selection.Font.Hidden = True  '设置选择区域隐藏文字属性
  25.     Set aRange = .Content         '再次全文搜索
  26.     With aRange.Find
  27.         .ClearFormatting
  28.         .Font.Hidden = True  '查找隐藏文字
  29.         k = 0
  30.         Do While .Execute = True
  31.             Set aRange = .Parent
  32.             aStr = aStr & aRange.Text '保存原选区文字
  33.             aRange.Bookmarks.Add "_myTemp" & Format(k, "000"), aRange  '使用书签保存原始选区
  34.             aRange.Font.Hidden = False  '恢复原选区隐藏文字属性
  35.             aRange.SetRange aRange.End, docEnd   '重置Range对象
  36.             k = k + 1
  37.         Loop
  38.     End With
  39.     .SelectAllEditableRanges wdEditorCurrent
  40.     .DeleteAllEditableRanges wdEditorCurrent  '删除当前用户可编辑区域
  41.     Selection.Font.Hidden = True  '恢复原始的隐藏文字
  42.     For Each aBookmark In .Bookmarks
  43.         If Left(aBookmark.Name, 7) = "_myTemp" Then
  44.             aBookmark.Range.Editors.Add wdEditorCurrent
  45.             aBookmark.Delete '删除书签
  46.         End If
  47.     Next
  48.     .SelectAllEditableRanges wdEditorCurrent   '恢复原始选区
  49.     .DeleteAllEditableRanges wdEditorCurrent   '删除当前用的可编辑区域
  50.     .ActiveWindow.View.ShowHiddenText = aBool  '恢复隐藏文字是否显示选项
  51.     Application.ScreenUpdating = True
  52. End With
  53. MsgBox aStr  '返回原选区文字
  54. End Sub
复制代码




评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-7-28 08:52 | 显示全部楼层
mark。。。。。。。

TA的精华主题

TA的得分主题

发表于 2020-2-24 21:45 | 显示全部楼层
盼望完善,继续关注后续行动,向大虾学习了!!

TA的精华主题

TA的得分主题

发表于 2020-2-25 10:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
写代码的老师不少,代码后带中文注释的不多,这是我等小白的福音!
老师如有空,请帮忙看一下,下面网址9楼上,我这个问题有不有办法解决,这个问题 weiyingde 老师也几次援手,不知什么原因我这儿就是运行不了。谢谢!
http://club.excelhome.net/thread-1486524-1-2.html

TA的精华主题

TA的得分主题

发表于 2020-2-27 23:03 | 显示全部楼层
可以试试如下借助文本格式(突出显示)处理的办法,如果文档中原有突出显示的,则原突出显示内容也被提取,此时可考虑用其他格式,如底纹,但用底纹格式的复原效果似乎不一样。只做了简单测试,未知其适应性。
  1. Sub test()
  2.     '提取不连续区域的选定文本
  3.     Dim i As Integer
  4.     Dim selectiontext As String
  5.     Options.DefaultHighlightColorIndex = wdYellow
  6.     Application.Run "highlight" '借助应用突出显示格式对选定文本做标记
  7.     If Selection.Type <> wdSelectionNormal Then
  8.         MsgBox "请选定区域!", vbCritical
  9.         Exit Sub
  10.     End If
  11.     With ActiveDocument.Range.Find
  12.         .ClearFormatting
  13.         .Highlight = True
  14.         Do While .Execute
  15.             i = i + 1
  16.             selectiontext = selectiontext & vbCrLf & String(3, ChrW(8251)) & .Parent.Text
  17.         Loop
  18.     End With
  19.     MsgBox "共选定了" & i & "个不连续区域,字符如下:" & vbCrLf & selectiontext
  20.     Application.ActiveDocument.Undo '恢复原状
  21. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-2-28 07:16 | 显示全部楼层
sylun 发表于 2020-2-27 23:03
可以试试如下借助文本格式(突出显示)处理的办法,如果文档中原有突出显示的,则原突出显示内容也被提取, ...

老师好!
你这个思路很别致!还有不有办法不让它包含段落符在内,把段落符排除在外?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 14:25 , Processed in 0.035372 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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