当前位置: 首页 > news >正文

VBA使用fso对象合并指定路径的txt文件(含子目录)


图(1)

        前几天我跟大家分享了在VBA中如何获取指定类型文件的路径的方法,其中最重要的一个思路就是在处理完当前目录的文件后,再调用程序自身来对子目录进行处理,以此来实现对子目录的无限循环,直至所有文件都处理完毕为止。按照此设计思路,今天我来跟大家分享VBA如何合并指定路径的txt文件。

        为方便程序调用,我们将合并过程命名为MergeTxtFile,它携带两个参数,一个是filePath表示指定路径,另一个是fileName表示合并后的文件名,因为处理过程是循环进行的,且涉及合并文件和公共变量的清理问题,循环过程只能单独设计为子过程MergeTxt,代码如下:

Public txtFile As String, fileCount As Integer, filesList As String

Sub MergeTxtFile(filePath As String, fileName As String)
'
' 合并指定路径的txt文件(含子目录)
'
' 参数说明:filePath 表示指定路径,fileName 表示合并后的文件名

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If Not fso.folderExists(filePath) Then
        MsgBox "找不到路径:" & vbCrLf & filePath, vbOKOnly + vbExclamation, "错误"
        Exit Sub
    End If
    
    txtFile = filePath & "\" & fileName
    
    If fso.fileExists(txtFile) Then
        Kill txtFile
        If Err.Number <> 0 Then   ' 错误检查
            Err.Clear   ' 清除错误
            MsgBox "以下文件已打开,请先关闭。" & vbCrLf & txtFile, vbOKOnly + vbExclamation, "错误"
            Exit Sub
        End If
    End If
    
    ' 合并文件
    Call MergeTxt(filePath, fileName)
    Debug.Print filesList & vbCrLf & "执行完毕!总共合并" & fileCount & "个" & "txt文件"

    '清理公共变量
    txtFile = ""
    fileCount = 0
    filesList = ""
End Sub

Sub MergeTxt(filePath As String, fileName As String)
'
' 合并指定路径的txt文件(含子目录)
'
    Dim file As Object
    Dim fileContent As String
    Dim fileNum As Integer
    'Dim fileCount As Integer
    Dim txtFolder As Object
    Dim txtNum As Integer
    
    txtNum = FreeFile                     ' 获取新文件号
    Open txtFile For Append As #txtNum    ' 打开合并文件(追加模式)
    
    '遍历主目录的每个文件
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txtFolder = fso.GetFolder(filePath)
    For Each file In txtFolder.Files
        If LCase(fso.GetExtensionName(file.path)) = "txt" Then
        
            ' 获取文件列表
            If file.Name <> fileName Then
                If Len(filesList) = 0 Then
                    filesList = file.path
                Else
                    filesList = filesList & vbCrLf & file.path
                End If
                fileCount = fileCount + 1    ' 计算文件个数

                fileNum = FreeFile                      ' 获取新文件号
                Open file.path For Input As #fileNum    ' 打开当前文件

                ' 将读取内容写入合并文件
                Do While Not EOF(fileNum)               ' 检测文件末尾
                    Line Input #fileNum, fileContent    ' 采用逐行读取的方式
                    Print #txtNum, fileContent
                Loop
                
                Close #fileNum    ' 关闭当前文件
            End If
        End If
    Next file
    
    Close #txtNum    ' 关闭合并文件

    ' 遍历子目录
    For Each subfolder In txtFolder.subFolders
        Call MergeTxt(subfolder.path, fileName)    ' 调用程序自身处理子目录
    Next subfolder

End Sub

        以上是通用过程,在使用过程中,我们只需要重新定义变量filePath和fileName的值即可,下面是使用的演示代码:

Sub Demo_MergeTxtFile()
'
' 演示MergeTxtFile函数用法
'
    Dim filePath As String
    Dim fileName As String
    
    filePath = "D:\Users\Hero\Desktop\办公室"
    fileName = "合并TXT.txt"
    
    Call MergeTxtFile(filePath, fileName)
    
End Sub

        执行结果如下图:


图(2)

相关文章:

  • Android Glide 的显示与回调模块原理源码级深度剖析
  • 前端需要在大模型项目中具备的知识
  • Cython编译去掉符号表
  • VBA 复制指定次数的List
  • 最小生成树--Kruskal
  • 清华与人大最新研究表明:AGI的到来时间需70年与10^26个参数,好像不用那么急了...
  • 【计算机组成原理】第一章 计算机系统概述
  • 【The Rap of China】2018
  • 数据结构--【栈与队列】笔记
  • 2020CVPR-SiamBAN:用于视觉跟踪的Siamese框自适应网络
  • 【已解决】AttributeError: module ‘numpy‘ has no attribute ‘object‘.
  • Unity Shader学习总结
  • Linux安装升级docker
  • 指针的工作原理,函数的传值和传址
  • 第6届传智杯复赛第一场
  • 代码随想录算法训练营第三十二天(20250228) |509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯 -[补卡20250309]
  • ES Module 的 import 导入和 import () 动态导入
  • Blueprint —— Blueprint Editor(二)
  • 牛客周赛A:84:JAVA
  • 【移动WEB开发】rem适配布局
  • b2b网站大全 网址大全/googlechrome
  • 手机怎么建设视频网站/免费的发帖收录网站
  • 国内高端品牌网站建设/免费发布推广平台
  • 网站建设 中企动力南昌/seo搜索引擎优化论文
  • 成都pc网站建设/阿里巴巴官网
  • 网站建设客服工作/无需下载直接进入的网站的代码