ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-28 09:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看了chuhaiou 兄的帖子:提取试题答案
http://club.excelhome.net/thread-439725-1-1.html
觉得有些思路可以借鉴一下,希望在本帖中再完善一下提取试题答案的功能.
请教sylun兄:
能否提取附件试题中的答案部分(即红色和白色字体的内容)?
最好能做到:
1、能提取标题(第一、二段)作为答案文档的标题,答案文档的标题为:“试题文档标题+参考答案”的形式,如“2006~2007学年第一学期期中考试
九(1)班英语科试卷参考答案”
2、在提取红色和白色字体内容及其题号时,也能提取大题的题号及其所在段落的内容?(大题题号的标记为像以“一、“、”一.”或“Ⅰ.”、“Ⅰ、"开头的形式?
3、也能提取30~40小题、56~60、76~85小题这样小题号在同一段落的题型。

[ 本帖最后由 tangqingfu 于 2009-5-28 10:01 编辑 ]

期中考.rar

20.71 KB, 下载次数: 44

TA的精华主题

TA的得分主题

发表于 2009-5-28 10:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
对再复杂的要求我不想再改了,不好意思。因这样的修改太费时了,且存在很多不确定性。我想能解决主要问题就行。
至于在两种颜色字体之间选择其中一种,可试将原程序中的.Font.Color = wdColorRed语句改为.Font.Color = IIf(MsgBox("程序只能提取一种字体颜色(红色或白色)的内容,要提取红色字体吗?", vbYesNo, "请选择颜色") = vbYes, wdColorRed, wdColorWhite)
有时候,要结果完美,原文档得先完美。总之,完美是无法实现的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-28 18:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
To sylun兄:
我想将两种颜色一起提取出来,请教该如何修改代码?

TA的精华主题

TA的得分主题

发表于 2009-5-28 20:15 | 显示全部楼层
原帖由 tangqingfu 于 2009-5-28 18:15 发表
To sylun兄:
我想将两种颜色一起提取出来,请教该如何修改代码?


我也知楼主的意思,只是这又要用不同的思路了。可试试如下代码,只是这种处理速度要慢些(如逐字判断更慢)。

Sub test7()
'没有选定内容则对全文档进行处理
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.Characters.First.Select
With Selection
    Do
        If .Font.Color = wdColorRed Or .Font.Color = wdColorWhite Then
            .SelectCurrentColor
            If .End > myRange.End Then Exit Do
            num = Int(Val(.Paragraphs(1).Range.Text))
            Do While num = 0
                i = i + 1
                num = Int(Val(.Previous(wdParagraph, i).Text))
                If i > 10 Then Exit Do
            Loop
            Set tempRange = Doc.Bookmarks("\endofdoc").Range
            tempRange.FormattedText = .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
        End If
        .Collapse wdCollapseEnd
        .MoveRight wdCharacter, 1, wdExtend
    Loop Until .End = myRange.End
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

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-29 08:41 | 显示全部楼层
感觉速度也挺快的!谢谢sylun兄!
能否将附件文档中的66~70小题的问题帮处理一下?
如果红色字体和白色字体的内容是相连的,提取出来的内容也是相连的?

期中考.rar

20.71 KB, 下载次数: 25

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-29 09:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
36~40及56~60小题的题号是在同一段落的,如何正确提取答案及其题号?
46~50小题生成的答案是4个段落,能否像其他选择题一样在同一段落?
如何让选择题/判断题的选项的内容在同一段落(1~60小题)?

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

生成的答案.rar

2.98 KB, 下载次数: 45

期中考.rar

20.71 KB, 下载次数: 28

TA的精华主题

TA的得分主题

发表于 2009-5-29 09:51 | 显示全部楼层
可试将44楼的语句行If num = num2 Then tempRange.InsertBefore "  " Else tempRange.InsertBefore vbCrLf & IIf(num = num2, "", num & ".")修改为如下语句行:
If num = num2 Then
    If .Previous(wdCharacter).Font.Color <> wdColorRed And .Previous(wdCharacter).Font.Color <> wdColorWhite Then tempRange.InsertBefore "  "
Else
    tempRange.InsertBefore vbCrLf & IIf(num = num2, "", num & ".")
End If
至于同段落有多个小题的情形,我就不想再改了,这样的判断无比复杂。其实只要将段落中不是在段首的编号标注成红色,效果也差不多了。
导致46至50题提取结果不在同一段落的原因是答案T超出了原判断选择题选项设计要求,正常来说,选择题有6个选项(A-F)应足够。我想如果能大概理解一下程序代码,也应知道这样的设计安排。对这点我就不想再改代码了,请楼主自行修改判断标准吧。
最后,建议楼主提问不要那么随意,想到哪即时问到哪。因这容易给人一种没完没了的感觉,让别人不停地跟着您的感觉走,这样比较累。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-29 20:20 | 显示全部楼层
谢谢sylun兄的一再帮助!我想可以结题了!
按照sylun兄的提示,基本可以较完美地解决问题了!
很多想法和提问都是在sylun兄帮解决了一部分问题才有的,所以请sylun兄见谅!
以后问题尽量做到想得充分些,再次感谢sylun兄!

TA的精华主题

TA的得分主题

发表于 2009-5-29 21:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢汤兄理解。
就44楼代码,想再补充一点:应将.SelectCurrentColor一句上移至If语句前,这样可提高处理速度。此时也可将.MoveRight wdCharacter, 1, wdExtend一句删除,只是要相应将其后一行改为:Loop Until .End > myRange.End - 2
另外,对所提到的一个段落有多个小题的情形,可以对该部分内容作如下修改,这样可得到类似排版效果,也可正常处理:先将这些小题各题单独成段,然后再用样式分隔符(快捷键Alt+Ctrl+Enter)将它们连在一起。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-30 08:57 | 显示全部楼层
查找了一下,发现快捷键Alt+Ctrl+Enter是作用是:将两个段落连接在一起,创建起始强调
感谢sylun兄的再次帮助!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 15:17 , Processed in 0.034879 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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