ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享]对非连续文本区域的研究与探索

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-2-25 12:28 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
对非连续文本区域的研究与探索:


本主题探索在WORD VBA中,返回或选定多个非连续区域的文本内容.


我研究了两个方法:一是利用剪贴板与DATAOBJECT的转换,并通过数组取得全部或者指定文本;二是利用在原文档中的粘贴和撤消功能来完成.


第二个问题,是如何选定多个指定的非连续区域,也许对于实际操作而言,没有实际意义,只要在循环中找到该RANGE对象,便可执行相应操作;但这是一个研究和探索.在WORD中,通常有两种方法可以完成:一是查找操作,将指定的文本进行查找并突出显示,便可全部选定,但可惜的是,我未找到相应的代码(方法语句)支持;第二种便是通过选择格式相似的文本命令,进行操作,但一直有个问题,就是在连续代码中,会出现不是你想要的结果,而是需要手动运行第二个过程(SSF过程),也许这是一个BUG,我不知道.


'* +++++++++++++++++++++++++++++
'* Created By I Love You_Word!@ExcelHome 2005-2-25 12:28:36
'仅测试于System: Windows NT Word: 10.0 Language: 2052
'^The Code CopyIn [ThisDocument-ThisDocument]^'
'* -----------------------------


Option Explicit
Sub GetmultiRange1()
'要求返回所选定文本的区域数(非连续选定块),并取得所有文本的连续内容
    Dim TxtString() As String, OldEndRange As Long, NewEndRange As Long
    Dim MyRange As Range, aString As Variant, MyString As String, SelCount As Integer
    With ActiveDocument
        OldEndRange = .Content.End - 1    ''获得原文档的终点位置(不包括最后的段落标记)
        With Selection
            If .Type = wdSelectionIP Then Exit Sub    '如果是光标则退出
            Application.ScreenUpdating = False    '关闭屏幕更新
            .Copy    '复制
            .EndKey wdStory    '移动到文档末尾
            .Paste    '粘贴
        End With
        NewEndRange = .Content.End - 1    '获得新文档的终点位置(不包括最后的段落标记)
        Set MyRange = .Range(OldEndRange, NewEndRange)    '定义一个新的Range对象
        TxtString = VBA.Split(MyRange, Chr(13))    '以段落标记为分隔符生成一个一维数组
        .Undo 1    '撤消一次操作(即粘贴)
        For Each aString In TxtString    '在含有所选内容的数组中循环
            MyString = MyString & aString    '文本累加
        Next
        SelCount = UBound(TxtString)    '取得上标(下标为零开始的数组)+1
        If SelCount = 0 Then
            MsgBox "您选定了一块区域!", vbOKOnly + vbInformation, "Microsoft Word"
        Else
            MsgBox "您选定了" & SelCount & "块不连续区域!", vbOKOnly + vbInformation, "Microsoft Word"
        End If
        MsgBox MyString    '取得选定内容
        Application.ScreenUpdating = True    '恢复屏幕更新
    End With
End Sub
'----------------------
'注意:运行此过程(GetmultiRange2)前必须引用MSForms
'即VBE/工具/引用:Microsoft Forms 2.0 Object Library (C:\WINNT\system32\FM20.DLL)
Sub GetmultiRange2()
    Dim MyData As DataObject, MyString As String
    Dim MyText() As String, aString As Variant, SelText As String
    If Selection.Type = wdSelectionIP Then Exit Sub    '如果未选中则退出程序
    Set MyData = New DataObject    '引用新的DataOject
    Selection.Copy    '选定内容复制
    MyData.GetFromClipboard    '从剪贴板复制数据到 DataObject
    MyString = MyData.GetText(1)    '获得DataObject的无格式文本
    MyText = VBA.Split(MyString, vbCrLf)    '取得一个以VBCRLF为分隔符的数组
    For Each aString In MyText    '在该数组中循环
        SelText = SelText & aString   '取得所有选定的文本内容
    Next
    MsgBox SelText
End Sub
'----------------------
Sub Sample()
'要求将文档同所有相同内容的文本选定,并计数
    Dim SearchText As String, i As Integer
    SearchText = "我"    '指定搜索内容
    With ActiveDocument.Content.Find
        .ClearFormatting
        .Font.Color = wdColorAutomatic
        .Text = SearchText
        With .Replacement
            .ClearFormatting
            .Text = SearchText
            .Font.Color = wdColorWhite
        End With
        Do While .Execute(Replace:=wdReplaceOne)
            i = i + 1 '循环计数
        Loop
    End With
    MsgBox "WORD找到了" & i & "个指定搜索项目!", vbOKOnly + vbInformation, "Microsoft Word"
    '    Call SSF'这里有个BUG,只能手工运行SSF,可选定该指定查找项目
End Sub
'----------------------
Sub SSF()
'选定全部带红色底纹的字体格式的文本
    With Selection
        .HomeKey wdStory    '移到文档首
        With .Find
            .ClearFormatting    '清除格式
            '查找字体底纹为红色格式
            .Font.Color = wdColorWhite
            .Format = True
        End With
        .Find.Execute    '查找
    End With
    Application.Run "SelectSimilarFormatting"
End Sub
'----------------------
Sub FindText()
    Dim MyDialog As Dialog
    On Error Resume Next
    '清除格式
    ActiveDocument.Content.Find.ClearFormatting
    Set MyDialog = Application.Dialogs(112)    '查找对话框
    Application.ScreenUpdating = False    '关闭屏幕更新
    With MyDialog
        .Find = "Test"
        SendKeys "{TAB}", False    '预置
        SendKeys "+{+}", False    '预置(突出显示所有在该范围内找到的项目)
        SendKeys "f", False    '预置(查找全部)
        SendKeys "{ESC}", False    '预置取消
        .Show    '开启
    End With
    '恢复屏幕更新
    Application.ScreenUpdating = True
End Sub
'----------------------


[此贴子已经被konggs于2006-8-30 9:13:10编辑过]

TA的精华主题

TA的得分主题

发表于 2005-2-25 17:52 | 显示全部楼层

完全看不懂了,也没精力跟进了......

对斑竹的崇拜和支持永远依旧

TA的精华主题

TA的得分主题

发表于 2005-3-1 19:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

守柔,我不懂你编这个程序的用意。

我理解的是在文档中选中不同区域的文字,这个好象不用编程也能搞定呀。

但我相信你一定有你的用意的。

我照顶不误。

TA的精华主题

TA的得分主题

发表于 2005-3-2 09:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
是不是碰到真正的高手?这么多编的各种各样WORD的VBA,可惜看不懂,守老师怎样使笨蛋的学生对WORD,EXCEL的VBA了如指掌呢。当然笨蛋学生对WORD和EXCEL常用,而且反复做了不同的文件如同像机器人。如果我用了宏,什么都不怕多好。[em03]

TA的精华主题

TA的得分主题

发表于 2005-3-2 10:08 | 显示全部楼层
以下是引用忙碌h在2005-3-2 9:35:00的发言: 是不是碰到真正的高手?这么多编的各种各样WORD的VBA,可惜看不懂,守老师怎样使笨蛋的学生对WORD,EXCEL的VBA了如指掌呢。当然笨蛋学生对WORD和EXCEL常用,而且反复做了不同的文件如同像机器人。如果我用了宏,什么都不怕多好。[em03]

嘻嘻,快拜守柔GG为师呀,然后学他的认真劲,再狠啃VBA的书就行了。

祝你早日修成正果。

TA的精华主题

TA的得分主题

发表于 2005-3-2 10:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

真怕学生没什么耐心啃VBA.尽力~~~~谢谢如意~

TA的精华主题

TA的得分主题

发表于 2005-6-8 08:18 | 显示全部楼层
太好了,为了感谢版主,就天特送上了小花

TA的精华主题

TA的得分主题

发表于 2005-6-8 08:37 | 显示全部楼层
这样的操作是有用的,比如我们教师在出试卷时,在每一个试题上同时给出答案并标记为FONTCOLOR=WDCOLORRED。最后用上面的。Sub SSF()Sub GetmultiRange1() 略加以修改就可以在试卷的未尾生成标准答案。
[此贴子已经被作者于2005-6-8 8:57:22编辑过]

TA的精华主题

TA的得分主题

发表于 2009-4-21 11:23 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-11-21 18:42 | 显示全部楼层
FindText 这个过程很实用,感谢楼主
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 23:06 , Processed in 0.045702 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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