获取VBA中的子目录列表

2023-12-28

  • 我想获取目录中所有子目录的列表。
  • 如果这有效,我想将其扩展为递归函数。

然而,我最初获取子目录的方法失败了。它只是显示包括文件在内的所有内容:

sDir = Dir(sPath, vbDirectory)
Do Until LenB(sDir) = 0
    Debug.Print sDir
    sDir = Dir
Loop

该列表以“..”和几个文件夹开头,以“.txt”文件结尾。


EDIT:
我要补充一点,这必须在Word中运行,而不是Excel(很多功能在Word中不可用),而且是Office 2010。


EDIT 2:

可以使用以下方法确定结果的类型

iAtt = GetAttr(sPath & sDir)
If CBool(iAtt And vbDirectory) Then
   ...
End If 

但这给了我新的问题,所以我现在使用基于Scripting.FileSystemObject.


2014 年 7 月更新:添加PowerShell选项并削减第二个代码以仅列出文件夹

下面的方法运行完整的递归过程来代替FileSearchOffice 2007 中已弃用。(后面的两个代码仅使用 Excel 进行输出 - 在 Word 中运行时可以删除此输出)

  1. Shell PowerShell
  2. Using FSO with Dir用于过滤文件类型。源自于此EE答案 http://www.experts-exchange.com/Software/Office_Productivity/Office_Suites/MS_Office/Excel/Q_24901177.html它位于 EE 付费墙后面。这比您要求的(文件夹列表)要长,但我认为它很有用,因为它为您提供了一系列结果以供进一步使用
  3. Using Dir。这个例子来自我在另一个网站上提供的答案

1. 使用PowerShell将 C:\temp 下面的所有文件夹转储到 csv 文件中

Sub Comesfast()
X2 = Shell("powershell.exe Get-ChildItem c:\temp -Recurse | ?{ $_.PSIsContainer } | export-csv C:\temp\filename.csv", 1)
End Sub

2. 使用FileScriptingObject将 C:\temp 下面的所有文件夹转储到 Excel 中

Public Arr() As String
Public Counter As Long

Sub LoopThroughFilePaths()
Dim myArr
Dim strPath As String
strPath = "c:\temp\"
myArr = GetSubFolders(strPath)
[A1].Resize(UBound(myArr, 1), 1) = Application.Transpose(myArr)
End Sub


Function GetSubFolders(RootPath As String)
Dim fso As Object
Dim fld As Object
Dim sf As Object
Dim myArr

Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder(RootPath)
For Each sf In fld.SUBFOLDERS
    ReDim Preserve Arr(Counter)
    Arr(Counter) = sf.Path
    Counter = Counter + 1
    myArr = GetSubFolders(sf.Path)
Next
GetSubFolders = Arr
Set sf = Nothing
Set fld = Nothing
Set fso = Nothing
End Function

3 Using Dir

    Option Explicit

    Public StrArray()
    Public lngCnt As Long
    Public b_OS_XP As Boolean

    Public Enum MP3Tags
    '  See http://www.kixtart.org/forums/ubbthreads.php?ubb=showflat&Number=160880&page=1 for OS specific attribute lists
    XP_Artist = 16
    XP_AlbumTitle = 17
    XP_SongTitle = 10
    XP_TrackNumber = 19
    XP_RecordingYear = 18
    XP_Genre = 20
    XP_Duration = 21
    XP_BitRate = 22
    Vista_W7_Artist = 13
    Vista_W7_AlbumTitle = 14
    Vista_W7_SongTitle = 21
    Vista_W7_TrackNumber = 26
    Vista_W7_RecordingYear = 15
    Vista_W7_Genre = 16
    Vista_W7_Duration = 17
    Vista_W7_BitRate = 28
    End Enum

    Public Sub Main()
    Dim objws
    Dim objWMIService
    Dim colOperatingSystems
    Dim objOperatingSystem
    Dim objFSO
    Dim objFolder
    Dim Wb As Workbook
    Dim ws As Worksheet
    Dim strobjFolderPath As String
    Dim strOS As String
    Dim strMyDoc As String
    Dim strComputer As String

   'Setup Application for the user
    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
    End With    

    'reset public variables
    lngCnt = 0
    ReDim StrArray(1 To 10, 1 To 1000)

    ' Use wscript to automatically locate the My Documents directory
    Set objws = CreateObject("wscript.shell")
    strMyDoc = objws.SpecialFolders("MyDocuments")


    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
    For Each objOperatingSystem In colOperatingSystems
        strOS = objOperatingSystem.Caption
    Next

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    If InStr(strOS, "XP") Then
        b_OS_XP = True
    Else
        b_OS_XP = False
    End If


    ' Format output sheet
    Set Wb = Workbooks.Add(1)
    Set ws = Wb.Worksheets(1)
    ws.[a1] = Now()
    ws.[a2] = strOS
    ws.[a3] = strMyDoc
    ws.[a1:a3].HorizontalAlignment = xlLeft

    ws.[A4:J4].Value = Array("Folder", "File", "Artist", "Album Title", "Song Title", "Track Number", "Recording Year", "Genre", "Duration", "Bit Rate")
    ws.Range([a1], [j4]).Font.Bold = True
    ws.Rows(5).Select
    ActiveWindow.FreezePanes = True


    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(strMyDoc)

    ' Start the code to gather the files
    ShowSubFolders objFolder, True
    ShowSubFolders objFolder, False

    If lngCnt > 0 Then
        ' Finalise output
        With ws.Range(ws.[a5], ws.Cells(5 + lngCnt - 1, 10))
            .Value2 = Application.Transpose(StrArray)
            .Offset(-1, 0).Resize(Rows.Count - 3, 10).AutoFilter
            .Offset(-4, 0).Resize(Rows.Count, 10).Columns.AutoFit
        End With
        ws.[a1].Activate
    Else
        MsgBox "No files found!", vbCritical
        Wb.Close False
    End If

    ' tidy up

    Set objFSO = Nothing
    Set objws = Nothing

    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
        .StatusBar = vbNullString
    End With
    End Sub

    Sub ShowSubFolders(ByVal objFolder, bRootFolder As Boolean)
    Dim objShell
    Dim objShellFolder
    Dim objShellFolderItem
    Dim colFolders
    Dim objSubfolder


    'strName must be a variant, as ParseName does not work with a string argument
    Dim strFname
    Set objShell = CreateObject("Shell.Application")
    Set colFolders = objFolder.SubFolders
    Application.StatusBar = "Processing " & objFolder.Path

    If bRootFolder Then
        Set objSubfolder = objFolder
        GoTo OneTimeRoot
    End If

    For Each objSubfolder In colFolders
        'check to see if root directory files are to be processed
    OneTimeRoot:
        strFname = Dir(objSubfolder.Path & "\*.mp3")
        Set objShellFolder = objShell.Namespace(objSubfolder.Path)
        Do While Len(strFname) > 0
            lngCnt = lngCnt + 1
            If lngCnt Mod 1000 = 0 Then ReDim Preserve StrArray(1 To 10, 1 To (lngCnt + 1000))
            Set objShellFolderItem = objShellFolder.ParseName(strFname)
            StrArray(1, lngCnt) = objSubfolder
            StrArray(2, lngCnt) = strFname
            If b_OS_XP Then
                StrArray(3, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.XP_Artist)
                StrArray(4, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.XP_AlbumTitle)
                StrArray(5, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.XP_SongTitle)
                StrArray(6, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.XP_TrackNumber)
                StrArray(7, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.XP_RecordingYear)
                StrArray(8, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.XP_Genre)
                StrArray(9, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.XP_Duration)
                StrArray(10, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.XP_BitRate)
            Else
                StrArray(3, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.Vista_W7_Artist)
                StrArray(4, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.Vista_W7_AlbumTitle)
                StrArray(5, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.Vista_W7_SongTitle)
                StrArray(6, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.Vista_W7_TrackNumber)
                StrArray(7, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.Vista_W7_RecordingYear)
                StrArray(8, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.Vista_W7_Genre)
                StrArray(9, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.Vista_W7_Duration)
                StrArray(10, lngCnt) = objShellFolder.GetDetailsOf(objShellFolderItem, MP3Tags.Vista_W7_BitRate)
            End If
            strFname = Dir
        Loop
        If bRootFolder Then
            bRootFolder = False
            Exit Sub
        End If
        ShowSubFolders objSubfolder, False
    Next
    End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取VBA中的子目录列表 的相关文章

  • VBA 中的求和函数

    我在 vba 中对单元格求和时遇到问题 我需要使用单元格 a b Range A1 function SUM Range Cells 2 1 Cells 3 2 但它不起作用 函数不是范围内的属性 方法 如果您想对值求和 请使用以下命令 R
  • PHP - 递归搜索数组中的键和子键,成功时返回键['subkey]

    因此 我编写了一个函数 该函数可以在数组中深入搜索两个级别以查找键和子键对 基本上是在寻找key subkey 如果找到 则返回key subkey 我正在寻找一种以真正递归的方式执行此操作的方法 并根据需要进行尽可能多的深度搜索 直到到达
  • 在单元格更改时循环遍历一系列单元格,以将序列中的下一个数字显示为单元格的新值

    我了解如何循环范围 For Each cell In Range A1 A5 If condition Then End If Next 我知道 OnChange 事件 Private Sub Worksheet Change ByVal
  • 使用 Excel 2010 通过存储过程读取/写入 SQL Server 2008 数据库

    我们有一个 SQL Server 2008 数据库 它有存储过程来处理读 写等 这些过程由各种应用程序内部使用 需要一个人直接更新数据库中名为 Employee 的表 更新非常简单 更新 VARCHAR 和 INT 外键 字段 问题是 Sh
  • 以编程方式将参数传递到访问报告中

    我有一个现有的 Access MDB 我正在向运行现有报表的现有表单添加一个命令按钮 所做的更改是 此按钮需要传入一个包含正在报告的记录 ID 的参数 当前报告在 MDB 中的每条记录上运行 我已经更改了报告运行的查询 以使用 ID 值参数
  • 如何确保我的 IE 选项卡名称正确?

    我使用此代码从 Word VBA 获取 Internet Explorer 的实例 并从网页中抓取一些值 我循环遍历 4 个项目 以防万一 有时我不小心抓住了一个名为 Windows Explorer 的东西 我不知道那是什么 来抓住 In
  • 我可以通过 vba 设置 Excel Power Query 的用户名和密码吗?

    我正在尝试设置一个电子表格 供其他人使用 通过 Power Query 更新表 当另一个用户使用电子表格时 他们会被要求 3 次输入用户名和密码 因为我有 3 个表正在更新 如何通过 VBA 为每个用户设置这些 我尝试将连接设置为匿名 但他
  • 尝试使用 Excel 中的 VBA 从网页中提取一个值

    我几天来一直在尝试查找信息 但是我找到的所有示例都只有一小段代码 我需要全部 我想要做的是从主页中提取一个值并将其放入 Excel 的单元格中 然后从同一站点上的另一个页面获取另一个值并放入下一个单元格等 该页面是瑞典证券交易所页面 我用作
  • 使用 python 制作本地服务器应用程序的最佳方法

    我想要简单轻松地集成 python 和 vba 人们 如果他们在阅读本文后亲自见到我 阅读本文可能会杀了我 但我正在使用 django 开发服务器来实现此目的 有没有什么简单又好的方法 仅举个例子 我想使用 python 模块 openpy
  • VBA Excel 选择以字符开头的命名范围

    我在命名范围方面遇到了一些问题 我在不同的工作表上有多个命名范围 我想用VBA隐藏或显示所有这些范围 命名范围的示例 r1 name1 另一张纸上的第二个是r1 name2 因此 所有范围都以前面相同的代码开头 r1 我如何循环遍历以 r1
  • 在 Java 中使用 Apache POI XWPF 在同一个 Word 文档中横向和纵向页面

    我正在尝试使用 Java 和 Apache POI 库创建一个包含一些横向页面和一些纵向页面的 Word 文档 我可以更改所有页面的方向 但有没有办法只更改其中某些页面的方向 我尝试过使用不同的部分和主体 但无济于事 目前我已经编写了一个函
  • 保护 Excel VBA 代码的最佳方法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经整理了一个简单的 Excel 数据库 该数据库执行一些宏函数 并且我需要将此数据库分发给几个人 但他们无法看到宏函数实际上是如何
  • VBA 代码基准测试

    对 VBA 代码进行基准测试最准确的方法是什么 在我的例子中 我正在 Excel 中测试代码 除了下面的 2 种之外 还有其他对代码进行基准测试的技术吗 如果有 该方法的优点 缺点是什么 这里有两种流行的方法 First Timer Sub
  • 如何将嵌套对象数组转换为 CSV?

    我有一个包含嵌套对象的数组 例如 name 1 children name 1 1 children 1 2 id 2 thing name 2 1 children 2 2 name 3 stuff name 3 1 children 3
  • 如何在自定义数据验证中使用用户定义的函数?

    In my Worksheet我有一个Table并想要定义Data validation对于包含日期的列 如下所示 S2M B2 lt gt Error 在上面 S2M 是一个用户定义的函数 用于将日期转换为Persian date to
  • VBA 从文本文件的属性获取日期

    我正在尝试获取特定文本文件上传到计算机的日期 该日期不在实际的文本文件中 您必须右键单击然后转到属性才能查看日期 我需要将日期读入变量 我不知道从哪里开始尝试完成这件事 谢谢你 杰西 斯莫瑟蒙 如果内置FileDateTime 不是你可以使
  • 如何从邻接列表构建嵌套树结构?

    考虑到我有 名为的相邻键 子级 父级 列表A 一个名为Tree存储自己的节点键 整数 和子节点 类 A 61 66 50 61 68 61 33 61 57 66 72 66 37 68 71 33 6 50 11 37 5 37 clas
  • 使用 OpenXML 在 Word 中插入换行符

    我正在使用 openxml WordProcessingDocument 打开 Word 模板并将占位符 x1 替换为字符串 除非我需要字符串包含换行符 否则这工作正常 如何将 x1 替换为可能包含 word 可以识别的换行符的文本 我已经
  • 将括号子集映射到字符

    我正在尝试创建一个 Scala 方法 该方法将采用一个父括号组 表示为字符串 然后将每个括号子组映射到不同的字母 然后它应该将它们放入它返回的映射中 所以基本上我调用以下方法 如下所示 val s 2 x 3 6 val map mapPa
  • Excel VBA 将范围值复制到数组,

    我有以下代码摘录 我试图将一系列值复制到声明的数组上 但它一直给我 无法分配给数组 错误 Dim permittedCurve 0 To 7000 As Variant permittedCurve activeWorkbook Works

随机推荐

  • 如何在 Python 3 中停止执行 exec 命令?

    我有以下代码 code print foo if True return print bar exec code print This should still be executed 如果我运行它 我会得到 Traceback most
  • Angular 2——模拟——没有 HTTP 提供者

    Angular 2 0 0 Ionic 2 RC0 Npm 3 10 8 Node v4 5 0 Karma 1 3 0 Jasmine 2 5 2 我正在尝试使用 Karma Jasmine 测试我的应用程序 现在我已经遵循了一些指南 我
  • EC2 网络错误:连接超时

    我创建了一个 Linux 的 EC2 微型实例并启动了它 创建了一个密钥对以及该视频中指定的所有开始内容 http www youtube com watch v hJRSti6DsJg http www youtube com watch
  • java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder

    我正在学习 springboot 和微服务 我已经创建了 3 个服务 并且都运行良好 现在我已经创建了发现服务器 使用 start spring io 添加 Eureka Server 作为依赖项 我的pom xml如下
  • 如何获取 wav 文件中的频率列表

    我正在尝试解码一些音频 这些音频基本上是两个频率 0 为 200hz 1 为 800hz 可以直接转换为二进制 音频样本 https i stack imgur com BPa30 jpg 此示例翻译为 1001011 第三个频率为 160
  • 将 asp.net 5 MVC 6 与 Identity 和 EF 6 结合使用的示例

    我正在使用 asp net 5 和 MVC 6 设置一个新项目 但由于 EF 7 中缺少功能 我想使用 Entity Framework 6 我设置了 EF 6 1 3 并且可以正常工作 Identity 3 0 依赖于 EF 7 因此我已
  • VisualVM 中加载的类

    我的应用程序的堆内存出现问题 我尝试使用 VisualVM 来查找内存泄漏 有件事我无法理解 在 采样器 选项卡中 当我按下 内存 按钮时 我会看到数千个具有实例的类 如果我在 Profiler 选项卡中执行相同的操作 我会看到更少的类 这
  • 用限制分割字符串,其中最后一个字符串包含余数

    例如如果我运行这个 JavaScript var str hello world there var parts str split 2 var p1 parts 0 var p2 parts 1 最后 p1 包含 hello p2 包含
  • d3.js 中的分层图

    我目前正在使用 Graphviz 来可视化控制流图 基本上 可简化的 控制流图是一个 DAG 加上一些指向前一层中的节点的边 后面的边不应影响节点的放置 现在 dot绘制的图形相当整齐 但它缺乏一种简单的方法来添加交互性 例如折叠 滚动 缩
  • 了解可变 Seq

    我对 Scala 还很陌生 并尝试了解可变的Seq 因为是在包里的mutable我期望有一种方法可以让我们在不复制整个集合的情况下追加元素 但没有 方法中的mutable Seq 但在Buffer is and 两者都复制该集合 那么为什么
  • 注册时出错:NoCredentialProviders:链 ECS 代理错误中没有有效的提供程序

    我正在尝试使用 EC2 容器服务 我使用 terraform 来创建它 我已经定义了ecs集群 自动缩放组 启动配置 一切似乎都有效 除了一件事 ec2 实例正在创建 但它们没有在集群中注册 集群只是说没有可用的实例 在创建的实例上的 ec
  • Xmlstarlet - 将一个属性的值复制到另一个属性(如果元素中存在)

    我刚刚了解了 xmlstarlet 但不幸的是我在 XML 方面遇到了很大的困难 所以我希望我能得到一些帮助 比如说 我有这个 XML 文件 test xml
  • Google Sheet API V4(Java) 在单元格中附加日期

    我尝试在单元格中添加日期 但工作表自动将值存储在带有单引号的字符串中 对于在日期中存储值 我们还尝试添加userEnteredFormat但这对我们不起作用 以下是附加请求 requests appendCells fields userE
  • 如何检查鼠标单击是否位于 JavaScript 中 HTML5 Canvas 上的旋转文本内?

    我已经在画布上以坐标 X Y 绘制了文本并保存了它们 我有一个简单的方法来检查鼠标单击是否发生在文本边界内 问题是当我将文本旋转 45 度时 我无法检查旋转文本中是否发生了鼠标单击 简而言之 如何检查鼠标单击是否在旋转的文本或形状内 创建一
  • 使用固定长度和空格填充格式化整数的正确方法

    我有 0 到 包括 100 范围内的整数 我想将它们转换为固定长度 3 的字符串 并带有空格填充和右侧对齐 我尝试使用以下格式字符串 但它为三位数添加了另一个空格 这使得它们的长度为 4 而不是 3 fmt lambda x 3d form
  • 如何在 java 中使用 org.json.JSONObject 将值设置为 null?

    如何在 java 中使用 org json JSONObject 将值设置为 null 我当然可以使用 isNull 读取值是否为 null 但似乎当我输入 null 时 它只是忽略我 JSONObject o new JSONObject
  • VS2017 RC - 尝试配置 IIS Express 时发生以下错误

    安装了 VS2017 RC 启动了新项目 ASP NET Core Web 应用程序 Net CORE 选择个人用户帐户作为身份验证类型 尝试运行不进行任何更改生成的代码 并收到以下错误 尝试为项目配置 IIS Express 时出错 错误
  • 无法从资源目录加载属性文件

    我从 Git 存储库导入了一个项目 并在 Eclipse 中为其添加了 Maven 性质 在资源文件夹中 我添加了一个名为的配置文件myconf properties 现在 每当我尝试从 Java 代码打开这个文件时 我都会得到FileNo
  • 来自 C# 自定义操作的 MsiSetProperty

    action1如何从 C 自定义操作中设置 MSI 属性 到目前为止我已经有了这个 但如何获取句柄 DllImport msi dll CharSet CharSet Unicode static extern int MsiSetProp
  • 获取VBA中的子目录列表

    我想获取目录中所有子目录的列表 如果这有效 我想将其扩展为递归函数 然而 我最初获取子目录的方法失败了 它只是显示包括文件在内的所有内容 sDir Dir sPath vbDirectory Do Until LenB sDir 0 Deb