孟庭苇《网上有些词做的云》:VBA之小试牛刀

李亮1975重庆

语料库快乐军政委
孟庭苇《网上有些词做的云》:VBA之小试牛刀

她唱道……
风中有朵雨做的云,网上有些词做的云,
云的心里全都是词,滴滴全都是编程,
词在眼前变换了形,不知又将吹向哪儿去。


“词云”的初相识:http://media.people.com.cn/GB/22100/61748/61749/4281906.html

多个美国总统就职演讲的“词云”对比:
http://www.readwriteweb.com/archives/tag_clouds_of_obamas_inaugural_speech_compared_to_bushs.php

美国政府网站“usa.gov”所涌现出来的73个关键词的“词云”效果:
http://www.usa.gov/About/Americans_Minds/word_cloud.shtml

体验网址1号:http://tagcrowd.com/
体验网址2号:http://www.wordle.net/
体验网址3号:http://www.tocloud.com/
体验网址4号:http://www.tagxedo.com/

云,有大小不同,有色彩斑斓,有奇形怪状;

词云,是对一个语篇或一系列语料甚至一个语料库的整体上的某种词汇趋势或某种语言模式的可视化呈现,往往体现为颜色差异性,字体差异性,聚汇模块性,形状多变性;

词云,是词的聚合,通常过滤了虚词而呈现了实词,甚至实词按照词形变化或语义相似而成团成堆;

词云,在国内尚无在线服务,在国外已有较多在线生成的网站,皆免费;

词云不是IT界正在热炒的“云计算”,而是“语料蕴藏的信息规律的云状计算或云状呈现”。

以下是VBA(Visual Basic for Application)编程语言所实现的最肤浅最便捷的“类似词云的效果”的源代码……

Sub 词长型词云()
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.Size = 10 + ActiveDocument.Words(counter).Characters.Count * 4
Next
End Sub

Sub 随机字号型词云()
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.Size = 10 + Int(50 * Rnd())
Next
End Sub

Sub 随机色彩型词云()
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.ColorIndex = Int(16 * Rnd())
Next
End Sub

Sub 随机字号与色彩型词云()
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.Size = 10 + Int(50 * Rnd())
Next
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.ColorIndex = Int(16 * Rnd())
Next
End Sub

Sub 清除所有格式()
Selection.WholeStory
Selection.ClearFormatting
End Sub

国外的在线的词云网站一般是根据词频来进行字体大小与字体颜色的自动生成的,上面的VBA源代码为了最简单地演示词云的计算过程,采用了随机数值来代替词频高低。“词长型词云”就是单词的字体大小是单词的字母多少决定的,字母越多的单词的字号就越大,字母越少的单词就字号就越小。
“随机字号型词云”就是每个单词的字号是随机数值确定的,而本例中为了保障基本字号,就设定了10为基础值,然后加上一个0到50之间的随机整数。“随机色彩型词云”就是以VBA语言的内置的16种颜色为随机变化的取值范围而随机赋予每个单词一个颜色,当然也包括了白色,所以,当字体颜色为白色的时候就跟背景白色重合了,所以就看不到这个单词了,这个效果也可以视为本演示代码的一个小小遗憾了。

附件中提供的“网上有些词做的云.doc”,就是已经内置了上面的VBA源代码了,你下载打开这个Word文件之后,就看到“I fell in love with corpus linguistics some years ago.”,是五颜六色和每个单词的字号都忽大忽小的,这个Word文件的菜单顶部有5个按钮:
词长型词云,随机字号型词云随机色彩型词云,随机字号与色彩型词云,清除所有格式。你需要什么效果,你点这五个按钮之一就行了。

如果你点击上面的五个按钮的时候,弹出一个对话框,提示你“由于宏安全设置,无法找到宏或宏被禁止”,就说明你当前的Word的“宏安全”的级别处于“高”或“非常高”,你就需要降低“宏安全级别”到“低”,然后关闭当前的Word文件之后,重新打开这个Word文件,就能毫无障碍地运行上面的五个按钮了。见下图:




---------- 点击“安全性”,就会看到如下 ---------------




如果你的Word 2003的“宏安全级别”当前是“中”,那么你就会在启动整个Word文件的时候,看到如下提示:



那么,你要选择“启动宏”,才能继续运行那“五个云按钮”哟。

至于“宏病毒”,那只是1997年前后的事了,不必担心,现在的杀毒软件都能轻松地发现歼灭的,我们一般人利用VBA写出的“小工具”都是“reliable”而不是“malicious”了。

如果你希望再阅读一份类似的VBA的牛刀小试的实例,可点击以下链接,是我在本站的另一个主题下的回帖
VBA开发的小型语料标注标签清除工具(Word文件形式)
http://www.corpus4u.org/forum/showpost.php?p=44538&postcount=8

如果你一下子变得有点激动,决定走上“语料库之VBA编程”之路,可以阅读我在本站的另一个主题下的回帖
《学好VBA的门径与利弊》
http://www.corpus4u.org/forum/showpost.php?p=44546&postcount=12

在你掌握了简洁而高效的VBA对语料的各种字符串操纵之后,其实你只是牢牢地站在了我李亮个人认为的“语料库编程能力的第一层:字符串编程”,这一层功夫的内容是:字符串的各种识别(包括乱码识别)与转换与批量处理(包括颜色呀字体呀的自动排版),也包括txt文件的读写,也包括对unicode与ansi与utf-8这样的最常见的文字编码的概念知识与VBA操纵。

在此之上,你提升能力的话,就是
我李亮个人认为的“语料库编程能力的第二层:数据库编程”,这一层功夫的内容是:用VBA调用各种你自己建立或别人建立的标准的语言信息数据库,例如词频数据库,近义词数据库,词性数据库,GRE词表数据库,语法变形数据库,词汇派生数据库,释义数据库,句法特征数据库,专业术语数据库等等。可见,第二层功力就能用VBA做词性自动分析器呀,句法分析器呀,术语识别与提取器呀,词汇难度分析器呀,反剽窃器呀,这样丰富的产品线的东西了哟。

在此之上,就是“
语料库编程能力的第三层:互联网编程”,这一层的内容是:用VBA所内置的对HTML和XML的操纵能力,进行语料网页的批量抓取和页面局部信息的针对性提取,也算是“Web as Corpus”的一种基本的编程实践了。可见,VBA竟然摇身一变成了“语料批量收集的瑞士军刀”了。我在优酷网有一个这方面的视频教程《比迅雷更强大的Word下载语料与转换语料之宏动作》,持续51分钟,讲解缓慢易懂,看了就觉得不遥远了……
http://v.youku.com/v_playlist/f5427313o1p4.html

VBA对网页HTML的操控主要是通过“WebBrowser”这个控件而执行的,可以浏览微软官方的在线指南而有所了解……
http://msdn.microsoft.com/en-us/library/aa752043(v=VS.85).aspx

VBA对网页HTML的页面内的元素操控则主要通过“
IHTMLDocument2”这个接口而进行,可以浏览微软官方的在线指南而有所了解……
http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx

VBA对XML文件的元素操控则主要通过“XMLNode”这个接口而进行,可以浏览微软官方的在线指南而有所了解……
http://msdn.microsoft.com/en-us/library/microsoft.office.tools.word.xmlnode.aspx

在Office Word的VBA编程的编辑器中,也具备了各种常用的可视化编程控件呢,什么按钮呀,什么文本框呀,多选框呀,图片框呀,多标签页呀,都有的。你可以在一个Word文件内部制作出多个窗体userform哟,每个窗体上都可以添加出多种控件哟,然后你仅仅写一行代码“userform1.show“就能将userform1这个名称的窗体进行运行,然后你仅仅写一行代码“userform1.hide”就能将userform1这个名称的窗体进行隐藏,很方便!



VBA对磁盘文件系统的操控也是看一眼就懂的。例如:
kill("d:\1.doc") 这是删除d盘根目录的1.doc这个文件;
kill("d:\*.doc") 这是删除d盘根目录的所有的doc文件;
filecopy("d:\1.jpg","e:\2.jpg") 这是把d盘根目录的1.jpg拷贝一份到e盘根目录且命名为2.jpg;
filelen("d:\tools\good.rar") 这是查询d盘的tools文件夹的good.rar这个文件的体积为多少字节;
mkdir("e:\books") 这是在e盘新建一个books文件夹;
rmdir("f:\corpus") 这是删除f盘的corpus文件夹;

VBA对单个txt文件的“写操作”也是简洁。例如(在d盘新建一个1.txt,然后写入一句话“I love corpus linguistics.”):
Sub 输送一句话到txt文件()
Open "d:\1.txt" For Output As #1
Print #1, "I love corpus linguistics."
Close #1
End Sub


VBA对单个txt文件的“读操作”也是简洁。例如(从d盘的1.txt读取第一个自然段到string1这个变量,然后弹出一个对话框把第一个自然段的内容呈现出来):
Sub 从txt文件读取第一自然段()
Open "d:\1.txt" For Input As #1
Line Input #1, string1
Close #1
MsgBox string1
End Sub

VBA对字符串的任意摆布也较为强大,具有较丰富的字符串函数,例如:长度计算,子串查找,大小写变换,左侧截取,右侧截取,中段截取,两侧空格剔除,子串替换,字符串逆序排列,ASC值计算,Unicode值计算,自动拆分字符串,自动合并字符串,等等。如果我们想要把当前打开的一个Word文件的所有自然段之中含有against这个单词的自然段都提取出来,发送到d盘的1.txt文件,那么,VBA源代码也就是:

Sub KWIC提取的基本效果()
Open "d:\1.txt" For Output As #1
For counter = 1 To Paragraphs.Count
If InStr(1, Paragraphs(counter).Range.Text, "against") > 0 Then
Print #1, Paragraphs(counter).Range.Text
End If
Next
Close #1
End Sub
VBA的数据库编程是调用DAO技术或ADO技术(它比DAO要新一些),它俩都能访问Access的MDB数据库文件或者通过ODBC而访问微软公司的其他类型的数据库。例如,我们有一个“lexicon.mdb”与我们的一个Word文件放在同一个文件夹,这个mdb数据库含有“表1”,而“表1”中有“单词词形”和“单词释义”这两个数据字段,已经存入了足够多的数据记录内容了。那么,我们希望在这个Word中写入一些VBA代码来实现对当前我们用鼠标选中的英语单词的弹出消息对话框方式的自动查询,如果查不到单词释义则弹出“没有查到该单词!”的消息框。那么,我们可以在Word文件中写入以下的VBA源代码:

Sub 数据库_查询被选单词的释义()
Dim db1 As DAO.Database
Dim set1 As DAO.Recordset
Set db1 = OpenDatabase(ActiveDocument.Path & "\lexicon.mdb")
Set set1 = db1.OpenRecordset("select * from 表1 where 单词词形='" & Trim(Selection.Text) & "';")
If set1.RecordCount <> 0 Then define$ = set1.Fields("单词释义").Value
If set1.RecordCount <> 0 Then MsgBox define$ Else MsgBox "没有查到该单词!"
set1.Close
db1.Close
Set set1 = Nothing
Set db1 = Nothing
End Sub
可见,数据库VBA编程也并非需要什么数学知识或需要什么理工科的思维能力,只不过是按部就班地掌握了“相关功能的调用指令的套路化写作”而已。
 

附件

Last edited:
回复: 孟庭苇《网上有些词做的云》:VBA之小试牛刀

原来VBA有如此强大!谢谢分享!
 

李亮1975重庆

语料库快乐军政委
VBA与其他软件及Windows及DOS命令的交互

VBA也能借助shell()函数而调用Windows的DOS程序或DOS命令或正常的EXE程序,同时传递所要执行的参数,看起来就像VBA在自动实现这些功能似的呢。例如,我们用VBA代码来调用“记事本”打开d盘上的1.txt文件,那么,VBA代码就是:

Sub 用记事本打开D盘的一个文件()
Shell "c:\windows\notepad.exe d:\1.txt", vbMaximizedFocus
End Sub
这里的vbMaximizedFocus就是shell的一个参数,表示“把记事本运行起来之后,最大化且处于当前窗口状态”。

VBA对system32文件夹里面躺着的独立的DOS命令(也叫做“DOS外部命令”)也能通过shell()而调用。例如:shutdown.exe这个文件可以执行关机或重启或注销的任务呢,但是需要传递少量参数给它。所以,我们可以写出如下的VBA命令来进行关机哟:

Sub 用DOS命令关机或重启()
Shell "c:\windows\system32\shutdown.exe -s -t 60 "
End Sub
“-s -t 60”中的-s就是shutdow的首字母缩写,-t就是延迟多少秒执行而开始倒计时的对话框,60就是60秒了。

而taskkill也属于DOS外部命令,也能被VBA调用而用来强行结束其他exe的运行呢,相当于进程杀灭器了,是躺在system32文件夹的taskkill.exe。VBA代码如下:

Sub 强行结束ie进程()
Shell "c:\windows\system32\taskkill.exe /im iexplore.exe"
End Sub

VBA也能调用执行DOS内部命令(就是内含在cmd.exe)中的DOS命令,例如:dir,copy,del。这些命令是无法直接被shell()函数执行的,只能“委托”cmd.exe来执行,下面的代码中的“/k”就是让cmd.exe窗口弹出且保持不关闭,如果你需要弹出cmd窗口而自动在执行关闭之后关闭的话就把“/k”替换为“/c”。

Sub 执行DOS内部命令()
Shell "c:\windows\system32\cmd.exe /k dir d:\ ", vbMaximizedFocus
End Sub
当你C盘安装了WinRar的情况下,VBA也能调用它,向它传送参数而实现压缩文件或解压缩呢。例如,我们希望把d盘根目录的所有txt压缩为一个d盘的1.rar,那么就可以有下面的VBA代码(“winrar.exe a”的a就是archive,就是压缩的意思的参数哟):

Sub VBA对WinRar的调用()
Shell "c:\program files\winrar\winrar.exe a d:\1.rar d:\*.txt"
End Sub
如果你希望用VBA代码来查询当前Word文件中的某个单词在某个在线词典中的详细内容也是可以的,只需要给Internet Explorer传递参数就行的,它躺在“C:\Program Files\Internet Explorer\iexplore.exe”,如下面的两段示例代码(运行之前,先双击选中一个英语单词哟):

Sub 用选中单词查牛津在线()
Shell "C:\Program Files\Internet Explorer\iexplore.exe http://oxforddictionaries.com/definition/" & Selection, vbMaximizedFocus
End Sub

Sub 用选中单词查词霸在线()
Shell "C:\Program Files\Internet Explorer\iexplore.exe http://www.iciba.com/" & Selection, vbMaximizedFocus
End Sub

VBA的shell()函数也能对RunDLL32.exe的丰富功能进行调用而实现各种VBA本来很难实现的功能,例如:

Sub 借RunDLL32来弹出添加删除程序的面板()
Shell "RunDLL32.exe shell32.dll,Control_RunDLL appwiz.cpl,,0", vbMaximizedFocus
End Sub

Sub 借RunDLL32来弹出日期时间的面板()
Shell "RunDLL32.exe shell32.dll,Control_RunDLL timedate.cpl,,0", vbMaximizedFocus
End Sub

Sub 借RunDLL32来弹出CPU和内存配置()
Shell "RunDLL32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0", vbMaximizedFocus
End Sub

其实,RunDLL32的常用功能都多达50个以上,更多的功能调用请参考:
http://www.enet.com.cn/article/2007/0629/A20070629695664.shtml

VBA借助system32文件夹的sort.exe也能进行大容量的txt文件中所含的单词列表的闪电排序。“sort.exe c:\1.txt /o c:\2.txt”这个命令的含义就是把1.txt的内容进行排序,输出到2.txt中去,“/o”就是用来指明排序结果存放的最终文件的位置。例如,我们在1.txt中有如下内容……

one
two
three
four
five
six

而我们用下面的VBA代码进行了处理……

Sub 借sort进行词表文件排序()
Shell "c:\windows\system32\sort.exe c:\1.txt /o c:\2.txt", vbMaximizedFocus
End Sub
结果,我们得到了如下的2.txt的内容……

five
four
one
six
three
two

显然,这是按照字母顺序从左向右地排序的,如果需要逆序排序的话,则要使用“/R”这个参数,也就是“
sort.exe /R c:\1.txt /o c:\2.txt”。

在system32文件夹也有ipconfig.exe这个程序,它能进行本机的IP信息的详细查询,包括网关IP,网卡MAC地址,DNS服务器地址,DHCP服务器地址,内网IP呢。所以,VBA对它的调用也是一种福音……

Sub 进行内网IP详细查询()
Shell "c:\windows\system32\cmd.exe /k ipconfig.exe /all", vbMaximizedFocus
End Sub

Sub 自动获取动态IP()
Shell "c:\windows\system32\cmd.exe /k ipconfig.exe /renew", vbMaximizedFocus
End Sub

Sub 自动释放现有IP()
Shell "c:\windows\system32\cmd.exe /k ipconfig.exe /release", vbMaximizedFocus
End Sub

在system32文件夹也有接近20个MSC文件(以msc为文件扩展名的文件,Microsoft Management Control叫做“微软管理控制台”文件系列),双击可以运行而弹出一些系统关键设置,这些设置都是在控制面板中的某些重要项目,例如:设备管理器,磁盘管理器,事件查看器,本地安全策略设置,磁盘碎片整理程序,等等。它们不能被shell()函数进行直接调用,但可以被cmd.exe进行间接调用,下面是若干实例……
Sub 调用设备管理器()
Shell "c:\windows\system32\cmd.exe /c devmgmt.msc", vbMaximizedFocus
End Sub

Sub 调用磁盘管理器()

Shell "c:\windows\system32\cmd.exe /c diskmgmt.msc", vbMaximizedFocus
End Sub

Sub 调用组策略管理器()

Shell "c:\windows\system32\cmd.exe /c gpedit.msc", vbMaximizedFocus
End Sub

Sub 调用本地用户和组管理器()

Shell "c:\windows\system32\cmd.exe /c lusrmgr.msc", vbMaximizedFocus
End Sub

Sub 调用各项本地服务管理器()

Shell "c:\windows\system32\cmd.exe /c services.msc", vbMaximizedFocus
End Sub


 
Last edited:
回复: 孟庭苇《网上有些词做的云》:VBA之小试牛刀

谢谢李亮1975重庆的精彩代码!
 
回复: 孟庭苇《网上有些词做的云》:VBA之小试牛刀

这么多源代码!感谢李亮博士的无私!
 

李亮1975重庆

语料库快乐军政委
VBA与find.exe与findstr.exe:DOS下的KWIC(闪电强大)

System32作为Windows的神经中枢,也有find.exe这个相当于KWIC的神奇快刀呢!我在本坛的一次回帖中,已经做了较为详细阐释,请参考:
http://www.corpus4u.org/forum/showpost.php?p=44508&postcount=44

值得特别指出的是,find.exe不仅可以提取“含有关键词的自然段”,也能提取“不含有关键词的自然段”呢,这对于针对某些高频词的研究可能有奇特功效。例如,你希望找出一个语料库中的不含有the的自然段,用Wordsmith或AntConc的话,它们恐怕只能找“含有某词的段落”,不能找“不含有某词的段落”。“/v”参数就是让find.exe找不匹配的所有段落的。据此,我们有下列的两个VBA代码……

Sub 用find来KWIC()
Shell "cmd.exe /c find.exe " & Chr$(34) & "against" & Chr$(34) & " d:\1.txt > d:\2.txt"
End Sub

Sub 用find来KWIC提取不匹配的段落()
Shell "cmd.exe /c find.exe /v " & Chr$(34) & "against" & Chr$(34) & " d:\1.txt > d:\2.txt"
End Sub
上面的Chr$(34)就是产生“双引号”,因为 find.exe偏要把搜索词放在两个双引号之间呢,而VBA也需要双引号来进行参数传递,所以有点小冲突,所以我不得不做了上面的精简与改动,就能顺利执行了,同时由于cmd.exe就在system32系统文件夹,无需在shell函数中标明它的完整路径,所以可以直接呈现它的文件名即可,而整个VBA代码实测是有效哟,都是把d:\1.txt的相应的自然段都提取到d:\2.txt中去。

在system32文件夹的KWIC惊喜不只是find.exe呢,更强大的是findstr.exe呢,它支持正则表达式呢,而find.exe并不支持正则表达式,而且findstr.exe也支持对一个文件夹及其子文件夹的所有txt进行自动检索呢,仅仅指明顶层路径和模糊匹配的文件名即可。另外,findstr.exe支持多个关键词的整体检索或多选一的检索呢,而find.exe只支持一个关键词或词串呢。当然,finstr.exe也支持 “不匹配的自然段的检索或提取”呢。还是瞅一瞅下面的代码吧……

Sub 用findstr做多词任选一的KWIC()
Shell "cmd.exe /c findstr.exe " & Chr$(34) & "kill killed kills killing" & Chr(34) & " d:\1.txt > d:\2.txt"
End Sub

Sub 用findstr做多词任选一的KWIC的不匹配提取()
Shell "cmd.exe /c findstr.exe /v " & Chr$(34) & "the a an" & Chr(34) & " d:\1.txt > d:\2.txt"
End Sub

Sub 用findstr做多词为整体的KWIC()
Shell "cmd.exe /c findstr.exe /c:" & Chr$(34) & "against it" & Chr(34) & " d:\1.txt > d:\2.txt"
End Sub

Sub 用findstr做多文件的KWIC()
Shell "cmd.exe /c findstr.exe /s " & Chr$(34) & "against it" & Chr(34) & " d:\corpus\*.txt > d:\2.txt"
End Sub

上面的“Sub 用findstr做多词任选一的KWIC()”是把“d:\1.txt”中含有kill或killed或kills或killing的任意一个的自然段提取出来,保存到d:\2.txt中去。

上面的“Sub 用findstr做多词任选一的KWIC的不匹配提取()”是
把“d:\1.txt”中不含有the且不含有a且不含有an的自然段都提取出来,保存到d:\2.txt中去。

上面的“Sub 用findstr做多词为整体的KWIC()”是把“d:\1.txt”中含有“against it”的自然段都提取出来,保存到d:\2.txt中去。

上面的“Sub 用findstr做多文件的KWIC()”是把“d:\corpus”文件夹及其子文件夹中的所有的txt文件的含有“against it”的自然段都提取出来,保存到d:\2.txt中去。

关于findstr.exe的更多奥秘,请参考……

http://www.computerhope.com/findstr.htm
 

李亮1975重庆

语料库快乐军政委
《VBA与注册表:直接读写,或间接读写》

[FONT=黑体]《VBA与注册表:直接读写,或间接读写》[/FONT]

Windows注册表最早出现在Windows 3.1(1992年3月面世)上,相当于一个“软件硬件的配置总库”,对整个Windows的正常运行和界面风格起着至关重要的作用,善于利用它则可以大幅度改善Windows性能,蓄意利用它则可以实现各种(病毒或黑客的)罪恶目的,错误修改它则导致死机或无法启动Windows或各种其他故障。





可见,注册表是一个树形层级结构的,类似于XML的树形层级结构,也类似于我们的Windows文件夹系统,可以顶层细分出多个子层,子层还可以有子层。注册表有5大顶级分支,每个分支又细分为很多个分支,在这些分支的中间或终端可以建立“键”和“键值”,这里的“键与键值”相当于“变量名与变量值”或“文件名与文件内容”。键值可以是“二进制的数值”或“十进制的数值”或“一定长度的字符串”。

VBA对注册表的读取与写入,主要有4种手段:(1)直接的专用位置方式;(2)借助reg.exe的DOS命令方式;(3)借助Windows脚本宿主的WScript方式;(4)借助RegEdit.exe的命令行参数传递而导入自或导出到.reg文件。

“直接的专用位置方式”就是VBA的两个内置函数SaveSetting()和GetSetting()和DeleteSetting(),仅仅只能对HKEY_CURRENT_USER\Software\VB and VBA Program Settings这个专用位置进行读写。这种方式很安全,不会对Windows或其他软件造成干扰或破坏。

“借助reg.exe的DOS命令方式”就是利用system32文件夹中的DOS外部命令reg的参数传递而实现对整个注册表的任意修改或任意添加删除或导出备份或导入重建。

“借助Windows脚本宿主的WScript方式”就是利用system32文件夹中的WScript.exe对Windows脚本语言(VBScript和JScript)的运行支持,而在VBA中创建出“VBScipt脚本对象”而实现对注册表的全面操控。

“借助RegEdit.exe的命令行参数方式”要提前准备好要导入所依赖的.reg文件。“/s”表示安静地无提示地导入;“/e c:\1.reg”或"regedit /e c:\1.reg HKEY_LOCAL_MACHINE\Software"表示导出整个或局部注册表;直接导入就是“regedit d:\1.reg”这样的格式。

这四种方式的第一种功能极为有限,只能存储针对当前Office用户的某些个性化信息或记录一些软件运行的状态,后三种方式是对注册表的全面掌控,因此需要倍加小心,最好在较多学习相关的软硬件知识之后再实践。

假设我们需要在注册表中记录当前的My Dream.doc有单词数量(Word Number)为动词(Verbs)10个,名词(Nouns)20个,形容词(Adjectives)30个。
下面的第一段和第二段代码就是“写入”,也相当于“新建”,也相当于“修改”,都是使用SaveSetting()。
下面的“删除1”是删除100和200和300这三个值,而“删除2”是删除Verbs和Nouns和Adjectives这三个名称,而“删除3”是删除整个“My Dream.doc”分支。


Sub VBA对注册表的专用区域的写入()
SaveSetting appname:="My Dream.doc", Section:="Word Number", Key:="Verbs", setting:=10

SaveSetting appname:="My Dream.doc", Section:="Word Number", Key:="Nouns", setting:=20

SaveSetting appname:="My Dream.doc", Section:="Word Number", Key:="Adjectives", setting:=30

End Sub


Sub VBA对注册表的专用区域的修改()

SaveSetting appname:="My Dream.doc", Section:="Word Number", Key:="Verbs", setting:=100

SaveSetting appname:="My Dream.doc", Section:="Word Number", Key:="Nouns", setting:=200

SaveSetting appname:="My Dream.doc", Section:="Word Number", Key:="Adjectives", setting:=300

End Sub


Sub VBA对注册表的专用区域的删除1()

DeleteSetting appname:="My Dream.doc", Section:="Word Number", Key:="Verbs"

DeleteSetting appname:="My Dream.doc", Section:="Word Number", Key:="Nouns"

DeleteSetting appname:="My Dream.doc", Section:="Word Number", Key:="Adjectives"

End Sub


Sub VBA对注册表的专用区域的删除2()

DeleteSetting appname:="My Dream.doc", Section:="Word Number"

End Sub


Sub VBA对注册表的专用区域的删除3()

DeleteSetting appname:="My Dream.doc"

End Sub


Sub VBA对注册表的专用区域的读取()

MsgBox GetSetting("My Dream.doc", Section:="Word Number", Key:="Verbs")

End Sub


Reg.exe有query,add,delete,copy,save,restore,load,unload,compare,export,import等一系列参数。例如,我们可以直接在DOS命令窗口进行如下的操作:

当我们需要查询某个注册表分支及其子分支与取值,就输入下面……
reg.exe query "HKEY_CURRENT_USER\software\vb and vba program settings" /s

当我们需要给某个注册表子分支赋值,就输入下面……(/f表示强行添加而无需提示,/v就是键名,/d就是键值)
reg.exe add "HKEY_CURRENT_USER\software\vb and vba program settings\My Dream.doc\word number" /v Verbs /d 100 /f

当我们需要删除“HKEY_CURRENT_USER\software\vb and vba program settings\My Dream.doc\word number”的Verbs这个键名及其取值,就输入下面……
reg.exe delete "HKEY_CURRENT_USER\software\vb and vba program settings\My Dream.doc\word number" /v Verbs /f

当我们需要把“HKEY_CURRENT_USER\software\vb and vba program settings\My Dream.doc\word number”,导出到d盘的1.reg文件,就输入下面……
reg.exe export "HKEY_CURRENT_USER\software\vb and vba program settings\My Dream.doc\word number" d:\1.reg

当我们需要导入d盘的1.reg文件,就输入下面……
reg.exe import "d:\1.reg"

有了上述基础,我们就可以写出如下的VBA代码来操控reg.exe了!(下面的Chr$(34)就是双引号,是为了避免与长长的且有空格的注册表分支表达式的双引号发生冲突)


Sub VBA借reg对注册表的专用区域的读取()
Shell "cmd.exe /k reg.exe query " & Chr$(34) & "HKEY_CURRENT_USER\software\vb and vba program settings" & Chr$(34) & " /s", vbMaximizedFocus
End Sub

Sub VBA借reg对注册表的专用区域的删除1()
Shell "cmd.exe /k reg.exe delete " & Chr$(34) & "HKEY_CURRENT_USER\software\vb and vba program settings\My Dream.doc\word number" & Chr$(34) & " /v Verbs /f", vbMaximizedFocus
End Sub

Sub VBA借reg对注册表的专用区域的删除2()
Shell "cmd.exe /k reg.exe delete " & Chr$(34) & "HKEY_CURRENT_USER\software\vb and vba program settings\My Dream.doc\word number" & Chr$(34) & " /f", vbMaximizedFocus
End Sub

Sub VBA借reg对注册表的专用区域的导出()
Shell "cmd.exe /k reg.exe export " & Chr$(34) & "HKEY_CURRENT_USER\software\vb and vba program settings" & Chr$(34) & " d:\1.reg", vbMaximizedFocus
End Sub

Sub VBA借reg对注册表的导入()
Shell "cmd.exe /k reg.exe import " & "d:\1.reg", vbMaximizedFocus
End Sub

Sub VBA借reg对注册表的专用区域的赋值或修改值()
Shell "cmd.exe /k reg.exe add " & Chr$(34) & "HKEY_CURRENT_USER\software\vb and vba program settings\My Dream.doc\word number" & Chr$(34) & " /v Verbs /d 100 /f", vbMaximizedFocus
End Sub

WScript全称“Windows Scripting Host”,起源于Windows 98,它所对应的程序“WSCript.exe”是一个脚本语言解释器,位于C:\WINDOWS\system32目录下,正是它才使得脚本可以被执行,就象执行批处理一样,可以拿来执行.wsh,.vbs,.js等。


Sub VBA借WScript对注册表的任意分支的赋值与修改值与清空值()
Dim WshShell
Set WshShell = Interaction.CreateObject("WScript.Shell")
WshShell.RegWrite "HKEY_CURRENT_USER\software\vb and vba program settings\Word Number\Nouns", "50", "REG_SZ"
End Sub

Sub VBA借WScript对注册表的任意分支的删除1()
Dim WshShell
Set WshShell = Interaction.CreateObject("WScript.Shell")
WshShell.RegDelete "HKEY_CURRENT_USER\software\vb and vba program settings\Word Number\Nouns"
End Sub

Sub VBA借WScript对注册表的任意分支的删除2()
Dim WshShell
Set WshShell = Interaction.CreateObject("WScript.Shell")
WshShell.RegDelete "HKEY_CURRENT_USER\software\vb and vba program settings\Word Number\"
End Sub

Sub VBA借regedit对注册表的安静的无提示的导入()
Shell "regedit.exe /s c:\1.reg"
End Sub

Sub VBA借regedit对注册表的有提示的导入()
Shell "regedit.exe c:\1.reg"
End Sub

Sub VBA借regedit对注册表的全部导出()
Shell "regedit.exe /e c:\1.reg"
End Sub

Sub VBA借regedit对注册表的局部导出()
Shell "regedit.exe /e c:\1.reg " & Chr$(34) & "HKEY_CURRENT_USER\software\vb and vba program settings" & Chr$(34)
End Sub

VBA对注册表的全面操控,其实可以大幅度增强Windows的性能和个性化和安全性呢。例如:

Sub VBA借WScript对注册表的IE浏览器的默认主页设置为空白页()
Dim WshShell
Set WshShell = Interaction.CreateObject("WScript.Shell")
WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Start Page", "about:blank", "REG_SZ"
End Sub

Sub VBA借WScript对注册表的IE浏览器的默认主页设置为新浪网()
Dim WshShell
Set WshShell = Interaction.CreateObject("WScript.Shell")
WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Start Page", "http://www.sina.com.cn", "REG_SZ"
End Sub
 
回复: 孟庭苇《网上有些词做的云》:VBA之小试牛刀

长篇好帖,这个必须顶!谢谢李亮1975重庆!
 

李亮1975重庆

语料库快乐军政委
《让VBA面对优盘病毒吧!当你优盘的文件和文件夹都被病毒们隐藏起来……》

《让VBA面对优盘病毒吧!当你优盘的文件和文件夹都被病毒们隐藏起来……》

英语是最先进知识的最重要语言;IT是最多数财富的最主要存储。熟练掌握英语的上网者往往面临计算机病毒入侵的更高概率。这是个计算机病毒肆虐的时代,移动设备与局域网与互联网,这是病毒滋生与传播的三大场所。经常有外语专业的师生突然发现自己的优盘上的文件都“消失”了,其实是病毒的蓄意所为,并非删除了,而是把优盘上的文件和文件夹都设置为了“隐藏”和“系统”属性,所以,Windows的默认状态是“不显示隐藏属性和系统属性的文件和文件夹”的情况下,你就双击优盘或移动硬盘或mp3或数码存储卡都看不到里面的内容,却可以发现这些地方并不是”空空如也“,而是”你的文件和文件夹都藏起来了,不显示“而已。

当你刚刚在街头的打印店感染了病毒而导致优盘上的所有文件和文件夹都貌似消失了,整个优盘都貌似空空如也了,你走上讲台,插入优盘想要打开上面的PPT的时候,你发现你无比难堪,你也不知道如何面对这样的”小小的难题“的时候,本帖所介绍的知识和提供的”让VBA面对优盘病毒吧.doc“,就是你的救星了!

杀毒软件们只是杀毒,它们不是医生,它们也不认为且从来不会帮你把优盘上的隐藏属性的文件和文件夹都显示出来的,这个修复工作虽然也可以找到其他的专门工具,但是,你也许没有想到VBA利用Dir()函数竟然能让优盘文件及文件夹的“真身重现”!

你把本帖所提供的
”让VBA面对优盘病毒吧.doc“,存放到你的邮箱或某个不怎么使用的优盘或你的网络硬盘或你的QQ文件中转站吧,当你的某个优盘受病毒作用而看不到所有文件和文件夹的时候,你就从你邮箱把”让VBA面对优盘病毒吧.doc“下载到你的优盘的根目录,打开这个Word文件,就能看到顶部的新增的自定义菜单,这个自定义菜单的名称就是”让VBA面对优盘病毒吧“,它有三个下拉的子项目,你分别点击其中的”强悍删除“和”取消隐藏“,就能”重见天日“了!

如果你实在是十万火急而毫无心情的话,那你还有另一个工具:WinRAR。它在几乎所有的电脑中都安装了,你从开始菜单的”程序“的列表,找到它,是”WinRAR“,它的子项目含有”WinRAR“,你点一下就启动了,就能看到如下的画面,在WinRAR的主界面上你能看到”类似我的电脑的地址栏“的地址栏,你点这个下拉列表就能切换到你的优盘所在的盘符,就能看到优盘上的所有的文件和文件夹了,哪怕是隐藏属性的文件和文件夹也能显示呢!





让VBA面对优盘病毒吧.doc,这个文件包含了下面的VBA源代码,所以具有了类似一个EXE文件的功能,当然你的”宏安全级别“必须手工设置为”低“,你才能运行下面的”具有治疗修复作用的宏代码“……

Sub VBA对Autorun_inf的强悍删除()
If Dir(ActiveDocument.Path & "\autorun.inf") <> "" Then
SetAttr ActiveDocument.Path & "\autorun.inf", vbNormal
Kill ActiveDocument.Path & "\autorun.inf"
MsgBox "恭喜你,Autorun.inf被删除了!"
Else
MsgBox "当前位置没有发现autorun.inf"
End If
End Sub


Sub VBA对当前位置的所有文件及文件夹的取消隐藏()
' Dir()中的参数“23”就是指查找包括隐藏属性及系统属性的文件和文件夹
' SetAttr()对正在运行的程序或已经打开的文件进行操作则发生错误且自动中断
' “on error resume next”是为了避免SetAttr()发生错误而中断
On Error Resume Next
something = Dir(ActiveDocument.Path & "\*", 23)
While something <> ""
' “.”表示当前文件夹,“..”表示上一层文件夹
If something <> "." And something <> ".." Then
SetAttr ActiveDocument.Path & "\" & something, vbNormal
End If
something = Dir()
Wend
End Sub

Sub VBA对当前位置的所有文件及文件夹进行隐藏()
' Dir()中的参数“23”就是指查找包括隐藏属性及系统属性的文件和文件夹
' SetAttr()对正在运行的程序或已经打开的文件进行操作则发生错误且自动中断
' “on error resume next”是为了避免SetAttr()发生错误而中断
On Error Resume Next
something = Dir(ActiveDocument.Path & "\*", 23)
While something <> ""
' “.”表示当前文件夹,“..”表示上一层文件夹
If something <> "." And something <> ".." Then
SetAttr ActiveDocument.Path & "\" & something, vbHidden
End If
something = Dir()
Wend
End Sub


VBA的常用文件系统函数有……

FileCopy(Source As String, Destination As String)
例如,FileCopy("d:\1.txt", "d:\2.txt"),但不支持通配符,必须指明具体文件
这个函数也支持直接拷贝隐藏属性的文件,但是拷贝出来的文件已经丧失了原来的隐藏属性

FileDateTime(PathName As String)
例如:FileDateTime("d:\1.txt") 是查询这个文件的最后修改时间

FileLen(PathName As String)
例如:FileLen("d:\1.txt") 是查询这个文件的总字节数量或文件大小

GetAttr(PathName As String) As VbFileAttribute
这是查询属性是否涉及到隐藏或系统或只读,也查询到底是文件或是文件夹,不支持通配符的模糊匹配

SetAttr(PathName As String, Attributes As VbFileAttribute)
这是设置或取消针对文件或文件夹的隐藏或系统或只读属性,不支持通配符的模糊匹配

Kill(PathName)
这是删除某个或某些文件,支持星号和问号这两个通配符的模糊匹配

MkDir(Path As String)
这是新建文件夹,但如果已经存在了同名的文件夹就出现运行错误的提示

RmDir(Path As String)
这是删除不含有任何文件或文件夹的文件夹,不能删除仍然含有文件(夹)的文件夹
 

附件

Last edited:

李亮1975重庆

语料库快乐军政委
重新上传的“让VBA面对优盘病毒吧.doc",中午上传的版本是无效的哟!

不好意思呀,中午上传之后,发现我上传的"让VBA面对优盘病毒吧.doc"的VBA源代码是不完整的,其实不能运行;所以,现在6小时之后,我重新上传了,此刻开始的文件就是含有能正常运行的VBA源代码的文件了。所以,希望测试或珍藏的朋友,欢迎重新下载!
 

附件

李亮1975重庆

语料库快乐军政委
VBA的选中与删除

VBA的选中与删除

VBA依附于MS Office的最突出优势就是“具备对字符、字、词、句、行、段落、全文、窗口”的完整操控模型,尤其是句子的操控,因为句子的起点与终点的自动判断其实挺复杂的。我们对语料文件的处理总是要涉及到“用鼠标选中(highlight或select)一个单词或句子或某个范围,然后进行删除或字体颜色的改变或字号的更改之类的”。借助VBA的代码,我们的语料编辑操作可以变得“自动而灵活甚至带些智能”呢。

我们需要选中全文所有文字内容的时候,我们可以执行下列两个代码行的任何一个:

ActiveDocument.Range.Select
Selection.WholeStory


我们需要选中第3个自然段的时候,我们执行:

ActiveDocument.Paragraphs(3).Range.Select
也可以省略为:
Paragraphs(3).Range.Select
注意:段落的选中也包括了紧随其后的一个回车符号哟

句子和单词的选中,假设还是第3个词或句,稍微有所不同:

Sentences(3).Select
Words(3).Select
当然也可以写得更完整一些:
ActiveDocument.Sentences(3).Select
ActiveDocument.Words(3).Select
注意:单词或句子被选中的时候,都包括了紧接其后的一个空格哟

“一个字符”在计算机技术中,可以是指一个空格甚至一个不可见字符或一个乱码字符或某个标点或一个汉字或一个回车符号。所以,第3个字符被选中的代码就是:

Characters(3).Select

那么,在以上的各个层次上,都可以把select这个动作变为delete呢,也就是……

ActiveDocument.Range.Delete
ActiveDocument.Paragraphs(3).Range.Delete
Paragraphs(3).Range.Delete
ActiveDocument.Sentences(3).Delete
ActiveDocument.Words(3).Delete
Sentences(3).Delete
Words(3).Delete
ActiveDocument.Characters(3).Delete

在VBA的对象模型中,我们还可以用first和last这样的模糊指称呢,也就是……

Characters.First.Delete
Words.First.Delete
Sentences.First.Delete
Paragraphs.First.Range.Delete
Characters.Last.Delete
Words.Last.Delete
Sentences.Last.Delete
Paragraphs.Last.Range.Delete

如果我们希望删除前3个单词,我们就可以执行3次“第1个单词的删除”的动作……

Words.First.Delete
Words.First.Delete
Words.First.Delete
当然,你可以用循环结构来代替……
for a=1 to 3
Words.First.Delete
next

上面的“3”可以替换为任何的正整数哟,威力就大起来了。那么,把第5个单词到第7个单词都删除的话,就只需要进行3次的第5个单词的删除就行了,因为每删除一个单词,后续的一个单词就“挤上来了一个位置”……
For a=1 to 3
Words(5).Delete
Next


在此基础上,为了更加方便地删除某个连续的范围的字符或单词或句子或段落,我们可以制作一个“子过程”,让其他过程或模块可以调用它,例如:

Sub delete_some_words(a, b)
For c = 1 To b
Words(a).Delete
Next
End Sub

这里,sub就是subroutine或subprocedure的缩写。上面的“子过程”有两个参数(也叫做“形式参数”),当我们调用整个子过程的时 候,同时给两个参数赋值就行了,a参数是删除单词的起点,b参数是持续多少个单词。所以,我们如果要删除第5个单词到第7个单词都删除的话,就只需要如下的代码来调用delete_some_words(a, b)这个函数即可……
Call delete_some_words(5, 3)

最后,我想说“会潜水的人,才是真的会游泳;VBA是潜水,操作是游泳。”
 

李亮1975重庆

语料库快乐军政委
《大型TXT语料文件的手工操作与VBA编程的13大策略(从初级到高级到超级到无限级)》

《大型TXT语料文件的手工操作与VBA编程的13大策略》
——(从初级到高级到超级到无限级)


[FONT=幼圆]语料库建设过程中,我们经常遇到几十兆或数百兆(MB)甚至一两个GB的txt文件[/FONT],在我们最熟悉的Microsoft Word中操作吧,它响应速度慢且占用内存高而导致整个电脑的响应速度明显变慢;在Microsoft Word中进行VBA编程吧,也容易造成整机响应速度糟糕的局面;用“附件”中的“记事本”进行大型TXT语料文件的操作吧,它动不动就说“内存不足,无法加载”;用“附件”中的“写字板”进行大型txt文件处理吧,它也只是一种在功能和响应速度在Microsoft Word和“记事本”之间的一个折衷方案而已。因此,我有下面的一系列策略供手工操作和VBA编程者进行具体情况具体选择……

【初级策略】

更高版本的Office
较新版本的WPS
禁用拼写语法检查
采用“Web版式”视图

【中级策略】

持续地有规律地隐藏大量文字
禁用前台的屏幕刷新
持续地频繁地有规律地自动保存
直接操作对象而不是移动插入点

【高级策略】

局部式后台读写
以命令行方式调用DOS外部命令或其他程序
全部式后台读写

【超级策略】

以UltraEdit和EmEditor为代表的文件加载型文本编辑器

【无限级策略】

以WinHex和HxD为代表的磁盘读写型文本修改器

现在,我简单说明一下上述的策略的一些具体的含义和概念和优势。


更高版本的Office,确实比更低版本的Office的处理速度显著提升了,这是情理之中的,不过,MS Word打开大型txt文件始终是占用内存很多,一旦开始手工操作或VBA代码的执行,执行的速度和对电脑整体运行的影响,要取决于你的内存大小和其他程序的内存占用情况和CPU的频率高低。


较新版本的WPS,在处理大型txt文件的时候占用内存比MS Word要少得多,这是我们国产的精品软件,与MS Office相比,显得小巧很多却依然保持几乎相同的功能数量和品种和几乎相同的界面风格,甚至绝大部分菜单项目也是相同的。此外,WPS也含有VBA 呢,跟MS Office的VBA几乎相同,只是稍微省略了少量的函数与对象。在处理大型txt文件的时候,往往是一个惊喜。WPS分为个人版与专业版,其个人版是完全免费的,专业版需要注册码,网址是 http://www.wps.cn/


禁用拼写语法检查,是针对在MS Office的操作的,在你编辑的时候,同时进行拼写语法的检查是很占用相当的内存的。所以,在菜单“工具”中选择“选项”,在弹出的“选项”对话框中选 择“拼写和语法”取消两个勾选即可,也就是“键入时检查拼写”和“键入时检查语法”。而在Word 2007中,可以参考这个网址的做法 http://www.hx95.com/Article/OS/201112/48587.html


采用“Web版式”视图,这是取消自动分页,所以,在大规模处理文本的时候,自动页码编排的功能就没有了,运行速度就大大提升了。你在菜单“视图”中选择“Web版式”就实现了本技巧。


持续地有规律地隐藏大量文字,默认情况下,任何字词段落都可以在MS Word中设置为隐藏,一旦隐藏就不再占用内存来显示它们了,所以能腾出很多内存来。要想隐藏一个选中的单词或段落或任何片段,对着这个片段点右键,选择 “字体”,在弹出的对话框上勾选“隐藏文字”这个选项,就隐藏了相应的内容了。我们一般用“Selection.Font.Hidden = True”与“Selection.Font.Hidden = False”来进行文字片段的隐藏与显示。
我们在编辑长篇硕博论文或学术专著的时候,可以在MS Office中采用手工隐藏暂时不需要修改的文字来提升编纂的软件响应速度,此外,我们也可以采用“主控文档/子文档”的方式来进行长篇或大型TXT文件的编辑。以下网址都是“长文档与学术专著的Word编纂技巧”的视频教程……
http://v.ku6.com/show/UWzAxq_iUE1jAPix.html
http://www.tudou.com/programs/view/oSaIQ_jRVm8/request_from=cpr
http://v.youku.com/v_show/id_XMTMxMjA4ODE2.html

禁用前台的屏幕刷新,这纯粹是VBA的编程与执行的代码技巧了,"Application.ScreenUpdating = False"这句话放在VBA代码的最前面,"Application.ScreenUpdating = True"放在VBA执行代码的最后位置,这里的False和True分别是禁用和启用,在对大量语料进行持续删除或修改的时候,禁用了屏幕刷新就看不到持续的实时的工作区的文字排版变化了。


持续地频繁地有规律地自动保存,VBA代码进行自动大批量处理语料的时候,修改的部分都处于尚未保存状态而占据着大量内存而导致整个Office应用程序的内存占用的高居不下而拖慢Windows运行甚至导致Office的崩溃,所以,有必要在适当的位置上,尤其是在循环执行的末尾或一定数量的循环处理之后执行“ActiveDocument.Save”。


直接操作对象而不是移动插入点,这也是一个VBA的代码技巧而不是手工操作的技巧。Word VBA的selection对象有MoveRight、MoveLeft、MoveDown、MoveUp,MoveUntil、MoveWhile等等 的“动作函数”,这些就是“插入点的移动”,插入点就是一个闪动的光标,可以被我们的鼠标左键的点击带到在不同的位置上,也就是当前输入文字的插入点。例 如,当我们需要删除第3个单词的时候,我们要直接操作对象,就是直接用ActiveDocument.Words(3).Delete,而不是用 Selection.MoveRight系列的函数来移动插入点,直到插入点抵达第3个单词才执行第3个单词的删除。


局部式后台读写,就是不要把大型txt文件进行打开或整体加载,而是用文件读写的手段进行真正需要进行操作的部分的读出和修改之后的写入。例如,我们需要把一个1GB文件 的从前往后的400MB位置上的一个句子或段落进行某些单词的修改,那么,我们就仅仅读出这个句子或段落,让操作者进行修改后,就用文件读写的方式把修改 效果保存到这个1GB的txt文件去。


以命令行方式调用DOS外部命令或其他程序,就是用Shell函数来调用find.exe或findstr.exe或其他程序,它们往往有闪电般的处理速度,占用内存也很低。


全部式后台读写,类似于“局部式后台读写”,唯一区别在于不要呈现给操作者任何大型txt文件的内容,这显然适合于某些情况,而不适合于确实需要进行一些人工判断与人工修改的情况。


以UltraEdit和EmEditor为代表的文件加载型文本编辑器,都是商业软件,都有强大的查找替换功能,占用内存也较低,都有类似于MS VBA的强悍的宏编程能力,占用内存却极低,CPU利用率却极高,有兴趣的人,可以立即看看

http://www.ultraedit.com/support/tutorials_power_tips.html#ue
http://www.emeditor.com/help/


以WinHex和HxD为代表的磁盘读写型文本修改器,WinHex是商业软件,HxD是免费软件,都是直接读取硬盘上的txt文件,所以占用内存比UltraEdit和EmEditor还要低,是最低内存占用的大型语料文件处理手段。有兴趣的人,可以详细阅读
http://www.winhex.com/winhex/
http://mh-nexus.de/en/hxd/

本贴欢迎转载,欢迎修改,欢迎优化,欢迎批评,欢迎质疑,欢迎体验,欢迎回帖,欢迎不回帖,哈哈!


本人在本坛的个人相册,有一系列的生活照,欢迎浏览……
http://www.corpus4u.org/forum/album.php?albumid=28
 
回复: 孟庭苇《网上有些词做的云》:VBA之小试牛刀

好强呀!
要想在语料库研究方面走得动还真得学一两门编程语言!
像李亮博士学习!
 

李亮1975重庆

语料库快乐军政委
【概论】VBA程序的5种类型与反思

基于2009年年初至今的4年的Office VBA开发实战,我感觉VBA程序有5种类型(教科书或教程都没有这样的类型概括哟):
【1】纯Sub型;
【2】基于Sub的菜单型;
【3】基于Sub的窗体型;
【4】基于Sub的域代码型;
【5】基于Sub的自动运行型;

Sub是subroutine或subprocedure的缩写,就是子程序或子模块,特点是可以接收参数却没有返回值,适合直接执行而不必返回执行结果的数值的情况。典型的一个Sub如下:

Sub hello()
msgbox "你好!"
End Sub

以上3行代码,第一行是“程序头”,第二行是“程序体”,第三行是“程序尾”,而蓝色的hello叫做“程序名”,而程序名之后的()是两个圆括号,表示这两个圆括号之间可以填入参数来更加灵活地执行。

从最小的运行单位来说,VBA程序就是Sub或Function两种类型,前者是无返回值的运行模块,后者是可以有返回值的运行模块。Sub及其配套的 End Sub之间的这样的一个程序代码片段是可以直接执行的,具有完全的独立性;而Function及其配套的End Function之间的这样的一个程序代码片段是不可以直接执行的,只能被其他的Function或Sub调用而仅仅具有半独立性。

一个完整独立的VBA程序,可以是:
【1】纯Sub型,也就是由若干个sub或function所组成,它们相互调用,而你点“宏列表”中的某个sub而执行某个既定的宏代码,“宏代码”也就是sub或function了;此外,你也可以通过录制宏而设置某个组合键或热键来触发式执行某个宏或sub;
【2】基于Sub的菜单型,也就是自己在Office中设置出自定义的菜单或子菜单或菜单项目,并且跟对应的sub进行链接,就形成了基于某个Word文件或Normal.dot模版文件的菜单性质的程序状态了;
【3】基于Sub的窗体型,也就是你在VBA编辑器中,插入一个用户窗体,添加按钮 呀文本框呀之类的控件,然后双击控件而写出其后台的VBA代码,同时你也可以设置窗体是打开当前文件就立即运行的,你也可以随时用VBA代码设置窗体的可 见性visible为false而隐藏它,或者设置visible为true而显现该窗体;
【4】基于Sub的域代码型,也就是你插入一个域或者MacroButton域,尤其是你插入了一个“MacroButton域”的时候你可以添加一些普通的文字作为双击而触发执行的“触发器”;
【5】基于Sub的自动运行型,也就是Sub Document_New(),或Sub Document_Open(),或Sub Document_Close()这3个特殊名称的Sub就是在当前文件或某个Word文件被新建或打开或关闭的时候能自动执行的宏代码。

有了我提供的对VBA程序类型的概括性认识,你就不会误以为VBA程序是没有窗体或没有菜单的,你就会深深地爱上这种如此简单且颇为颇为强大的编程语言, 她摆脱了C++和Java和C#的必须自己写出各种类和对象的做法,她摆脱了Perl和Python很容易牵涉到CGI编程和Linux操作系统的学习难 堪或学习复杂性,她摆脱了C语言只方便直接对纯txt文件进行操作的难堪局面,她也摆脱了Windows API对数据类型的严格限制而调用易出错的烦恼,她也摆脱了你必须学点互联网原理的先决条件,她也摆脱了必须学习较完整的XML DOM知识的烦恼,她也摆脱了你必须对Linux或Unix有所了解的烦恼,……
 
顶部