zoukankan      html  css  js  c++  java
  • VBA学习笔记(8)--遍历所有文件夹和文件

    说明(2017.3.26):

    1. 采用的是兰色幻想教学视频中的“父子转换法”

    2. 这种VBA的遍历文件夹方法非常难理解,主要是因为dir这个函数,第一次带参数调用,返回的是此目录下的第一个文件,第二次无参数调用,返回的是此目录下一个第二个文件,这就很操蛋了,还要配合do循环。

    3. VBA的各种do..until..loop, do..while..loop, if..then..end if, for 1 to 10..next尼玛这么多关键字要死啊!不骂不痛快!本来思考的就很累,还时不时蹦出个“for缺少next”!草拟吗的!

    4. VBA的数组,已经吐槽过了,一句草你麻痹送上不谢。

    5. python里的一个walk就能解决的问题,现在要这么一坨。要不是python的VBA文档跟屎一样,而且还要下载一个屎一样的插件,不说了。。

    6. 这次的代码只实现了遍历所有文件,下一步还要对每个word文件进行操作,提取出里面的【点拨】

    7. 总结:只看见别人用VBA的时候装逼,看不到别人写VBA的时候在吃屎。

     1 Public Sub test1()
     2     Dim path
     3     Dim filename
     4     Dim folders(1 To 100)
     5     Dim i%, j%
     6     i = 1
     7     j = 1
     8 '    先获取所有的文件夹
     9     path = ThisWorkbook.path & "oriFolder"
    10     folders(1) = path
    11 '    这里的folders数组和下面的classes数组只设置了100个长度,是为了调试方便,不然有时会出现大量空行,实际中可以增大。
    12 '    dir第二次无参数调用,返回的是同一个文件夹下的第二个文件!!
    13 '    filename = Dir(folders(i), vbDirectory)这里filename获取的首先是folders(1)路径下的文件夹"."
    14 '    dir找到第一个文件夹".",这时i=1,进入do循环,把oriFolder这一层的文件夹都dir出来(101和102),
    15 '    找到一个文件夹就把j加1(最后j=3),把folders(i)修改为"."路径,101路径和102路径,里面的do until循环就做了这么个事
    16 '    do until做完之后,i要加1了,变成2,这时的filename = Dir(folders(i), vbDirectory),folders(2)就是do until循环里已经修改的101路径了,
    17 '    继续do until循环,j目前=3,然后开始增加,目的是让folders(j)数组继续往后增加元素,等把101路径里所有文件夹路径添加进去之后,
    18 '    i变成3,再开始遍历102文件夹
    19 '    如果101里面还有文件夹,就等把101和102都遍历完后,因为i每次只加1,而j是只要有一个文件夹就加1,
    20 '    所以只要i没有到j的数量,就会一直遍历下去,把所有的子文件遍历出来
    21     Do While i <= j
    22         filename = Dir(folders(i), vbDirectory) ' filename="."
    23         Do Until filename = ""
    24             If InStr(filename, ".") = 0 Then
    25                  j = j + 1
    26 '                当i=1的时候,folders(j)中的1,2,3分别是",",101,102目录
    27                 folders(j) = folders(i) & filename & ""
    28             End If
    29             filename = Dir
    30         Loop
    31         i = i + 1
    32     Loop
    33 '    For p = 1 To UBound(folders)
    34 '        If folders(p) <> "" Then
    35 '            Debug.Print (folders(p))
    36 '        End If
    37 '    Next
    38 '    从每个文件夹里获取所有课,存入一个数组
    39 Dim classes(1 To 100)
    40 Dim class
    41 Dim p
    42 Dim q
    43 p = 1
    44 q = 1
    45 
    46 For p = 1 To UBound(folders)
    47     If folders(p) <> "" Then
    48         class = Dir(folders(p) & "*.*")
    49         Do Until class = ""
    50             classes(q) = folders(p) & class
    51             q = q + 1
    52             class = Dir
    53         Loop
    54     End If
    55 Next
    56 
    57 For x = 1 To UBound(classes)
    58     If classes(x) <> "" Then
    59         Debug.Print (classes(x))
    60     End If
    61 Next
    62     
    63 End Sub
  • 相关阅读:
    Sqlserver2005迁移至Oracle系列之二:生成存储过程
    Sqlserver:在sql2005查看索引的碎片统计情况,并给出处理意见的自动化批处理脚本
    Sqlserver:利用Sqlserver2005的数据库触发器开发的数据库审核追踪系统,可以跟踪对象的修改信息及修改源代码
    Sqlserver2005迁移至Oracle系列之一:生成表
    中国软件业的现状浅析
    Java之异常与错误的区别及java的异常体系
    SQL优化34条
    swftools转换文件时线程堵塞问题的解决方法
    中国软件开发需要注意的地方
    Flex 应用内存泄露的分析与诊断
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/6623410.html
Copyright © 2011-2022 走看看