You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现遍历父文件夹及子文件夹统计XML中<Headline>标签数量

遍历所有子文件夹统计XML中标签数量

原代码仅支持单个文件夹的XML文件统计,要实现遍历父文件夹下所有子文件夹,只需添加递归遍历子文件夹的逻辑即可,修改后的完整代码如下:

Option Explicit

Sub process_all_folders()
    Dim iRow As Long, wb As Workbook, ws As Worksheet
    Set wb = ThisWorkbook
    Set ws = wb.Sheets(1)
    ws.UsedRange.Clear
    ws.Range("A1:C1") = Array("文件路径", "第一个<Headline>内容", "<Headline>标签计数")
    iRow = 1
    
    ' 初始化FSO和正则表达式
    Dim FSO As Object, regEx As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set regEx = CreateObject("VBScript.RegExp")
    With regEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        .Pattern = "<Headline>(.*)</Headline>"
    End With
    
    ' 选择父文件夹
    Dim parentFolder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "请选择父文件夹"
        .Show
        .AllowMultiSelect = False
        If .SelectedItems.Count = 0 Then
            MsgBox "未选择任何文件夹"
            Exit Sub
        End If
        parentFolder = .SelectedItems(1)
    End With
    
    Application.ScreenUpdating = False
    ' 调用递归函数遍历所有子文件夹
    Call TraverseFolder(FSO.GetFolder(parentFolder), regEx, ws, iRow)
    ws.UsedRange.Columns.AutoFit
    Application.ScreenUpdating = True
    MsgBox "统计完成"
End Sub

' 递归遍历文件夹的函数
Sub TraverseFolder(currentFolder As Object, regEx As Object, ws As Worksheet, ByRef iRow As Long)
    Dim xmlFile As Object, subFolder As Object
    Dim txt As String, ts As Object, m As Object
    
    ' 处理当前文件夹下的所有XML文件
    For Each xmlFile In currentFolder.Files
        If LCase(Right(xmlFile.Name, 4)) = ".xml" Then
            iRow = iRow + 1
            ' 写入完整文件路径,方便定位文件
            ws.Cells(iRow, 1) = xmlFile.Path
            
            ' 读取文件内容
            Set ts = xmlFile.OpenAsTextStream
            txt = ts.ReadAll
            ts.Close
            
            ' 匹配并统计标签
            If regEx.Test(txt) Then
                Set m = regEx.Execute(txt)
                ws.Cells(iRow, 2) = m(0).SubMatches(0)
                ws.Cells(iRow, 3) = m.Count
            Else
                ws.Cells(iRow, 2) = "无匹配标签"
                ws.Cells(iRow, 3) = 0
            End If
        End If
    Next xmlFile
    
    ' 递归处理子文件夹
    For Each subFolder In currentFolder.SubFolders
        Call TraverseFolder(subFolder, regEx, ws, iRow)
    Next subFolder
End Sub

关键改动说明:

  • 新增TraverseFolder递归函数,实现对当前文件夹及其所有子文件夹的深度遍历
  • 将文件读取、标签匹配统计的核心逻辑迁移到递归函数中,复用代码逻辑
  • 第一列改为写入完整文件路径,解决子文件夹中重名文件无法区分的问题
  • 优化表头文字,明确各列数据含义
  • 统计完成后添加提示弹窗,反馈操作状态

内容的提问来源于stack exchange,提问作者Salman Shafi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:31:31