ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何把文档最后的答案分别放到每道题目后面(见附件)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-5-6 13:48 | 显示全部楼层 |阅读模式
因为这样的文档太多,我想通过vba编程快速将打开的world文档中,最后面的答案部分自动放到对应的每道题目后面。

fxgl_lx0101.rar

36.8 KB, 下载次数: 147

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-8 16:44 | 显示全部楼层
没有人帮我!
研究了很久,自己写了部分代码,请大家指正。
  1. Sub 答案自动匹配()
  2. On Error Resume Next
  3. Dim tixing, tihao As String
  4. Dim star1, star2, star3, end1, i, x As Integer
  5. sumdoc = ActiveDocument.Range.End
  6. sumpara = ActiveDocument.Paragraphs.Count
  7. Application.ScreenUpdating = False
  8. For i = 1 To sumpara
  9.     '定位题型
  10.     If InStr(ActiveDocument.Paragraphs(i).Range, "、单项选择") > 0 Then
  11.     tixing = "、单项选择"
  12.     ElseIf InStr(ActiveDocument.Paragraphs(i).Range, "、多项选择") > 0 Then
  13.     tixing = "、多项选择"
  14.     ElseIf InStr(ActiveDocument.Paragraphs(i).Range, "、判断题") > 0 Then
  15.     tixing = "、判断题"
  16.     ElseIf InStr(ActiveDocument.Paragraphs(i).Range, "、简答题") > 0 Then
  17.     tixing = "、简答题"
  18.     ElseIf InStr(ActiveDocument.Paragraphs(i).Range, "、计算题") > 0 Then
  19.     tixing = "、计算题"
  20.     End If
  21.     '定位题号
  22.     If InStr(ActiveDocument.Paragraphs(i), "、") > 0 And InStr(ActiveDocument.Paragraphs(i).Range, "、") <= 3 Then
  23.     x = InStr(ActiveDocument.Paragraphs(i), "、")
  24.     End If
  25.     If IsNumeric(Left(ActiveDocument.Paragraphs(i).Range, x - 1)) = True Then
  26.     tihao = Left(ActiveDocument.Paragraphs(i).Range, x)
  27.     End If
  28.     If tixing = "、单项选择" Or tixing = "、多项选择" Then
  29.         If InStr(ActiveDocument.Paragraphs(i), "D、") > 0 And InStr(ActiveDocument.Paragraphs(i), "D、") < 3 Then
  30.         ActiveDocument.Paragraphs(i).Range.InsertParagraphAfter
  31.         ActiveDocument.Paragraphs(i).Range.InsertParagraphAfter
  32.         '开始寻找答案
  33.         star1 = InStr(ActiveDocument.Range(0, sumdoc), "答案部分")
  34.         star2 = InStr(ActiveDocument.Range(star1, sumdoc), tixing)
  35.         star3 = InStr(ActiveDocument.Range(star1 + star2, sumdoc), tihao)
  36.         end1 = InStr(ActiveDocument.Range(star1 + star2 + star3, sumdoc), "答疑编号")
  37.         end2 = star1 + star2 + star3 + end1
  38.         ActiveDocument.Range(star1 + star2 + star3 + 2, end2 - 2).Cut
  39.         ActiveDocument.Paragraphs(i + 1).Range.Paste
  40.         End If
  41.     ElseIf tixing = "、判断题" Then
  42.         
  43.     ElseIf tixing = "、简答题" Or tixing = "、计算题" Then
  44.         
  45.     End If
  46. sumpara = ActiveDocument.Paragraphs.Count
  47. Next i
  48. Application.ScreenUpdating = True
  49. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-5-8 20:29 | 显示全部楼层
其实,楼主的问题我也研究了半天,但后来反复测试,越来越不行,觉得非本论坛sylun那样的高手来完成不可!
从楼主的代码中可以看出,楼主的VBA水平高出我多少个档次!恕心有余而力不足,未能帮到楼主!

TA的精华主题

TA的得分主题

发表于 2015-5-9 11:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
又重新给楼主研究了好久,有些成果,请楼主认真阅读一下宏的注释部分:(限于水平和时间,仅作抛砖引玉)
Sub test()
'功能:答案填入试卷(请备份原文件后应用此宏!!!)
'myRange=答案 key,myRange2=试题 ask(域对域,在域 Range 中查找答案和放入答案)
'请手工将《答案部分》剪切另存为 key.doc,《试题部分》另存为 ask.doc,两者放在同一文件夹中

'Sub 全文预处理()
    With ActiveDocument.Content.Find
        .Execute FindText:="^l", replacewith:="^p", Replace:=wdReplaceAll  '手动换行符=>段落标记(全部替换)
        .Execute FindText:="^13", replacewith:="^p", Replace:=wdReplaceAll '真假回车符=>段落标记(全部替换)
        .Execute FindText:="(", replacewith:="(", Replace:=wdReplaceAll
        .Execute FindText:=")", replacewith:=")", Replace:=wdReplaceAll
    End With

    On Error Resume Next
    Dim i As Paragraph, s As String, n As Long, myRange As Range, myRange2 As Range

'******************************************************第一大题:答案提取和填入(单项选择题)
'答案部分:选定第一大题
    Windows("key").Activate
    For Each i In ActiveDocument.Paragraphs
        If i.Range Like "一、*" & vbCr Then i.Range.Select
    Next
    Do
        Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Loop Until Right(Selection, 2) = "二、"
    Selection.MoveEnd Unit:=wdCharacter, Count:=-1
    Selection.MoveEnd Unit:=wdCharacter, Count:=-1

    Set myRange = Selection.Range

'试题部分:选定第一大题
    Windows("ask").Activate
    For Each i In ActiveDocument.Paragraphs
        If i.Range Like "一、*" & vbCr Then i.Range.Select
    Next
    Do
        Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Loop Until Right(Selection, 2) = "二、"
    Selection.MoveEnd Unit:=wdCharacter, Count:=-1
    Selection.MoveEnd Unit:=wdCharacter, Count:=-1

    Set myRange2 = Selection.Range
    n = 1

'进入循环
    Do
        Windows("key").Activate '*****答案部分
        myRange.Select
        Selection.Find.Execute FindText:=n & "、", Forward:=True, Wrap:=wdFindStop
        If Selection.Find.Found = True Then
            Selection.Font.Color = wdColorPink
            Selection.Next(Unit:=wdParagraph, Count:=1).Select '选定当前选定内容的下一段落
            Selection.MoveEnd Unit:=wdCharacter, Count:=-1
            s = Right(Selection, 1)
        End If
'
        Windows("ask").Activate '****试题部分
        myRange2.Select
        Selection.Find.Execute FindText:=n & "、", Forward:=True, Wrap:=wdFindStop
        If Selection.Find.Found = True Then
            Selection.Paragraphs(1).Range.Select
            Selection.Find.Execute FindText:="(", Forward:=True, Wrap:=wdFindStop
            If Selection.Find.Found = True Then
                Do
                    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
                    If Selection.Characters.Last.Text = ")" Then Exit Do
                Loop
                Selection.Font.Color = wdColorRed
                Selection.Text = "(" & s & ")"
            End If
                n = n + 1
        Else
            Exit Do
        End If
    Loop

'*************************第二大题:答案提取和填入(多项选择---在第一大题代码基础上略改!)********************
'答案部分:选定第二大题
    Windows("key").Activate
    For Each i In ActiveDocument.Paragraphs
        If i.Range Like "二、*" & vbCr Then i.Range.Select
    Next
    Do
        Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Loop Until Right(Selection, 2) = "三、"
    Selection.MoveEnd Unit:=wdCharacter, Count:=-1
    Selection.MoveEnd Unit:=wdCharacter, Count:=-1

    Set myRange = Selection.Range

'试题部分:选定第二大题
    Windows("ask").Activate
    For Each i In ActiveDocument.Paragraphs
        If i.Range Like "二、*" & vbCr Then i.Range.Select
    Next
    Do
        Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Loop Until Right(Selection, 2) = "三、"
    Selection.MoveEnd Unit:=wdCharacter, Count:=-1
    Selection.MoveEnd Unit:=wdCharacter, Count:=-1

    Set myRange2 = Selection.Range
    n = 1

'进入循环
    Do
        Windows("key").Activate '*****答案部分
        myRange.Select
        Selection.Find.Execute FindText:=n & "、", Forward:=True, Wrap:=wdFindStop
        If Selection.Find.Found = True Then
            Selection.Font.Color = wdColorPink
            Selection.Next(Unit:=wdParagraph, Count:=1).Select
            Selection.MoveEnd Unit:=wdCharacter, Count:=-1
            s = Trim(Mid(Selection, 7, Len(Selection) - 6))
        End If
'
        Windows("ask").Activate '****试题部分
        myRange2.Select
        Selection.Find.Execute FindText:=n & "、", Forward:=True, Wrap:=wdFindStop
        If Selection.Find.Found = True Then
            Selection.Paragraphs(1).Range.Select
            Selection.Find.Execute FindText:="(", Forward:=True, Wrap:=wdFindStop
            If Selection.Find.Found = True Then
                Do
                    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
                    If Selection.Characters.Last.Text = ")" Then Exit Do
                Loop
                Selection.Font.Color = wdColorRed
                Selection.Text = "(" & s & ")"
            End If
                n = n + 1
        Else
            Exit Do
        End If
    Loop
   
'********************************第三大题:答案提取和填入(略)*************************

    Selection.HomeKey Unit:=wdStory
    MsgBox "处理完毕!!!!!!!!!!!!", vbOKOnly + vbExclamation, "答案填入试卷"
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-11 09:30 | 显示全部楼层
谢谢你耐心的编写与测试。
我才开始学习利用vba处理word问题,因我以前经常用vba处理excel问题,所以我的处理方法是按照excel表格处理的思路来的,你所运用的“域”的概念我还一无所知。
虽然你写的有些代码我看不懂,但我认真按照你写的宏注释测试了,发现你是把答案填入试题后面的括号中,而我想要达到的效果是,将试题的答案和解释一并贴放到试题后面,但是仍然非常感谢!

TA的精华主题

TA的得分主题

发表于 2015-5-11 22:51 | 显示全部楼层
本帖最后由 zhanglei1371 于 2015-5-12 07:09 编辑

思路不错,我也补充点:
  1. Sub 答案自动匹配()
  2.     On Error Resume Next
  3.     Dim tixing, tihao As String
  4.     Dim star1, star2, star3, end1, i, x As Integer
  5.     sumdoc = ActiveDocument.Range.End
  6.     sumpara = ActiveDocument.Paragraphs.Count
  7.     Application.ScreenUpdating = False
  8.     For i = 1 To sumpara
  9.         '定位题型
  10.         If InStr(ActiveDocument.Paragraphs(i).Range, "、单项选择") > 0 Then
  11.             tixing = "、单项选择"
  12.         ElseIf InStr(ActiveDocument.Paragraphs(i).Range, "、多项选择") > 0 Then
  13.             tixing = "、多项选择"
  14.         ElseIf InStr(ActiveDocument.Paragraphs(i).Range, "、判断题") > 0 Then
  15.             tixing = "、判断题"
  16.         ElseIf InStr(ActiveDocument.Paragraphs(i).Range, "、简答题") > 0 Then
  17.             tixing = "、简答题"
  18.         ElseIf InStr(ActiveDocument.Paragraphs(i).Range, "、计算题") > 0 Then
  19.             tixing = "、计算题"
  20.         End If
  21.         '定位题号
  22.         If InStr(ActiveDocument.Paragraphs(i), "、") > 0 And InStr(ActiveDocument.Paragraphs(i).Range, "、") <= 3 Then
  23.             x = InStr(ActiveDocument.Paragraphs(i), "、")
  24.         End If
  25.         If IsNumeric(Left(ActiveDocument.Paragraphs(i).Range, x - 1)) = True Then
  26.             tihao = Left(ActiveDocument.Paragraphs(i).Range, x)
  27.         End If
  28.         If tixing = "、单项选择" Or tixing = "、多项选择" Then
  29.             If InStr(ActiveDocument.Paragraphs(i), "D、") > 0 And InStr(ActiveDocument.Paragraphs(i), "D、") < 3 Then
  30.                 ActiveDocument.Paragraphs(i).Range.InsertParagraphAfter
  31.                 ActiveDocument.Paragraphs(i).Range.InsertParagraphAfter
  32.                 '开始寻找答案
  33.                 star1 = InStr(ActiveDocument.Range(0, sumdoc), "答案部分")
  34.                 star2 = InStr(ActiveDocument.Range(star1, sumdoc), tixing)
  35.                 star3 = InStr(ActiveDocument.Range(star1 + star2, sumdoc), tihao)
  36.                 end1 = InStr(ActiveDocument.Range(star1 + star2 + star3, sumdoc), "答疑编号")
  37.                 end2 = star1 + star2 + star3 + end1
  38.                 ActiveDocument.Range(star1 + star2 + star3 + 2, end2 - 2).Cut
  39.                 ActiveDocument.Paragraphs(i + 1).Range.Paste
  40.             End If
  41.         ElseIf tixing = "、判断题" Then

  42.         ElseIf tixing = "、简答题" Or tixing = "、计算题" Then
  43.             If ActiveDocument.Paragraphs(i).Range Like "<[0-9]>*" Then
  44.                 tihao = Left(ActiveDocument.Paragraphs(i).Range, 3)
  45.                 ActiveDocument.Paragraphs(i).Range.InsertParagraphAfter
  46.                 ActiveDocument.Paragraphs(i).Range.InsertParagraphAfter
  47.                 '开始寻找答案
  48.                 star1 = InStr(ActiveDocument.Range(0, sumdoc), "答案部分")
  49.                 star2 = InStr(ActiveDocument.Range(star1, ActiveDocument.Range.End), "、简答题")
  50.                 star3 = InStr(ActiveDocument.Range(star1 + star2, ActiveDocument.Range.End), tihao)
  51.                 end1 = InStr(ActiveDocument.Range(star1 + star2 + star3, ActiveDocument.Range.End), "答疑编号")
  52.                 end2 = star1 + star2 + star3 + end1
  53.                 ActiveDocument.Range(star1 + star2 + star3 + 2, end2 - 2).Cut
  54.                 ActiveDocument.Paragraphs(i + 1).Range.Paste
  55.             End If
  56.         End If
  57.         sumpara = ActiveDocument.Paragraphs.Count
  58.     Next i
  59.     Application.ScreenUpdating = True
  60. End Sub
复制代码
剩余就是修改数学计算的位置问题了。很简单的。另外还有个思路:就是vba+表格+半手工处理,我只做了一部分示例,剩余的比葫芦画瓢即可:Sub 题目处理()
Selection.HomeKey wdStory
    With Selection.Find
        .Text = "^13[0-9]@、*A、*D、*^13[0-9]"
        .MatchWildcards = 1
        Do While .Execute
            .Parent.Start = .Parent.Start + 1
            .Parent.End = .Parent.End - 1
            .Parent.Cut
            '        .Parent.TypeParagraph
            Selection.MoveLeft
            Selection.Tables.Add .Parent.Range, 2, 1
            Selection.Paste
        Loop
    End With
End Sub
Sub 答案处理()
    With Selection.Find
        .Text = "^13[0-9]@、^13【正确答案】*【答疑编号*^13[0-9]"
        .MatchWildcards = 1
        Do While .Execute
            .Parent.Start = .Parent.Start + 1
            .Parent.End = .Parent.End - 1
            .Parent.Cut
            '        .Parent.TypeParagraph
            Selection.MoveLeft
            Selection.Tables.Add .Parent.Range, 2, 1
            Selection.Paste
        Loop
    End With
End Sub
这样就生成了两个表格,然后手工如下图处理:
002.jpg
之后就简单了:表格转换为文本,替换掉垃圾字符,OK!

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-12 09:17 | 显示全部楼层
感谢 zhanglei1371 兄的精彩补充。原来可以使用ActiveDocument.Paragraphs(i).Range Like "<[0-9]>*" 来查找。另外,生成表格的处理方法很不错,值得推荐!

TA的精华主题

TA的得分主题

发表于 2015-5-14 15:48 | 显示全部楼层
这个挺实用的,制作也简单,感谢楼主分享!

TA的精华主题

TA的得分主题

发表于 2016-12-31 15:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-4-7 21:33 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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