Sub shishi() '按ABCDE为多选题定义答案;
'A.沙利度胺 B.异烟肼 C.利福平
'd.氯法齐明 E.氨苯砜
'46.各型麻风病的首选药物为(D)
'A.沙利度胺 B.异烟肼 C.利福平
'd.氯法齐明 E.氨苯砜
'45.各型麻风病的首选药物为(E)
'A.沙利度胺 B.异烟肼 C.利福平
'd.氯法齐明 E.氨苯砜
'45645
'1532131
'46.各型麻风病的首选药物为(D)
Dim mt, mh, mk, oRng As Range, rg As Range, n&, m&, str$, d, rng As Range ',t
Set d = CreateObject("Scripting.Dictionary")
y = 4
With CreateObject("vbscript.regexp")
.Global = True: .IgnoreCase = False: .MultiLine = True
.Pattern = "^\d+.[^\r]+\(([A-E])\)\r(?:(?!^\d+.[^\r]+\((?:[A-E])\)\r).)+" '匹配题干+选项(非题干的多行,直到第二个题干前),有几个就有多少组
For Each mt In .Execute(ActiveDocument.Content)
y = y + 1 '这个是初始的题号;
m = mt.FirstIndex: n = mt.Length45.各型麻风病的首选药物为(E) Set oRng = ActiveDocument.Range(m, m + n) 'orng为题干+选项;
str = mt.submatches(0) 'str为题干后答案;
.Pattern = "([A-E].)((?:(?![A-E].).)+)" '匹配ABCDE选项;
For Each mh In .Execute(oRng.Text)
m = mh.FirstIndex: n = mh.Length
Set rg = ActiveDocument.Range(oRng.Start + m, oRng.Start + m + n) 'rg为具体选项;
Set d(Left(rg.Text, 1)) = rg '在字典内创建A与A选项内容间的对应;
Next
t = d.items 'item只能有5个,对应A-E5个选项,即t(0)-t(4);
Select Case y Mod 5 '是5的倍数则分配A,余数为1则分配B,其他以此类推;4为E;
Case 0
If str <> "A" Then
.Pattern = "\(\s*[A-E]\s*\)"
For Each mk In .Execute(oRng.Text)
m = mk.FirstIndex: n = mk.Length
Set rng = ActiveDocument.Range(oRng.Start + m, oRng.Start + m + n) '通常二次正则查找时需要用到加两次;
With rng
.MoveStart 1, 1: .MoveEnd 1, -1: .Text = "A" '这个就是从括号外移动到括号内;
End With
Next
With d(str) '字典直指Range对象(遥控);
.MoveStart 1, 2: .MoveEnd 1, -1: s1 = .Text '起点向后移动2,末点向前移动1;
End With
With t(0) '这里写成d.itme(1)是否可行?AHK中必须写成那样;
.MoveStart 1, 2: .MoveEnd 1, -1: s2 = .Text
.Text = s1
End With
d(str).Text = s2
End If '上面就是交换两个选项内容,而选项自身不变;
Case 1 '余下的都是重复性操作了,真正核心的也就是上面的代码部分了;
If str <> "B" Then
.Pattern = "\(\s*[A-E]\s*\)"
For Each mk In .Execute(oRng.Text)
m = mk.FirstIndex: n = mk.Length
Set rng = ActiveDocument.Range(oRng.Start + m, oRng.Start + m + n)
With rng
.MoveStart 1, 1: .MoveEnd 1, -1: .Text = "B"
End With
Next
With d(str)
.MoveStart 1, 2: .MoveEnd 1, -1: s1 = .Text
End With
With t(1)
.MoveStart 1, 2: .MoveEnd 1, -1: s2 = .Text
.Text = s1
End With
d(str).Text = s2
End If
Case 2
If str <> "C" Then
.Pattern = "\(\s*[A-E]\s*\)"
For Each mk In .Execute(oRng.Text)
m = mk.FirstIndex: n = mk.Length
Set rng = ActiveDocument.Range(oRng.Start + m, oRng.Start + m + n)
With rng
.MoveStart 1, 1: .MoveEnd 1, -1: .Text = "C"
End With
Next
With d(str)
.MoveStart 1, 2: .MoveEnd 1, -1: s1 = .Text
End With
With t(2)
.MoveStart 1, 2: .MoveEnd 1, -1: s2 = .Text
.Text = s1
End With
d(str).Text = s2
End If
Case 3
If str <> "D" Then
.Pattern = "\(\s*[A-E]\s*\)"
For Each mk In .Execute(oRng.Text)
m = mk.FirstIndex: n = mk.Length
Set rng = ActiveDocument.Range(oRng.Start + m, oRng.Start + m + n)
With rng
.MoveStart 1, 1: .MoveEnd 1, -1: .Text = "D"
End With
Next
With d(str)
.MoveStart 1, 2: .MoveEnd 1, -1: s1 = .Text
End With
With t(3)
.MoveStart 1, 2: .MoveEnd 1, -1: s2 = .Text
.Text = s1
End With
d(str).Text = s2
End If
Case 4
If str <> "E" Then
.Pattern = "\(\s*[A-E]\s*\)"
For Each mk In .Execute(oRng.Text)
m = mk.FirstIndex: n = mk.Length
Set rng = ActiveDocument.Range(oRng.Start + m, oRng.Start + m + n)
With rng
.MoveStart 1, 1: .MoveEnd 1, -1: .Text = "E"
End With
Next
With d(str)
.MoveStart 1, 2: .MoveEnd 1, -1: s1 = .Text
End With
With t(4)
.MoveStart 1, 2: .MoveEnd 1, -1: s2 = .Text
.Text = s1
End With
d(str).Text = s2
End If
End Select
d.RemoveAll
Next
End With
End Sub

  

VBA注释临时的更多相关文章

  1. VBA Promming入门教程——变量的使用

    数据类型 VBA中的数据类型可分为两种 示例 String Sub Main Dim s as string s = "Hello" msgbox(s) End Sub Singl ...

  2. python 3.6 关于python的介绍

    python的官方网站 https://www.python.org/ python 3.6 的官方网站的下载地址 https://www.python.org/downloads/release/p ...

  3. 在Excel里用vba给合并的单元格添加注释

    Excel里使用VBA对已经合并的单元格添加注释,直接使用AddComment会报: 运行时错误 '1004':应用程序定义或者对象定义错误 找了很多文章都没找到怎么解决,最后发现在AddCommen ...

  4. Excel VBA入门(七)注释、宏按钮及错误处理

    系统性的知识前面已经讲完,从本章开始,本系列教程涉及的将会是一些相对凌散的内容. 1. 注释 代码注释是一件利人利己的事,为了方便自己在代码需要更新修改时,依然能够快速地看懂自己完的每一行代码到底是什 ...

  5. VBA宏注释(四)

    注释用于记录程序逻辑和用户信息,其他程序员将来可以阅读并理解相同的代码无缝工作. 它包括由开发者,修改者以及还可以包括合并逻辑的信息. 解释器在执行时忽略注释. VBA中的注释用两种方法表示,它们分别 ...

  6. VBA续嘘嘘

    什么是VBA?它有什么作用? A.实现Excel中没有实现的功能. B.提高运行速度. C.编写自定义函数. D.实现自动化功能. E.通过插入窗体做小型管理软件. VBA在哪里存放的?怎么运行? A ...

  7. VBA续嘘嘘——宏技巧集绵

    什么是VBA?它有什么作用? A.实现Excel中没有实现的功能. B.提高运行速度. C.编写自定义函数. D.实现自动化功能. E.通过插入窗体做小型管理软件. VBA在哪里存放的?怎么运行? A ...

  8. Excel VBA入门(二)数组和字典

    数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...

  9. shell注释

    sh里没有多行注释,只能每一行加一个#号.只能像这样: #-------------------------------------------- # 这是一个自动打ipa的脚本,基于webfrogs ...

随机推荐

  1. Arithmometer: A Node.js implementation

    Foreword: This project is a part of pair programming task. We implement an command-line based arithm ...

  2. koa 微信小程序 项目

    这个微信号入门, 应该能自己模仿做一个微信公众号了 另外 微信小程序开发 和 微信公众号h5嵌入 还是有区别的 h5嵌入在体验上和 微信小程序 差距还是比较大, 因为小程序直接调用了微信的原生组件, ...

  3. HRBUST单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  4. HDU 1518 Square(DFS)

    Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end ...

  5. 玩转TypeScript(3)--数组

    数组的语法和语义与C#数组非常相似,首先要指定一个数组名,后跟冒号,冒号后面紧跟数组的类型,数组类型名后面跟方括号表示当前定义的是一个数组,对于一个空的数组定义,可以使用如下的语法: btnArray ...

  6. 第十章 企业项目开发--分布式缓存Redis(2)

    注意:本章代码是在上一章的基础上进行添加修改,上一章链接<第九章 企业项目开发--分布式缓存Redis(1)> 上一章说了ShardedJedisPool的创建过程,以及redis五种数据 ...

  7. 程序运行时间c++/matlab

    前言 一般在调试程序的过程中,需要查看代码运行速度的快慢,此时则需要计算代码的运行时间. 实验过程: c++: #include<iostream> #include<time.h& ...

  8. unbtu使用笔记

    安装fcitx输入法: sudo apt-get install fcitx-table-wbpy 再配置http://www.cnblogs.com/imsoft/p/4368550.html vi ...

  9. Lua基本语法-书写规范以及自带常用函数

    Lua基本语法-书写规范和常用函数 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 String Ope ...

  10. 谈ObjC对象的两段构造模式

    前言 Objective-c语言在申请对象的时,需要使用两段构造(Two Stage Creation)的模式.一个对象的创建,需要先调用alloc方法或allocWithZone方法,再调用init ...