ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何通过VBA提取指定颜色的文字及其题号?

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-24 10:31 | 显示全部楼层
sylun兄说的是!期待中……

TA的精华主题

TA的得分主题

发表于 2009-5-24 12:03 | 显示全部楼层
看看这样的效果,我想基本可以了吧(如有编号域请手工处理):
Sub test6()
'没有选定内容则对全文档进行处理
Dim oDoc As Document, Doc As Document
Dim myRange As Range, tempRange As Range
Dim num%, i%, info$, num2%, myend&
On Error Resume Next
Application.ScreenUpdating = False
Set oDoc = ActiveDocument
Set Doc = Documents.Add
oDoc.Activate

Set myRange = IIf(Selection.Type = wdSelectionIP, ActiveDocument.Content, Selection.Range)
myRange.Select
With Selection.Find
    .ClearFormatting
    .Text = ""
    .Font.Color = wdColorRed  '答案内容以红色字体标注
    .Format = True
    .Replacement.ClearFormatting
    Do While .Execute
        If .Parent.End > myRange.End Then Exit Do
        num = Int(Val(.Parent.Paragraphs(1).Range.Text))
        Do While num = 0
            i = i + 1
            num = Int(Val(.Parent.Previous(wdParagraph, i).Text))
            If i > 10 Then Exit Do
        Loop
        Set tempRange = Doc.Bookmarks("\endofdoc").Range
        tempRange.FormattedText = .Parent.FormattedText
        Do While tempRange.Characters.First Like "[  ]"
            tempRange.Characters.First = ""
        Loop
        Do While tempRange.Characters.Last Like "[  ]"
            tempRange.Characters.Last = ""
        Loop
        If Len(tempRange) > 0 Then
            If tempRange Like "[!A-FA-F..、]" = False Then
                If tempRange.Characters.Last Like "[..、]" Then tempRange.Characters.Last.Delete
            End If
            If .Parent.Paragraphs(1).Range.End = myend Then
                tempRange.InsertBefore "  "
            Else
                tempRange.InsertBefore vbCrLf & IIf(num = num2, "", num & ".")
            End If
            num2 = num
        End If
        myend = .Parent.Paragraphs(1).Range.End
        i = 0
        If .Parent.End = myRange.End Then Exit Do
    Loop
End With

With Doc.Content
    .Characters.First.Delete
    With .Font
        .Color = wdColorAutomatic
        .Underline = wdUnderlineNone
        .Bold = False
        .Italic = False
    End With
    .ParagraphFormat.CharacterUnitLeftIndent = 0
    .ParagraphFormat.LeftIndent = 0
    With .Find
        .MatchWildcards = True
        .Execute "^13  ", replacewith:="^p", Replace:=wdReplaceAll
        Do While .Execute("([. ])([A-FA-F]@)[^13 ]", replacewith:="\1\2 ", Replace:=wdReplaceOne)
            .Parent.Collapse wdCollapseEnd
        Loop
        .Parent.WholeStory
        Do While .Execute("([. ][A-FA-F]@)  ([A-FA-F][^13 ])", replacewith:="\1\2", Replace:=wdReplaceOne)
            .Parent.Collapse wdCollapseStart
        Loop
        .Parent.WholeStory
        .Execute " ^13", replacewith:="^p", Replace:=wdReplaceAll
        .Execute "([. ][A-FA-F]@) ([0-9]@.[!A-FA-F])", replacewith:="\1^p\2", Replace:=wdReplaceAll
        .Execute "^13{2,}", replacewith:="^p", Replace:=wdReplaceAll
    End With
End With
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2009-5-24 12:09 | 显示全部楼层
谢谢sylun兄无私的帮助!终于达到了我想要的!有编号域也行了!可以结题!

[ 本帖最后由 chuhaiou 于 2009-5-24 12:18 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-24 20:30 | 显示全部楼层
总体效果很不错,运行速度很快!
能否对于选项不在同一段(行)的效果进行改进,如英文选择题中的第2、14小题;但如果在运行代码前将多段(行)选项中的前面选项后的段落标记替换为手动换行符,即只有一个段落,效果就很理想了。
能否请sylun兄再添加处理上述情况的代码?

[ 本帖最后由 tangqingfu 于 2009-5-24 20:48 编辑 ]

测试.rar

13.25 KB, 下载次数: 50

TA的精华主题

TA的得分主题

发表于 2009-5-24 22:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 tangqingfu 于 2009-5-24 20:30 发表
总体效果很不错,运行速度很快!
能否对于选项不在同一段(行)的效果进行改进,如英文选择题中的第2、14小题;但如果在运行代码前将多段(行)选项中的前面选项后的段落标记替换为手动换行符,即只有一个段落,效果就很 ...


替换就不想了,因为要准确判断哪些是选择题并非易事,反而容易导致错漏。还是保持程序不对原文档作任何改动吧,我想这应是基本原则。
再对原程序稍作修改,看看所说的问题是否能解决。当然,程序的适应性还不可能是百分百的,毕竟它只是基于文档字符特征的判断。
Sub test6a()
'没有选定内容则对全文档进行处理
Dim oDoc As Document, Doc As Document
Dim myRange As Range, tempRange As Range
Dim num%, i%, info$, num2%
On Error Resume Next
Application.ScreenUpdating = False
Set oDoc = ActiveDocument
Set Doc = Documents.Add
oDoc.Activate

Set myRange = IIf(Selection.Type = wdSelectionIP, ActiveDocument.Content, Selection.Range)
myRange.Select
With Selection.Find
    .ClearFormatting
    .Text = ""
    .Font.Color = wdColorRed  '答案内容以红色字体标注
    .Format = True
    .Replacement.ClearFormatting
    Do While .Execute
        If .Parent.End > myRange.End Then Exit Do
        num = Int(Val(.Parent.Paragraphs(1).Range.Text))
        Do While num = 0
            i = i + 1
            num = Int(Val(.Parent.Previous(wdParagraph, i).Text))
            If i > 10 Then Exit Do  '预防死循环
        Loop
        Set tempRange = Doc.Bookmarks("\endofdoc").Range
        tempRange.FormattedText = .Parent.FormattedText
        Do While tempRange.Characters.First Like "[  ]"
            tempRange.Characters.First = ""
        Loop
        Do While tempRange.Characters.Last Like "[  ]"
            tempRange.Characters.Last = ""
        Loop
        If Len(tempRange) > 0 Then
            If tempRange Like "[!A-FA-F..、]" = False Then
                If tempRange.Characters.Last Like "[..、]" Then tempRange.Characters.Last.Delete
            End If
            If num = num2 Then tempRange.InsertBefore "  " Else tempRange.InsertBefore vbCrLf & IIf(num = num2, "", num & ".")
            num2 = num
        End If
        i = 0
        If .Parent.End = myRange.End Then Exit Do
    Loop
End With

With Doc.Content
    .Characters.First.Delete
    With .Font
        .Color = wdColorAutomatic
        .Underline = wdUnderlineNone
        .Bold = False
        .Italic = False
    End With
    With .ParagraphFormat
        .CharacterUnitFirstLineIndent = 0
        .FirstLineIndent = 0
        .CharacterUnitLeftIndent = 0
        .LeftIndent = 0
    End With
    With .Find
        .MatchWildcards = True
        .Execute "^13  ", replacewith:="^p", Replace:=wdReplaceAll
        Do While .Execute("([. ])([A-FA-F]@)[^13 ]", replacewith:="\1\2 ", Replace:=wdReplaceOne)
            .Parent.Collapse wdCollapseEnd
        Loop
        .Parent.WholeStory
        Do While .Execute("([. ][A-FA-F]@)  ([A-FA-F][^13 ])", replacewith:="\1\2", Replace:=wdReplaceOne)
            .Parent.Collapse wdCollapseStart
        Loop
        .Parent.WholeStory
        .Execute " ^13", replacewith:="^p", Replace:=wdReplaceAll
        .Execute "([. ][A-FA-F]@) ([0-9]@.[!A-FA-F])", replacewith:="\1^p\2", Replace:=wdReplaceAll
        .Execute "^13{2,}", replacewith:="^p", Replace:=wdReplaceAll
    End With
End With
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-25 08:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-5-25 09:32 | 显示全部楼层
有时会生成空白文档,不知为何!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-25 09:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 chuhaiou 于 2009-5-25 09:32 发表
有时会生成空白文档,不知为何!

注意一下,你的文档是不是处理选定状态?如果是,请取消选定状态!

[ 本帖最后由 tangqingfu 于 2009-5-25 14:20 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-5-27 10:38 | 显示全部楼层

献给好友tangqingfu,适用于自动域编号的

见提取试题答案的贴子

[ 本帖最后由 chuhaiou 于 2009-5-27 12:31 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-27 23:11 | 显示全部楼层
请教sylun兄,能否写个关于"批量提取指定颜色的字体及其题号"的代码?
将文档"测试"中的答案:白色字体(填空题和简答题)和红色字体(选择题)及其题号提取出来?
我觉得这在用黑白打印机打印试题时,不会将答案打出来(红色的效果和黑色的一样),运行代码时又能提取答案。
PS:如果代码能做到由用户选择或输入字体的颜色后,就能批量提取指定颜色的字体及其题号的话,那就更完美了!

[ 本帖最后由 tangqingfu 于 2009-5-27 23:29 编辑 ]

测试.rar

13.29 KB, 下载次数: 27

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 12:31 , Processed in 0.039372 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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