使用递归方法,遍历指定目录

Dim FolderArray(), FileArray() As String ‘全名
Dim FolderCount, FileCount As Integer

Dim I, J As Integer
SearchFiles “E:\”, “*”, True ‘查找所有文件
If IsEmptyArray(FileArray) Then Exit Sub
For I = LBound(FolderArray) To UBound(FolderArray)
Debug.Print FolderArray(I)
Next I
Debug.Print FolderCount; “Folders”
For I = LBound(FileArray) To UBound(FileArray)
Debug.Print FileArray(I)
Next I
Debug.Print FileCount; “Files”
‘调用示例(支持通配符)
‘SearchFiles “C:\Program Files\WinRAR\”, “” ‘查找所有文件 ‘SearchFiles “C:\Program Files\WinRAR\”, “.exe” ‘查找所有exe文件
‘SearchFiles “C:\Program Files\WinRAR\”, “in.exe” ‘查找文件名中包含有 in 的exe文件

Private Function SearchFiles(sTargetPath As String, sPartialName As String, Optional bAllPaths As Boolean = True)
Dim I, J As Integer
Dim SubFolderCount As Long
Dim SubFolderArray() As String ‘子文件夹全名
Dim sPath As String ‘文件名或子文件夹短名
If Right(sTargetPath, 1) <> “\” Then sTargetPath = sTargetPath & “\”
FolderCount = FolderCount + 1
ReDim Preserve FolderArray(1 To FolderCount)
FolderArray(FolderCount) = sTargetPath
sPath = Dir(GetFullName(sTargetPath, sPartialName)) ‘查找第一个文件
Do While Len(sPath) ‘循环到没有文件为止
FileCount = FileCount + 1
ReDim Preserve FileArray(1 To FileCount)
FileArray(FileCount) = sTargetPath & sPath ‘将文件目录和文件名组合,并存放到数组中
sPath = Dir ‘查找下一个文件
DoEvents ‘让出控制权
Loop
If Not bAllPaths Then Exit Function
sPath = Dir(sTargetPath, vbDirectory) ‘查找第一个文件夹
Do While Len(sPath) ‘循环到没有文件夹为止
If Left(sPath, 1) <> “.” Then ‘为了防止重复查找
If GetAttr(GetFullName(sTargetPath, sPath)) And vbDirectory Then ‘如果是文件夹则… …
SubFolderCount = SubFolderCount + 1
ReDim Preserve SubFolderArray(1 To SubFolderCount)
SubFolderArray(SubFolderCount) = GetFullName(sTargetPath, sPath) & “\” ‘将目录和文件夹名称组合形成新的目录,并存放到数组中
End If
End If
sPath = Dir ‘查找下一个文件夹
DoEvents ‘让出控制权
Loop
For I = 1 To SubFolderCount ‘使用递归方法,遍历所有目录
SearchFiles SubFolderArray(I), sPartialName
Next
End Function

二十四史简介——辽史

《辽史》撰成于元代,全书一百一十六卷,包括本纪三十卷,志三十二卷,表八卷,列传四十五卷,国语解一卷。
本书较系统地记载了我国古代契丹族建立的辽朝二百多年的历史,并兼载辽立国以前契丹的状况,以及辽灭亡后耶律大石所建西辽的概况,是研究辽和契丹、西辽的重要史籍。
辽太祖耶律阿保机建国之初,依仿汉人制度,设立监修国史官,并且仿照中原的做法,撰修《起居注》、《日历》、《实录》等。辽代曾先后四次撰修实录。
金朝建立后,很注意总结前朝的兴衰得失,着力修撰《辽史》,前后撰成两部《辽史》。第一次是熙宗皇统年间(公元1141–1149年),耶律固主持修纂,最后由萧永祺完成,此《辽史》有纪三十卷,志五卷,传四十卷,但未曾刊行。
第二次撰修《辽史》,由廉惠山海牙、王沂、陈绎曾分撰,从至正三年四月开始撰写,四年三月即告脱稿,仅仅用了十一个月的时间。这是因为前人所撰《辽史》和实录提供了良好的基础。
一般人认为,元修《辽史》失之简略,但不应否定它特有的长处。《辽史》的志、表多有特色,其中一些志、表是其它正史所没有的。

二十四史简介——宋史

《宋史》撰修于元朝末年,全书有本纪四十七卷,志一百六十二卷,表三十二卷,列传二百五十五卷,共计四百九十六卷,约五百万字,是二十五史中篇幅最庞大的一部官修史书。
早在元初,元世祖忽必烈就曾诏修宋史,因体例未定而未能成书。元朝末年,丞相脱脱主张分别撰修宋、辽、金三史,各自独立,这一意见得到元顺帝的同意,于至正三年(公元1343年)三月开局,三史同时修撰。
经过二年半时间,至正五年(公元1567年)十月,《宋史》匆匆成书。
《宋史》是在原宋《国史》的基础上删削而成的。两宋时期,史官组织完备,雕版印刷术广泛应用,书籍流传和保存都较为便利,积累了大量史料。这就为元修《宋史》提供了良好的基础。但是由于《宋史》修撰者匆匆急就,在史料的裁剪、史实的考订、文字的修饰、全书体例等方面存在不少缺点,如一人两传,无传而说有传,一事数见,有目无文,纪与传,传与传,表与传,传文与传论之间互相抵牾等,这使它在二十五史中有繁芜杂乱之称。
尽管《宋史》存在不少缺点,但是它卷帙浩繁,仅《列传》就有二千多人,比《旧唐书·列传》多出一倍;叙事详尽,就史料的学术价值而言详胜于略。同时《宋史》的主要材料是宋代的国史、实录、日历等书,这些史籍现在几乎全部佚失了,而《宋史》是保存宋代官方和私家史料最有系统的一部书。

Word 函数系列之一

Public Sub ReplaceWord(ByVal vWord As Variant, ByVal sOld As String, ByVal sNew As String)
Const wdReplaceAll = 2
Const wdFindStop = 0
Dim oRange As Object
Set oRange = vWord.Selection.Range
‘先判断是否有选中区域,没有选中则表示整个文档
If oRange.Start = oRange.End Then
Set oRange = vWord.ActiveDocument.Content
End If
With oRange.Find
‘批量查找替换 sOld 为 sNew
bRet = .Execute(FindText:=sOld, replacewith:=sNew, Replace:=wdReplaceAll)
‘Debug.Print bRet
‘Debug.Print oRange.Words.Count
End With
End Sub

Public Sub InsPageNumber(ByVal vWord As Variant) ‘其实是 vDocument
On Error GoTo ERR_PAGENUMBER
‘设置Word文档第一页页码
Dim oRange As Object
Set oRange = vWord.ActiveDocument.Sections(1).Footers(1).Range ‘wdHeaderFooterPrimary = 1
With oRange
.InsertAfter “第”
‘.Font.Size = 14
.Collapse Direction:=0 ‘wdCollapseEnd = 0
‘插入页码域
.Fields.Add Range:=oRange, Type:=-1, Text:=”PAGE * Arabic “, PreserveFormatting:=True ‘wdFieldEmpty = -1
.Expand Unit:=2 ‘wdWord = 2
.InsertAfter “页”
.InsertAfter “共”
.Collapse Direction:=0 ‘wdCollapseEnd = 0
‘插入页数域
.Fields.Add Range:=oRange, Type:=-1, Text:=”NUMPAGES * Arabic “, PreserveFormatting:=True ‘wdFieldEmpty = -1
.Expand Unit:=2 ‘wdWord = 2
.InsertAfter “页”
‘.InsertAfter “YagerSoft”
.ParagraphFormat.Alignment = 2 ‘wdAlignParagraphRight = 2 ‘右对齐
End With
‘隐藏页眉的横线
vWord.ActiveDocument.Sections(1).Headers(1).Range.Borders(-3).Visible = False ‘wdBorderBottom = -3
‘取得页眉的内容
‘Debug.Print vWord.ActiveDocument.Sections(1).Headers(2).Range.Text ‘wdHeaderFooterFirstPage = 2
Set oRange = Nothing
On Error GoTo 0
Exit Sub
ERR_PAGENUMBER:
On Error GoTo 0
End Sub

Public Sub InsPageBreak(ByVal vWord As Variant)
On Error GoTo ERR_BREAK
‘wdPropertyTitle = 1标题
‘wdPropertySubject = 2主题
‘wdPropertyAuthor = 3作者
‘wdPropertyKeywords = 4关键词
‘wdPropertyComments = 5批注
‘wdPropertyTemplate = 6模板
‘wdPropertyLastAuthor = 7上一个作者
‘wdPropertyRevision = 8修订次数
‘wdPropertyAppName = 9应用程序名
‘wdPropertyTimeLastPrinted = 10上次打印时间
‘wdPropertyTimeCreated = 11创建时间
‘wdPropertyTimeLastSaved = 12上次保存时间
‘wdPropertyVBATotalEdit = 13编辑时间总计
‘wdPropertyPages = 14页数
‘wdPropertyWords = 15字数
‘wdPropertyCharacters = 16字符数
‘wdPropertySecurity = 17安全性
‘wdPropertyCategory = 18类别
‘wdPropertyFormat = 19
‘wdPropertyManager = 20经理
‘wdPropertyCompany = 21公司
‘wdPropertyBytes = 22字节数
‘wdPropertyLines = 23行数
‘wdPropertyParas = 24段数(空白文档 BuiltInDocumentProperties(wdPropertyParas) = 0,而 vWord.ActiveDocument.Paragraphs.Count = 1)
‘wdPropertySlides = 25
‘wdPropertyNotes = 26注释
‘wdPropertyHiddenSlides = 27
‘wdPropertyMMClips = 28
‘wdPropertyHyperlinkBase = 29
‘wdPropertyCharsWSpaces = 30字符数(计空格)
If vWord.ActiveDocument.BuiltInDocumentProperties(15) = 0 Then Exit Sub ‘wdPropertyWords = 15
vWord.Selection.EndKey Unit:=6 ‘wdStory = 6 ‘将光标移到最后
vWord.Selection.InsertBreak Type:=7 ‘wdPageBreak = 7 ‘插入分页符
On Error GoTo 0
Exit Sub
ERR_BREAK:
On Error GoTo 0
End Sub

Public Function FindWord(ByVal vWord As Variant, ByVal sData As String) As Boolean
Dim oSelection As Object
Set oSelection = vWord.ActiveDocument.Content
‘利用FIND查找 sData ,从光标之处开始查找,查找到后选中。
With oSelection.Find
‘查找的方向向下
.Forward = True
‘取消在查找或替换操作中所指定文本的文本格式和段落格式
.ClearFormatting
‘查找操作查找仅完整单词,而不是较长单词的一部分的文本
.MatchWholeWord = True
‘查找时不区分大小写
.MatchCase = False
‘到达文档末尾时,继续从文档开头进行搜索
.Wrap = 1 ‘wdFindContinue
‘运行指定的查找操作。如果查找成功,则返回 True
.Execute FindText:=sData
End With
FindWord = oSelection.Find.Execute
End Function

Public Function GetTextSite(ByVal vWord As Variant, ByVal sText As String) As Integer ‘返回 sText 在 vWord 中首次出现的段号
‘耗时过长不宜用
Dim I As Integer, J As Integer
GetTextSite = 0
If vWord Is Nothing Then Exit Function
If vWord.Documents.Count = 0 Then Exit Function
If sText = “” Then Exit Function
For I = 1 To vWord.ActiveDocument.Paragraphs.Count
DoEvents
‘If vWord.ActiveDocument.Paragraphs(I).Range.Text = sText Then
If InStr(1, vWord.ActiveDocument.Paragraphs(I).Range.Text, sText, vbTextCompare) > 0 Then
GetTextSite = I
Exit For
End If
Next I
End Function

二十四史简介——新五代史

《新五代史》,原名《五代史记》,是唐代设馆修史以后唯一的私修正史。撰者欧阳修(公元1007—1072年),大约于景祐三年(公元1036年)至皇祐五年(公元1053年)的十八年间编成此书。
欧阳修,字永叔,号醉翁、六一居士,是北宋古文运动的领袖,唐宋八大家之一,也是著名的史学家,奉命和宋祁领衔编撰《新唐书》。崇儒复古是他的政治主张,也是他修史的指导思想。他意禀承孔子的《春秋》笔法、“褒贬”义例,对《旧五代史》改编重修。
在编排体例上,推翻《旧五代史》一朝一史的基本格局,取法《南史》、《北史》,打破朝代界线,把五朝的人事综合统编在一起,按时间顺序排列。
《新五代史》全书七十四卷,包括本纪十二卷、列传四十五卷、考三卷、世家及世家年谱十一卷、四夷附录四卷。其中的列传,最有特色。它采用类传的形式,设立《家人传》、《臣传》、《死节传》、《死事传》、《一行传》、《唐六臣传》、《义儿传》、《伶官传》、《宦者传》、《杂传》等名目。每类传目,内寓特定涵义,用以贯彻作者的“褒贬”义例。臂如将相大臣,凡专事一朝的在《臣传》,历事几朝的则列《杂传》。又如根据死者忠的不同程度,分为两等,头等的进《死节传》,次等的入《死事传》。
一般史书的“志”,《新五代史》称作“考”,仅有《司天考》、《职方考》,分别相当于《旧五代史》的《天文志》、《郡县志》。作者认为五代是个名分纲常颠倒的乱世,其典章制度一无可取,所以将《旧五代史》的“志”删除。这也是为了体现以“礼”修史的原则。
本书的世家及世家年谱,大致相当于《旧五代史》的《世袭列传》和《僭伪列传》,明确将中原以外的割据政权分为吴、南唐、前蜀、后蜀、南汉、楚、吴越、闽、南平、东汉等十国。各小国的划分编排,条理清晰,首尾完具,显然胜于旧史。《四夷附录》相当于旧史的《外国列传》。
就整体而论,《新五代史》的史料价值比《旧五代史》要略逊一筹,这是欧阳修在删繁就简时,将不少具体资料也一同削去所造成的。至于他对旧“志”部分的大事砍削,人为造成史料空白,更是不足为训。但《新五代史》后出,采用了实录以外的笔记、小说等多种材料,在删削的同时也新增了一些史料,尤其对十国部分的补充。由于《旧五代史》已非原帙,残缺不全,《新五代史》特有的价值就更不应低估。再从其它角度来着眼,欧阳修撰史,浑然一体,结构严谨,选材讲究,文字凝炼;思想上不像旧史那样大肆渲染“天命”而注重人事;创《职方考》,独树一帜,提纲挈领,眉清目秀,颇受称道,都是它的长处。平心而论,两部《五代史》各有短长,可以互为补充,不应偏废。
《新五代史》问世后,即有徐无党注。但徐注旨在解释《春秋》笔法、阐述微言大意,对读者并无多少裨益。