ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

我有一张试卷附带有答案,如何才能用宏把答案填写到正确的位置呢?谢谢

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-10-23 18:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以下代码兼顾填写和提取答案两项功能,是根据文档是第一个下划线格式文本是否为空格来智能判断的。处理时只需运行Main过程。当然,代码只是基于原附件文档,并没有普遍适用性,仅共参考。
  1. Sub Main()
  2.     '以文档第一个下划线格式文本是否为空格来判断提取
  3.     With ActiveDocument.Content.Find
  4.         .Font.Underline = wdUnderlineSingle
  5.         .Format = True
  6.         If .Execute Then If Trim(.Parent.Text) = Empty Then InsertAnswer Else GetAnswer
  7.     End With
  8. End Sub

  9. Sub InsertAnswer()
  10.     Dim a() As String, i As Integer
  11.     Dim aa() As String, c As Integer, n As Integer
  12.     Dim TF As Boolean, s As Long
  13.     Dim myRange As Range
  14.     Application.ScreenUpdating = False
  15.     With ActiveDocument.Content.Find
  16.         '搜集答案信息部分
  17.         .Text = "填空题"
  18.         .Forward = False
  19.         .MatchWildcards = True
  20.         If .Execute Then .Forward = True
  21.         .Text = "^13[0-9]@.[!^13]{1,}"
  22.         .Parent.Collapse wdCollapseEnd
  23.         Do While .Execute
  24.             ReDim Preserve a(i)
  25.             a(i) = .Parent.Text
  26.             a(i) = Trim(Mid(a(i), InStr(a(i), ".") + 1))
  27.             i = i + 1
  28.             If i > 60 Then Exit Do  '填空题共有61题
  29.         Loop
  30.         .Parent.Collapse wdCollapseEnd
  31.         Do While .Execute("[0-9]@.[∨×]")
  32.             ReDim Preserve a(i)
  33.             a(i) = .Parent.Text
  34.             a(i) = Trim(Mid(a(i), InStr(a(i), ".") + 1))
  35.             i = i + 1
  36.         Loop
  37.         .Parent.Collapse wdCollapseEnd
  38.         Do While .Execute("[0-9]@.[A-F]{1,}")
  39.             ReDim Preserve a(i)
  40.             a(i) = .Parent.Text
  41.             a(i) = Trim(Mid(a(i), InStr(a(i), ".") + 1))
  42.             i = i + 1
  43.         Loop
  44.         
  45.        '定位填写答案部分
  46.         .Parent.WholeStory
  47.         i = 0
  48.         .Text = ""
  49.         .Font.Underline = wdUnderlineSingle
  50.         .Format = True
  51.         Do While .Execute
  52.             If .Parent.Text <> Chr(13) Then
  53.                 If TF = False Then
  54.                     aa = Split(a(i), Chr(32))
  55.                     TF = True
  56.                 End If
  57.                 For n = c To UBound(aa)
  58.                     c = c + 1
  59.                     If aa(n) <> Empty Then
  60.                         With .Parent
  61.                             .Text = Chr(32) & aa(n) & Chr(32)
  62.                             .Font.Color = wdColorRed
  63.                             .Bold = True
  64.                         End With
  65.                         
  66.                         If n = UBound(aa) Then
  67.                             i = i + 1
  68.                             c = 0
  69.                             TF = False
  70.                         End If
  71.                         Exit For
  72.                     End If
  73.                 Next
  74.             End If
  75.             .Parent.Collapse wdCollapseEnd
  76.         Loop
  77.         .Format = False
  78.         .Text = "(^32{4,})"
  79.         Do While .Execute
  80.             With .Parent  '一道选择题如有两个以上括号,答案只在第一个括号内
  81.                 If .Paragraphs.First.Range.Start > s Then
  82.                     .SetRange .Start + 2, .End - 2
  83.                     .Text = a(i)
  84.                     If a(i) Like "*[!A-F]*" = False Then
  85.                         Set myRange = .Duplicate
  86.                         myRange.Collapse wdCollapseEnd
  87.                         With myRange.Find
  88.                             .MatchWildcards = True
  89.                             .Replacement.Font.Bold = True
  90.                             .Replacement.Font.Color = wdColorRed
  91.                             For c = 1 To Len(a(i))
  92.                                 .Text = Mid(a(i), c, 1) & "[..]*^13"
  93.                                 .Execute Replace:=wdReplaceOne
  94.                                 .Parent.Collapse wdCollapseEnd
  95.                             Next
  96.                         End With
  97.                     End If
  98.                     s = .Paragraphs.First.Range.Start
  99.                     i = i + 1
  100.                 End If
  101.                 .Collapse wdCollapseEnd
  102.             End With
  103.         Loop
  104.     End With
  105.     Application.ScreenUpdating = True
  106. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2011-10-23 19:54 | 显示全部楼层
本帖最后由 sylun 于 2011-10-23 20:08 编辑

再试后半部分:
  1. '在文档末尾写入答案文本并设置基本格式
  2.     info = "参·考·答·案" & vbCrLf & "一、填空题" & a & vbCrLf & "二、判断题" & vbCrLf & b _
  3.         & vbCrLf & "三、单项选择" & vbCrLf & c & vbCrLf & "四、多项选择" & vbCrLf & d
  4.     With ActiveDocument.Content
  5.         If TF = True Then
  6.             With .Find
  7.                 .Font.Color = wdColorRed
  8.                 .Font.Bold = True
  9.                 .Replacement.Font.Color = wdColorAutomatic
  10.                 .Replacement.Font.Bold = False
  11.                 .Execute Replace:=wdReplaceAll
  12.             End With
  13.         End If
  14.         .InsertAfter vbCrLf
  15.         With .Paragraphs.Last.Range
  16.             .Font.Size = 12
  17.             With .ParagraphFormat
  18.                 .CharacterUnitFirstLineIndent = 0
  19.                 .CharacterUnitLeftIndent = 0
  20.                 .FirstLineIndent = 0
  21.                 .LeftIndent = 0
  22.                 .TabStops.ClearAll
  23.                 For n = 1 To 4
  24.                     .TabStops.Add n * 75
  25.                 Next
  26.             End With
  27.             .InsertAfter info
  28.             With .Paragraphs.First
  29.                 .Alignment = wdAlignParagraphCenter
  30.                 .OutlineLevel = wdOutlineLevel1
  31.                 .PageBreakBefore = True
  32.                 With .Range.Font
  33.                     .Grow
  34.                     .Grow
  35.                     .Bold = True
  36.                 End With
  37.             End With
  38.             With .Find
  39.                 .Execute "^9^p", replacewith:="^p", Replace:=wdReplaceAll
  40.                 .MatchWildcards = True
  41.                 .Text = "[一二三四]、*^13"
  42.                 Do While .Execute
  43.                     With .Parent
  44.                         .Font.Name = "黑体"
  45.                         .ParagraphFormat.OutlineLevel = wdOutlineLevel2
  46.                         .Collapse wdCollapseEnd
  47.                     End With
  48.                 Loop
  49.             End With
  50.         End With
  51.     End With
  52.     Application.ScreenUpdating = True
  53. End Sub
复制代码
原来是“参考”与“答案”合在一起作的怪。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-10-23 20:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
收藏学习。

TA的精华主题

TA的得分主题

发表于 2011-10-23 22:15 | 显示全部楼层
非常感谢sylun ,真的太棒了。我试了试我的文件,不论是添加还是提取都不成功,您能否帮忙看看?

物理选修模块水平测试试卷.rar

283.36 KB, 下载次数: 26

TA的精华主题

TA的得分主题

发表于 2011-10-24 00:36 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-10-24 20:33 | 显示全部楼层

为什么不论是添加还是提取都不成功,并且总有一处出错

本帖最后由 zhgj007 于 2011-10-24 20:37 编辑

非常感谢sylun兄 ,真的太棒了。我试了试我的文件,不论是添加还是提取都不成功,并且总有一处出错,您能否帮忙看看?

物理选修模块水平测试试卷.rar

283.36 KB, 下载次数: 17

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-10-24 21:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
sylun 发表于 2011-10-23 19:54
再试后半部分:原来是“参考”与“答案”合在一起作的怪。

.Text = "^13[0-9]@.[!^13]{1,}"
不好意思,再次求教SYLUN大哥,这上面字符中间的点是啥意思?找了半天也没找到“.”这个代表什么意思。能否解释一下哈。谢谢

TA的精华主题

TA的得分主题

发表于 2011-10-24 21:15 | 显示全部楼层
本帖最后由 tangqingfu 于 2011-10-25 08:09 编辑

所有以段落标记开始,然后是数字编号(加点号),后面是以非段落标记的内容。
“.”这个就是数字编号后面的点而已

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-10-24 21:36 | 显示全部楼层
本帖最后由 cumulonimbus 于 2011-10-24 21:37 编辑
tangqingfu 发表于 2011-10-24 21:15
所有以非段落标记开始,然后是数字编号(加点号),后面是以非段落标记的内容。
“.”这个就是数字编号后 ...


非常感谢你的热心回答。
我有点明白了。

TA的精华主题

TA的得分主题

发表于 2011-10-24 23:54 | 显示全部楼层
tangqingfu 发表于 2011-10-24 21:15
所有以非段落标记开始,然后是数字编号(加点号),后面是以非段落标记的内容。
“.”这个就是数字编号后 ...

“所有以段落标记开始”
tang兄,这里应是“以段落标记开始”吧?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-27 19:38 , Processed in 0.056442 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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