正常情况下想要遍历文件夹和子文件夹,可以采用递归的方式

Sub ListFilesTest()

    With Application.FileDialog(msoFileDialogFolderPicker)
If .Show Then myPath$ = .SelectedItems() Else Exit Sub
End With
If Right(myPath, ) <> "\" Then myPath = myPath & "\" [a:a] = ""
Call ListAllFso(myPath) End Sub Function ListAllFso(myPath$)
Set fld = CreateObject("Scripting.FileSystemObject").GetFolder(myPath) For Each f In fld.Files
' [a65536].End(3).Offset(1) = f.Name
[a65536].End().Offset() = f.Path
Next For Each fd In fld.SubFolders
' [a65536].End(3).Offset(1) = " " & fd.Name & ""
[a65536].End().Offset() = fd.Path
Call ListAllFso(fd.Path)
Next
End Function

但用过DOS命令的都知道,DOS有个命令,一句话就可以遍历文件夹和子文件夹,下面用vba来实现DOS的dir命令,实现上面的功能

Sub 遍历文件夹()

    Dim WSH, wExec, sCmd As String, Result As String, ar

    Set WSH = CreateObject("WScript.Shell")

'   Set wExec = WSH.Exec("ping 127.0.0.1")
Set wExec = WSH.exec("cmd /c dir /b /s D:\lcx\*.xls*") Result = wExec.StdOut.ReadAll
ar = Split(Result, vbCrLf) For i = To UBound(ar)
Cells(i + , ) = ar(i)
Next Set wExec = Nothing
Set WSH = Nothing End Sub

在学习使用这个功能的时候看到一个网上的例子,写的很好,而且还让我意外的学习到一个filter的函数,这个函数的功能也是相当强大了

Sub ListFilesDos()

    Set myfolder = CreateObject("Shell.Application").BrowseForFolder(, "GetFolder", )

    If Not myfolder Is Nothing Then myPath$ = myfolder.Items.Item.Path Else MsgBox "Folder not Selected": Exit Sub

    '在这里输入需要指定的关键字,可以是文件名的一部分,或指定文件类型如 ".xlsx"
myFile$ = InputBox("Filename", "Find File", ".xlsx") tms = Timer With CreateObject("Wscript.Shell") '所有文档含子文件夹 chr(34)是双引号"",因为代码中要表达"",需要写成"""" vbCrLf 回车换行
ar = Split(.exec("cmd /c dir /a-d /b /s " & Chr() & myPath & Chr()).StdOut.ReadAll, vbCrLf) s = "from " & UBound(ar) & " Files by Search time: " & Format(Timer - tms, " 0.00000") & " in: " & myPath

             这个filter竟然可以过滤数组,太厉害了,早知道有这个函数的话,以前写着玩的好些代码玩起来就省事多了
tms = Timer: ar = Filter(ar, myFile) Application.StatusBar = Format(Timer - tms, "0.00000") & " Find " & UBound(ar) + IIf(myFile = "", , ) & " Files " & s End With [a:a] = "": If UBound(ar) > - Then [a2].Resize( + UBound(ar)) = WorksheetFunction.Transpose(ar) End Sub '上例简写如下
Sub ListFilesDos_lcx() Set myfolder = CreateObject("Shell.Application").BrowseForFolder(, "GetFolder", ) If Not myfolder Is Nothing Then myPath$ = myfolder.Items.Item.Path Else MsgBox "Folder not Selected": Exit Sub With CreateObject("Wscript.Shell") '所有文档含子文件夹 chr(34)是双引号"",因为代码中要表达"",需要写成"""" vbCrLf 回车换行
ar = Split(.exec("cmd /c dir /a-d /b /s " & Chr() & myPath & "\*.xls*" & Chr()).StdOut.ReadAll, vbCrLf) End With [a:a] = "": If UBound(ar) > - Then [a2].Resize( + UBound(ar)) = WorksheetFunction.Transpose(ar) End Sub

shell命令也是很强大很好用了,电脑里的可执行文件,shell都可以执行,shell也是可以执行cmd的,只是无法获取到cmd控制台的数据

Sub 打开路径()

    Shell "cmd /c ipconfig > """ & ThisWorkbook.Path & "\ip.txt"""

    Shell "explorer.exe " & ThisWorkbook.Path, vbNormalFocus

End Sub

dos命令在vba中应用的更多相关文章

  1. 在DOS命令行窗口中显示系统环境环境变量

    (这是一个小技巧) 示例命令: echo %path% path是系统环境变量,使用百分号包围起来 http://www.cnblogs.com/danzhang 张洪君 微软ALM MVP

  2. 常用的几个Dos命令-持续更新中

    1.服务相关 (1).查看服务 C:\Windows\system32>net start 已经启动以下 Windows 服务: (2).启动服务 C:\Windows\system32> ...

  3. Window中常见的dos命令

    1.如何实行操作dos命令:如果是Windows电脑,从开始--->所有程序---->附件--->命令提示 这样就可以开始命令提示符了 2关于一些dos命令: 2.1 盘符切换:盘符 ...

  4. DOS命令行中的双引号

    在DOS命令窗口下,运行C:\Program Files\WinRAR\WinRAR.exe,提示如下错误: 因为C:\Program Files\WinRAR\WinRAR.exe中含有空格,它被分 ...

  5. 在.net中悄悄执行dos命令,并获取执行的结果(转)

    一.怎样使dos命令悄悄执行,而不弹出控制台窗口? 1.需要执行带“/C”参数的“cmd.exe”命令,它表示执行完命令后立即退出控制台.2.设置startInfo.UseShellExecute = ...

  6. Window 中常见的dos命令

    在哪里操作dos命令:    win7---->开始---->所有程序---->附件---->命令提示符                              win7-- ...

  7. DOS命令中出现空格问题

    1.DOS命令中路径出现空格时如何处理? 在DOS命令中,如果路径中出现空格,可能为报错:如参数错误 如:  xcopy C:\ABC CD\txt.txt C:\ ,   由于路径中包含空格,执行后 ...

  8. 在Windows的Dos命令中切换盘符

    在Windows的Dos命令中切换盘符... ---------------------------- --------------------------------------- -------- ...

  9. Windows7 中常用的一些DOS命令总结

    Windows7 中常用的一些DOS命令总结... ----------------------- -------------------------------------------- dos,是 ...

随机推荐

  1. SpringMVC断言--Assert

    Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查,如果入参不符合要求,方法将通过抛出异 ...

  2. JConsole使用手冊具体解释

    一篇Sun项目主页上介绍JConsole使用的文章,前段时间性能測试的时候大概翻译了一下以便学习,今天整理一下发上来.有些地方也不知道怎么翻,就保留了原文,可能还好理解点.呵呵,水平有限,翻的不好,大 ...

  3. 转 BlockingQueue(阻塞队列)详解

    转自 http://wsmajunfeng.iteye.com/blog/1629354 前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输” ...

  4. SoapUI报ClientProtocolException错误

    在SoapUI中出现了这个错误 org.apache.http.client.ClientProtocolException 检查后发现是SoapUI安装目录下lib中多了httpclient-*** ...

  5. 【Codevs1288】埃及分数

    Position: http://codevs.cn/problem/1288/ Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/ ...

  6. (函数即服务)Faas的现状与未来

    刚看到jolestar一位从法律转行程序员的前辈写了一篇Faas现状与未来的文章,里面很多观点都很有启发,或许正如他说的那样,由于Faas能较好的解决资源利用率和开发效率问题,2018年Faas将变得 ...

  7. java线程异常处理方法

    工作中常发现有些程序发生异常但却没有错误日志,原因就是一些开发线程异常处理错误,导致程序报错但异常信息打印到堆栈上,不好在生产环境中定位问题. 在java多线程程序中,所有线程都不允许抛出未捕获的ch ...

  8. E20170623-ts

    filter   n. 滤波器; 滤光器; 滤色镜; [化] 过滤器; mass   n. 大量,大多; 块,堆,团; [物理学] 质量; 弥撒曲; assignment  n. 分给,分配; 任务, ...

  9. 产生冠军(toposort)

    http://acm.hdu.edu.cn/showproblem.php?pid=2094 #include <stdio.h> #include <iostream> #i ...

  10. php phppowerpoint

    今天早上从订阅的 Zend DevZone 看到篇很有意思的文章. Creating PowerPoint 2007 files using PHP. 试了一下. 果然很又意思, 分享给大家吧. 程序 ...