ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 提取填空题答案无果

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-29 10:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我昨天发帖上的附件,怎么现在还没有?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-29 10:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 weiyingde 于 2020-3-29 10:42 编辑
duquancai 发表于 2020-3-28 20:34
题号是重复的?你把附件传上来,最终要达到什么目的?

昨天上的附件,不知哪儿去了,只有再上一次,杜老师有功夫看一下。

附件1.rar

65.72 KB, 下载次数: 11

TA的精华主题

TA的得分主题

发表于 2020-3-29 13:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
weiyingde 发表于 2020-3-29 10:31
昨天上的附件,不知哪儿去了,只有再上一次,杜老师有功夫看一下。

Sub 提取划线内容()
    Dim myDoc As Document, myStr As String, m&
    Dim myParRange As Range, n&, resData()
    Set myDoc = ActiveDocument
    With myDoc.Content.Find
        Do While .Execute("[0-9]@[..]", , , -1)
            With .Parent
                If isStartNum(.Paragraphs(1).Range.Text) Then
                    Set myParRange = .Paragraphs(1).Range.Duplicate
                    With .Paragraphs(1).Range.Find
                        .Font.Underline = wdUnderlineWavy
                        Do While .Execute
                            With .Parent
                                If Not .InRange(myParRange) Then Exit Do
                                myStr = myStr + vbTab + .Text: n = n + 1
                            End With
                        Loop
                    End With
                    If n > 0 Then
                        m = m + 1: ReDim Preserve resData(1 To m): n = 0
                        resData(m) = .Text + Mid(myStr, 2): myStr = Empty
                    End If
                    .Start = .Paragraphs(1).Range.End
                Else
                    .Start = .Paragraphs(1).Range.End
                End If
            End With
        Loop
    End With
    Documents.Add.Content.Text = Join(resData, vbCr)
End Sub
Function isStartNum(ByVal myStr As String) As Boolean
    Dim re As Object
    Set re = CreateObject("VBScript.Regexp")
    re.Pattern = "^[0-9]+[..]"
    isStartNum = re.test(myStr)
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-29 16:00 | 显示全部楼层
本帖最后由 lss001 于 2020-3-30 18:20 编辑

.............................................

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-29 16:43 | 显示全部楼层
duquancai 发表于 2020-3-29 13:34
Sub 提取划线内容()
    Dim myDoc As Document, myStr As String, m&
    Dim myParRange As Range, n ...

谢谢你,已经完美解决了问题,这是第二个好方案,收集了,学习揣摩。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-29 16:45 | 显示全部楼层
lss001 发表于 2020-3-29 16:00
Sub 提取()
    Set wDoc = ActiveDocument
    With wDoc.Content.Find

简洁好用,完全符合心意,多谢了,收集学习了。

TA的精华主题

TA的得分主题

发表于 2020-3-29 17:00 | 显示全部楼层
我之前的代码中val函数对文本是按四舍五入转换的,如果题目正文首字符是较大的数字,获得的题号会不一样,可套用int函数取整处理。
如果用正则处理也可以,只是正则无法识别字符格式,可以考虑对下划线内容作临时标记,只是对处理效率有影响。可试试如下代码,不知对大文档处理效率如何。
  1. Sub test2()
  2.     Dim otext As String
  3.     Dim info As String
  4.     Dim regEx As Object
  5.     Dim aMatch As Object
  6.    
  7.     Application.ScreenUpdating = False
  8.     With ActiveDocument.Content.Find '用特殊字符对下划线内容进行临时标记
  9.         .Font.Underline = wdUnderlineWavy
  10.         .Execute replacewith:="##^&##", Replace:=wdReplaceAll
  11.     End With
  12.    
  13.     Set regEx = CreateObject("VBScript.Regexp")
  14.     With regEx
  15.         .Global = True
  16.         .MultiLine = True
  17.         .Pattern = "^(\d+)([..][^\r]*?##)" '含特殊标记段首题号的匹配模式
  18.         otext = .Replace(ActiveDocument.Content.Text, "##$1.##$2") '获取正则替换后的文本
  19.         .Pattern = "##(.+?)##"
  20.         For Each aMatch In .Execute(otext) '依次提取各标记项文本
  21.             info = info & aMatch.Submatches(0) & Space(2)
  22.         Next
  23.         .Pattern = "(\d+\.)  "
  24.         info = .Replace(info, "$1")
  25.     End With
  26.    
  27.     ActiveDocument.Undo '撤销临时标记
  28.     Documents.Add.Content.Text = Trim(info)
  29.     Application.ScreenUpdating = True
  30. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-29 17:17 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
weiyingde 发表于 2020-3-29 16:45
简洁好用,完全符合心意,多谢了,收集学习了。

提取的答案是要与题号 一一对应的,不是重新编序号而是要引用原题号。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-29 19:04 | 显示全部楼层
duquancai 发表于 2020-3-29 17:17
提取的答案是要与题号 一一对应的,不是重新编序号而是要引用原题号。

是的,杜老师说的不错。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-30 14:41 | 显示全部楼层
sylun 发表于 2020-3-29 17:00
我之前的代码中val函数对文本是按四舍五入转换的,如果题目正文首字符是较大的数字,获得的题号会不一样, ...

非常好用,大侠技术精熟,思路多,方法多样,学习了。
但是如果有答下题目又该怎样提取呢?
见附件。

两级题号如何提取划线答案?.rar

58.67 KB, 下载次数: 7

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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