VBA学习(21):遍历文件夹(和子文件夹)中的文件

很多时候,我们都想要遍历文件夹中的每个文件,例如在工作表中列出所有文件名、对每个文件进行修改。VBA给我们提供了一些方式:(1)Dir函数;(2)File System Object。

使用Dir函数

Dir函数是一个内置的VBA函数,可用于可使用VBA的任何应用程序。

使用File System Object(FSO)

File System Object(FSO)是一个单独的操作库,我们可以在VBA代码中使用它。有两种方法可以打开FSO库,即早期绑定或后期绑定。如果你不确定要使用哪个,建议使用后期绑定。它可能会导致代码速度变慢,但运行时的错误应该更少。

早期绑定

在VBE编辑器中,单击“工具——引用”。在“引用”对话框中,找到并选取“MicrosoftScripting Runtime”,单击“确定”按钮。

后期绑定

后期绑定不需要任何特定操作来启用FSO库,确保在VBA代码中需要时打开库。

遍历文件夹中所有文件

下面的示例代码将文件名打印到立即窗口,很容易修改这些代码以更适合你的具体情况。

方法1:使用Dir函数

Sub LoopAllFilesInAFolder()
   '遍历文件夹中的所有文件
    Dim fileName As Variant
    fileName =Dir("D:\excelperfect\")
    While fileName <> ""
        '插入对每个文件要执行的操作
        '本示例代码打印文件名到立即窗口
        Debug.Print fileName
        '设置fileName指向下一个文件
        fileName = Dir
    Wend
End Sub

上面的代码可以很容易地通过使用通配符进行调整。例如:
‘遍历带有扩展名”.xlsx”的每个文件
filename =Dir(“D:\excelperfect\*.xlsx”)
‘遍历文件名中包含单词”January”的每个文件
filename =Dir(“D:\excelperfect\*January*”)
‘遍历文件夹中的每个文本文件
filename =Dir(“D:\excelperfect\*.txt”) 

方法2:使用File System Object(FSO)后期绑定

Sub LoopAllFilesInFolder1()
    Dim folderName As String
    Dim FSOLibrary As Object
    Dim FSOFolder As Object
    Dim FSOFile As Object
   

   '将文件名赋值给变量
    folderName = "D:\excelperfect\"
   
   '设置对FSO库的所有引用
    Set FSOLibrary =CreateObject("Scripting.FileSystemObject")
    Set FSOFolder =FSOLibrary.GetFolder(folderName)
    Set FSOFile = FSOFolder.Files

   '使用For Each循环遍历文件夹中的每个文件
    For Each FSOFile In FSOFile
        '插入对每个文件要执行的操作
        ' 本示例代码打印文件名到立即窗口
        Debug.Print FSOFile.Name
    Next
   '释放内存
    Set FSOLibrary = Nothing
    Set FSOFolder = Nothing
    Set FSOFile = Nothing
End Sub

方法3:使用File System Object(FSO)早期绑定

要使用本方法,记得像本文开头那样开启对FSO库的引用。

Sub LoopFilesInFolder2()
    Dim folderName As String
    Dim FSOLibrary As FileSystemObject
    Dim FSOFolder As Object
    Dim FSOFile As Object
   '将文件名赋值给变量
    folderName = "D:\excelperfect\"

   '设置对FSO库的所有引用
    Set FSOLibrary = New FileSystemObject
    Set FSOFolder =FSOLibrary.GetFolder(folderName)
    Set FSOFile = FSOFolder.Files

   '使用For Each循环遍历文件夹中的每个文件
    For Each FSOFile In FSOFile
        '插入对每个文件要执行的操作
        ' 本示例代码打印文件名到立即窗口
        Debug.Print FSOFile.Name
    Next

   '释放内存
    Set FSOLibrary = Nothing
    Set FSOFolder = Nothing
    Set FSOFile = Nothing
End Sub

遍历子文件夹中所有文件

当文件存储在子文件夹中时,可能就需要一些技巧了。现在需要找到一种方法来钻取到这些子文件夹中。我们将使用上述相同的Dir和FSO方法。为了确保这些代码可以处理任意数量的子文件夹,宏实际上会调用自身(一种称为递归的技术)。

方法1:使用Dir函数

这个示例将把完整的文件路径(文件夹路径和文件名)打印到立即窗口。

Sub loopAllSubFolderSelectStartDirectory()
   '调用LoopAllSubFolders过程
    Call LoopAllSubFolders("D:\excelperfect\")
End Sub

Sub LoopAllSubFolders(ByVal folderPath As String)
    Dim fileName As String
    Dim fullFilePath As String
    Dim numFolders As Long
    Dim folders() As String
    Dim i As Long
    If Right(folderPath, 1) <>"\" Then folderPath = folderPath & "\"
    fileName = Dir(folderPath &"*.*", vbDirectory)
    While Len(fileName) <> 0
        If Left(fileName, 1) <>"." Then
            fullFilePath = folderPath &fileName
            If (GetAttr(fullFilePath) And vbDirectory) = vbDirectory Then
                ReDim Preserve folders(0 TonumFolders) As String
                folders(numFolders) =fullFilePath
                numFolders = numFolders + 1
            Else
                '插入对每个文件要执行的操作
               '本示例代码打印完整文件路径和文件名到立即窗口
                Debug.Print folderPath &fileName
            End If
        End If
        fileName = Dir()
    Wend
    For i = 0 To numFolders - 1
        LoopAllSubFolders folders(i)
    Next i
End Sub

方法2:使用File System Object(FSO)后期绑定

运行下面的过程:

Sub loopAllSubFolderSelectStartDirectory1()
    Dim FSOLibrary As Object
    Dim FSOFolder As Object
    Dim folderName As String
    '将文件夹名赋值给变量
     folderName = "D:\excelperfect\"
    '设置对FSO库的引用
     Set FSOLibrary = CreateObject("Scripting.FileSystemObject")
    '调用LoopAllSubFolders1过程
     LoopAllSubFolders1 FSOLibrary.GetFolder(folderName)
End Sub

SubLoopAllSubFolders1(FSOFolder As Object)
    Dim FSOSubFolder As Object
    Dim FSOFile As Object
   '遍历每个子文件夹
    For Each FSOSubFolder In FSOFolder.SubFolders
        LoopAllSubFolders1 FSOSubFolder
    Next
   '遍历每个文件并打印名字
    For Each FSOFile In FSOFolder.Files
        '插入对每个文件要执行的操作
        '本示例代码打印完整文件路径和文件名到立即窗口
        Debug.Print FSOFile.Path
    Next
End Sub

方法3:使用File System Object(FSO)早期绑定

要使用本方法,记得像本文开头那样开启对FSO库的引用。

Sub loopAllSubFolderSelectStartDirectory2()
    Dim FSOLibrary As FileSystemObject
    Dim FSOFolder As Object
    Dim folderName As String
    '将文件夹名赋值给变量
     folderName = "D:\excelperfect\"
    '设置对FSO库的引用
     Set FSOLibrary = New FileSystemObject
    '调用LoopAllSubFolders2过程
     LoopAllSubFolders2 FSOLibrary.GetFolder(folderName)
End Sub
Sub LoopAllSubFolders2(FSOFolder As Object)
    Dim FSOSubFolder As Object
    Dim FSOFile As Object
   '遍历每个子文件夹
    For Each FSOSubFolder In FSOFolder.SubFolders
        LoopAllSubFolders2 FSOSubFolder
    Next
   '遍历每个文件并打印名字
    For Each FSOFile In FSOFolder.Files
        '插入对每个文件要执行的操作
        '本示例代码打印完整文件路径和文件名到立即窗口
        Debug.Print FSOFile.Path
    Next
End Sub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/802135.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年大数据高频面试题(中篇)

文章目录 Kafka为什么要用消息队列为什么选择了kafkakafka的组件与作用(架构)kafka为什么要分区Kafka生产者分区策略kafka的数据可靠性怎么保证ack应答机制(可问:造成数据重复和丢失的相关问题)副本数据同步策略ISRkafka的副本机制kafka的消费分区分配策略Range分区分配策略…

三级域名能申请SSL证书吗?

在当今互联网时代&#xff0c;SSL证书已经成为了保障网站安全的重要工具&#xff0c;企业会为网站部署SSL证书来实现HTTPS加密以保护传输数据安全。然而随着业务的增长以及交易规模的扩大&#xff0c;为了更好的管理业务和内容&#xff0c;企业会在主域名的基础上划分二级域名&…

GitHub 令牌泄漏, Python 核心资源库面临潜在攻击

TheHackerNews网站消息&#xff0c;软件供应链安全公司 JFrog 的网络安全研究人员称&#xff0c;他们发现了一个意外泄露的 GitHub 令牌&#xff0c;可授予 Python 语言 GitHub 存储库、Python 软件包索引&#xff08;PyPI&#xff09;和 Python 软件基金会&#xff08;PSF&…

【RabbitMQ】一文详解消息可靠性

目录&#xff1a; 1.前言 2.生产者 3.数据持久化 4.消费者 5.死信队列 1.前言 RabbitMQ 是一款高性能、高可靠性的消息中间件&#xff0c;广泛应用于分布式系统中。它允许系统中的各个模块进行异步通信&#xff0c;提供了高度的灵活性和可伸缩性。然而&#xff0c;这种通…

网络准入控制设备是什么?有哪些?网络准入设备臻品优选

小李&#xff1a;“小张&#xff0c;最近公司网络频繁遭遇外部攻击&#xff0c;我们得加强一下网络安全了。” 小张&#xff1a;“是啊&#xff0c;我听说实施网络准入控制是个不错的选择。但具体什么是网络准入控制设备&#xff1f;我们有哪些选择呢&#xff1f;” 小李微笑…

2024Datawhale AI夏令营---Inclusion・The Global Multimedia Deepfake Detection--学习笔记

赛题背景&#xff1a; 其实总结起来就是一句话&#xff0c;这个项目是基于目前的深度伪装技术&#xff0c;就是通过大量人脸的原数据集进行模型训练之后&#xff0c;能够生成伪造的人脸视频。这项目就是教我们如何去实现这个DeepFake技术。 Task1:了解Deepfake和跑通baseline …

Python项目部署到Linux生产环境(uwsgi+python+flask+nginx服务器)

1.安装python 我这里是3.9.5版本 安装依赖&#xff1a; yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y 根据自己的需要下载对应的python版本&#xff1a; cd local wget https://www.python.org/ftp…

开发实战经验分享:互联网医院系统源码与在线问诊APP搭建

作为一名软件开发者&#xff0c;笔者有幸参与了多个互联网医院系统的开发项目&#xff0c;并在此过程中积累了丰富的实战经验。本文将结合我的开发经验&#xff0c;分享互联网医院系统源码的设计与在线问诊APP的搭建过程。 一、需求分析 在开发任何系统之前&#xff0c;首先要…

成像光谱遥感技术中的AI革命:ChatGPT

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力&#xff0c;ChatGPT在遥感中的应用&#xff0c;人工智能在…

【STM32】RTT-Studio中HAL库开发教程三:IIC通信--AHT20

文章目录 一、I2C总线通信协议二、AHT20传感器介绍三、STM32CubeMX配置硬件IIC四、RTT中初始化配置五、具体实现代码六、实验现象 一、I2C总线通信协议 使用奥松的AHT20温湿度传感器&#xff0c;对环境温湿度进行采集。AHT20采用的是IIC进行通信&#xff0c;可以使用硬件IIC或…

2. KNN分类算法与鸢尾花分类任务

鸢尾花分类任务 1. 鸢尾花分类步骤1.1 分析问题&#xff0c;搞定输入和输出1.2 每个类别各采集50朵花1.3 选择一种算法&#xff0c;完成输入到输出的映射1.4 第四步&#xff1a;部署&#xff0c;集成 2. KNN算法原理2.1 基本概念2.2 核心理念2.3 训练2.4 推理流程 3. 使用 skle…

Word参考文献交叉引用

前言 Word自带交叉引用功能&#xff0c;可在正文位置引用文档内自动编号的段落&#xff0c;同时创建超链接&#xff0c;适用于参考文献的引用。使用此方法对参考文献进行引用后&#xff0c;当参考文献的编号发生变化时&#xff0c;只需要更新域即可与正文中的引用相对应。下文…

vue3+TS从0到1手撸后台管理系统

1.路由配置 1.1路由组件的雏形 src\views\home\index.vue&#xff08;以home组件为例&#xff09; 1.2路由配置 1.2.1路由index文件 src\router\index.ts //通过vue-router插件实现模板路由配置 import { createRouter, createWebHashHistory } from vue-router import …

【15】Android基础知识之Window(一)

概述 这篇文章纠结了很久&#xff0c;在想需要怎么写&#xff1f;因为window有关的篇幅&#xff0c;如果需要讲起来那可太多了。从层级&#xff0c;或是从关联&#xff0c;总之不是很好开口。这次也下定决心&#xff0c;决定从浅入深的讲讲window这个东西。 Window Window是…

鸿蒙特色物联网实训室

一、 引言 在当今这个万物皆可连网的时代&#xff0c;物联网&#xff08;IoT&#xff09;正以前所未有的速度改变着我们的生活和工作方式。它如同一座桥梁&#xff0c;将实体世界与虚拟空间紧密相连&#xff0c;让数据成为驱动决策和创新的关键力量。随着物联网技术的不断成熟…

Qt Creator的好用的功能

&#xff08;1&#xff09;ctrlf&#xff1a; 在当前文档进行查询操作 &#xff08;2&#xff09;f3: 找到后&#xff0c;按f3&#xff0c;查找下一个 &#xff08;3&#xff09;shiftf3: 查找上一个 右键菜单&#xff1a; (4)f4&#xff1a;在…

solidity实战练习3——荷兰拍卖

//SPDX-License-Identifier:MIT pragma solidity ^0.8.24; interface IERC721{function transFrom(address _from,address _to,uint nftid) external ; }contract DutchAuction { address payable immutable seller;//卖方uint immutable startTime;//拍卖开始时间uint immut…

钡铼Modbus TCP耦合器BL200实现现场设备与SCADA无缝对接

前言 深圳钡铼技术推出的Modbus TCP耦合器为SCADA系统与现场设备之间的连接提供了强大而灵活的解决方案&#xff0c;它不仅简化了设备接入的过程&#xff0c;还提升了数据传输的效率和可靠性&#xff0c;是工业自动化项目中不可或缺的关键设备。本文将从Modbus TC、SCADA的简要…

基于Ubuntu2204搭建openstack-Y版-手动搭建

openstack手搭Y版 基础环境配置离线环境时间同步&#xff08;双节点&#xff09;安装openstack客户端数据库服务消息队列服务缓存服务 keystone服务部署glance服务部署placement服务部署nova服务部署controllercompute neutron服务部署controller节点配置neutron.conf文件配置m…

leetcode-349.两个数组的交集

题源 349.两个数组的交集 题目描述 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例…