对每个excel表遍历做一些操作 如何遍历文件夹下所有excel文件

经验直达:

  • 如何遍历文件夹下所有excel文件
  • 对每个excel表遍历做一些操作

一、如何遍历文件夹下所有excel文件


使用excel提取文件夹中的所有文件名称的方法主要有以下两个:
1、在那个文件夹内新建一个.TXT文件(如wenjian.txt) , 用记事本单开输入
dir> 1.txt
保存退出
将刚才的.TXT(wenjian.txt)更名为.bat文件(wenjian.bat)
双击wenjian.bat文件运行一次 , 在文件夹内多出一个1.txt文件
打开1.txt文件,将其中的内容粘贴到Excel中,数据——分列处理就可以得到你要的文件名列表了!
2、VBA(2003版)
在那个文件夹下新建Excel文件,打开新建的Excel文件 , 右击工作表标签(如Sheet1) , 查看代码——在代码编辑器中输入以下代码
Sub Test()
Dim i As Integer
Dim strPath As String
strPath = ThisWorkbook.Path
With Application.FileSearch
.LookIn = strPath
.SearchSubFolders = True
.Filename = "*.*"
If .Execute > 0 Then
For i = 1 To .FoundFiles.Count
Range("A" & i) = .FoundFiles(i)
Next i
End If
End With
End Sub
回到Excel表格中,工具——宏——宏——选择Sheet1.Test——执行

方法一简单的操作就可以,方法二需要对程序有一定的了解,方法二通用性比较强 , 需要的时候执行一下就可以,更快捷 。


二、对每个excel表遍历做一些操作


(一)FileSystemObject对象模型包含了下面的对象和集合:
·FileSystemObject 主对象,包含用来创建、删除和获得有关信息,以及用来操作驱动器、文件夹和文件的方法和属性 。
·Drive对象,包含用来获得信息的方法和属性,这些信息是关于连接在系统上的驱动器的,如有多少可用空间等 。驱动器不一定是硬盘,也可以是CD-ROM、U盘甚至是通过网络在逻辑上连接的硬盘(如公司里部门共享的服务器网络硬盘) 。
·Drives集合,提供驱动器的列表,这些驱动器以实物或在逻辑上与系统相连接 。Drives集合包括所有驱动器,与类型无关 。
·File对象 , 包含用来创建、删除或移动文件的方法和属性 。
·Files集合,提供包含在文件夹内的所有文件的列表 。
·Folder对象,包含用来创建、删除或移动文件夹的方法和属性 。
·Folders集合 , 提供包含在文件夹内的所有文件夹的列表 。
·TextStream对象,用来读写文本文件 。
(二)FileSystemObject对象的方法
FileSystemObject对象模型中有些功能是重复的,如可用FileSystemObject对象的CpoyFile方法,也可用File对象的Copy方法来复制文件 。下面先介绍FileSystemObject对象的方法 。
1、GetDrive 方法
语法:object.GetDrive drivespec
drivespec参数可以是一个驱动器字符(c)、一个驱动器字符加一个冒号(c:)、一个驱动器字符加冒号和路径分隔符(c:)或任何网络共享的说明(file://computer2/share1) 。
作用:返回一个与指定路径中的驱动器相对应的 Drive 对象 。
示例:
Dim dSet
d = fso.GetDrive("D:")'变量d就代表了驱动器D对象

如果 drivespec 不符合任何一种可以接受的形式或者不存在,则发生一个错误 。
注意:为简洁,示例中都假定fso是已经创建的FileSystemObject对象
2、GetDriveName 方法
语法:object.GetDriveName(path)
作用:返回一个包含指定路径的驱动器名字的字符串 。
示例:
Debug.Print fso.GetDriveName("c:test.txt")'立即窗口显示"c:"

3、GetExtensionName 方法
语法:object.GetExtensionName(path)
作用:返回一个包含路径中最后部件扩展名的字符串 。
示例:
Debug.Print fso.GetExtensionName("c:test.txt")'立即窗口显示"txt"

4、GetBaseName 方法
语法:object.GetBaseName(path)
作用:返回一个包含路径中最后部件的基本名字(去掉任何文件扩展名)的字符串 。
示例:
Debug.Print fso.GetBaseName("c:abctest.txt")'立即窗口显示"test"

5、GetAbsolutePathName 方法
语法:object.GetAbsolutePathName(pathspec)
作用:从提供的路径说明中返回一个完整、明确的路径 。
示例:
如果pathspec为空字符串"",则返回当前路径 。假设当前路径为C:Documents and SettingsycMy Documents
Debug.Print fs.GetAbsolutePathName("")'显示C:Documents and SettingsycMy Documents
Debug.Print fs.GetAbsolutePathName("c:..") '显示C:Documents and Settingsyc,即上层目录
Debug.Print fs.GetAbsolutePathName("abc") '显示C:Documents and SettingsycMy Documentsabc
Debug.Print fs.GetAbsolutePathName("c:test.txt") '显示C:test.txt
6、GetFile 方法
语法:object.GetFile(filespec)
作用:返回一个和指定路径中文件相对应的 File 对象 。
示例:
Dim fSet f = fso.GetFile("c:test.txt")'变量f就代表了文件test.txt对象

注意:如果指定的文件不存在,则发生一个错误 。
7、GetFileName 方法
语法:object.GetFileName(pathspec)
作用:返回指定路径中的最后部件,该路径不是驱动器说明的一部分 。
示例:
Debug.Print fso.GetFileName("c:abctest.txt")'立即窗口显示"test.txt"

8、GetFolder 方法
语法:object.GetFolder(folderspec)
作用:返回一个和指定路径中文件夹相对应的 Folder 对象 。
示例:
Dim fdSet fd = fso.GetFolder("c:windows")'变量f就代表了文件夹windows对象

注意:如果指定的文件夹不存在,则发生一个错误 。
9、GetSpecialFolder 方法
语法:object.GetSpecialFolder(folderspec)
作用:返回指定的特殊文件夹 。
说明:
folderspec 参数可为任何的下列值:
WindowsFolder0Windows 文件夹,包含由 Windows 操作系统安装的文件 。
SystemFolder1系统文件夹,包含库、字体、设备驱动程序 。
TemporaryFolder2Temp 文件夹 , 用于存储临时文件 。它的路径在 TMP 环境变量中 。

10、GetParentFolderName 方法
语法:object.GetParentFolderName(path)
作用:返回一个包含指定路径最后部件父文件夹名字的字符串 。
示例:
Debug.Print fso.GetParentFolderName("c:tmptest.txt")'显示"c:tmp"

11、GetTempName 方法
语法:object.GetTempName
作用:返回一个随机产生的临时文件或文件夹的名字,该名字在执行需要临时文件或文件夹的操作时有用 。
说明:GetTempName 方法不产生一个文件 , 它仅提供一个临时文件名字,该名字可被 CreateTextFile 用于创建一个文件 。
示例:
Debug.Print fso.GetTempName'显示"radB0208.tmp",每次都会变 。

12、BuildPath 方法
语法:object.BuildPath(path, name)
作用:追加一个名字到一个已经存在的路径 。
示例:
Debug.Print fso.BuildPath("c:tmp", "abc") '显示"c:tmpabc"

13、CreateFolder 方法
语法:object.CreateFolder(foldername)
作用:创建一个文件夹 。
注意:如果指定的文件夹已经存在 , 则发生一个错误 。
示例:
fso.CreateFolder("c:myfolder")'在C盘创建一个myfolder文件夹

14、CopyFolder 方法
语法:object.CopyFolder source, destination[, overwrite]
source必需的 。指明一个或多个被复制文件夹的字符串文件夹说明,可以包括通配符 。
destination 必需的 。指明 source 中被复制文件夹和子文件夹的接受端的字符串,不允许有通配符 。
overwrite可选的 。Boolean 值,它表示已存在的文件夹是否被覆盖 。如果为 True , 文件被覆盖 。
如果为 False , 文件不被覆盖 。缺省值为 True 。

作用:复制一个文件夹到另一个地方 。
15、MoveFolder 方法
语法:object.MoveFolder source, destination
参数与CopyFolder的前两个一样 。
作用:将一个或多个文件夹从一个地方移动到另一个地方 。
16、DeleteFolder 方法
语法:object.DeleteFolder folderspec[, force]
folderspec 必需的 。要删除的文件夹的名字 。Folderspec 可以在最后的路径部件中包含通配符 。
force可选的 。Boolean 值,如果要删除具有只读属性设置的文件夹,其值为 True,
如果值为 False (缺?。虿荒苌境哂兄欢潦粜陨柚玫奈募?。

作用:删除一个指定的文件夹和它的内容 。
说明:如果没有发现相匹配的文件夹,则发生一个错误 。DeleteFolder 方法停止在它遇到的第一个错误上,不要尝试回卷或撤消错误发生前所做的任何改变 。
示例:
fso.DeleteFolder("c:tmp")

17、FolderExists 方法
语法:object.FolderExists(folderspec)
作用:如果指定的文件夹存在返回 True,不存在返回 False 。
18、DriveExists 方法
语法:object.DriveExists(drivespec)
作用:如果指定的驱动器存在 , 返回 True , 如果不存在返回 False 。
19、FileExists 方法
语法:object.FileExists(filespec)
作用:如果指定的文件存在 , 返回 True , 若不存在 , 则返回 False 。
20、CreateTextFile 方法
语法:object.CreateTextFile(filename[, overwrite[, unicode]])
overwrite 可选的 。Boolean 值,表示一个已存在文件是否可被覆盖 。如果可被覆盖其值为 True ,
其值为 False 时不能覆盖 。如果它被省略 , 则已存在文件不能覆盖 。
unicode可选的 。Boolean 值 , 表示文件是作为一个 Unicode 文件创建的还是作为一个ASCII 文件创建的 。
如果作为一个 Unicode 文件创建 , 其值为 True,作为一个 ASCII 文件创建,
其值为 False 。如果省略的话,则认为是一个 ASCII 文件 。

作用:创建一个指定的文件名并且返回一个用于该文件读写的 TextStream 对象 。
示例:
Dim fSet
f = fso.CreateTextFile("c:testfile.txt", True)

21、OpenTextFile 方法
语法:object.OpenTextFile(filename[, iomode[, create[, format]]])
作用:打开一个指定的文件并返回一个 TextStream 对象,该对象可用于对文件进行读、写、追加操作 。
说明:
·iomode 参数可为下面设置值中的任何值:
ForReading1打开一个只读文件,不能对此文件进行写操作 。
ForWriting2打开一个用于写操作的文件 。如果和此文件同名的文件已存在,则覆盖以前内容 。
ForAppending8打开一个文件并写到文件的尾部 。

注意:在VBA帮助里是没有ForWriting的,其实是有的,VBA帮助也是有错误的 。另外,这些常数在使用前要先声明 , 或者直接用数值 。
·create 可选的,它表示如果指定的 filename 不存在是否可以创建一个新文件 。如果创建新文件 , 其值为 True 。若不创建文件其值为 False 。缺省值为 False 。
·Format 参数可为下面设置值中的任何值:
TristateUseDefault–2使用系统缺省打开文件 。
TristateTrue–1以 Unicode 格式打开文件 。
TristateFalse0以 ASCII 格式打开文件 。

示例:
Dim fSet
f = fso.OpenTextFile("c:testfile.txt", 2, True)

或者:
Const ForWriting = 2
Set f = fso.OpenTextFile("c:testfile.txt", ForWriting, True)

这两者功能是一样的,一个声明了常量 , 一个直接用数值 。都是在C盘创建文件testfile.txt(如不存在),或以写的方式打开(如存在) 。
22、CopyFile 方法
语法:object.CopyFile source, destination[, overwrite]
作用:把一个或多个文件从一个地方复制到另一个地方 。
说明:需要注意的地方与CopyFolder是完全类似的 。
示例:
fso.copyfile "c:testfile.txt", "f:abc"'若abc不存在则出错 。
fso.copyfile "c:testfile.txt", "f:abc"'若abc不存在则复制testfile.txt到F盘文件名变为abc , 若abc存在,出错,因为是一个目录 。

23、MoveFile 方法
语法:object.MoveFile source, destination
作用:将一个或多个文件从一个地方移动到另一个地方 。
说明:需要注意的地方与MoveFolder是完全类似的 。
24、DeleteFile 方法
语法:object.DeleteFile filespec[, force]
作用:删除一个指定的文件 。
说明:force 可选的 。如果要删除具有只读属性设置的文件,其值为 True 。如果其值为 False (缺?。?则不能删除具有只读属性设置的文件 。
(三)处理文件夹
1、获取文件夹的信息
可以利用Folder对象来获取有关文件夹的信息 , Folder对象的属性有:
Attributes属性文件夹的属性 。可为下列值中的任意一个或任意的逻辑组合:
Normal0一般文件 。未设置属性 。
ReadOnly1只读文件 。属性为读/写 。
Hidden2隐藏文件 。属性为读/写 。
System4系统文件 。属性为读/写 。
Volume8磁盘驱动器卷标 。属性为只读 。
Directory16文件夹或目录 。属性为只读 。
Archive32自上次备份后已经改变的文件 。属性为读/写 。
Alias64链接或快捷方式 。属性为只读 。
Compressed128压缩文件 。属性为只读 。
Name属性文件夹名字 。
ShortName属性较早的 8.3 命名约定的程序所使用的短名字 。
Type属性文件夹类型 。
Files属性所有 File 对象组成的 Files 集合 , 这些 File 对象包含在指定的文件夹中
──包括设置了隐藏和系统文件属性的那些文件 。
Drive属性文件夹所在的驱动器符号 。
IsRootFolder 属性文件夹是否是根文件夹 。
ParentFolder 属性文件夹的父文件夹对象 。
SubFolders属性文件夹的子文件夹集合 。
Path属性文件夹的路径 。
ShortPath属性较早的 8.3 文件命名约定的程序所使用的短路径 。
Size属性文件夹的大小 , 以字节为单位 。
DateCreated属性文件夹的创建日期和时间 。
DateLastModified 属性最后一次修改文件夹的日期和时间 。
DateLastAccessed 属性最后一次访问文件夹的日期和时间 。

属性的使用和Drive对象是一样的,可以用GetFolder获取一个Folder对象,也可以用FileSystemObject对象的CreateFolder 方法创建一个Folder对象 。
2、Folder对象的方法
⑴Copy 方法
语法:object.Copy destination[, overwrite]
作用:把一个指定的文件夹从一个地方复制到另一个地方 。
说明:Copy 方法的作用与FileSystemObject对象的CopyFolder 方法是一样的 , 不同在于后者可一次复制多个文件夹 。
⑵Move 方法
语法:object.Move destination
作用:将一个指定的文件夹从一个地方移动到另一个地方 。
说明:Move 方法的作用与FileSystemObject.MoveFolder 是一样的 。不同在于后者可一次移动多个文件夹 。
⑶Delete 方法
语法:object.Delete force
作用:删除一个指定的文件夹 。
说明:Delete 方法的作用与FileSystemObject.DeleteFolder 是一样的 。
⑷CreateTextFile 方法
语法:object.CreateTextFile(filename[, overwrite[, unicode]])
作用:与FileSystemObject对象的CreateTextFile 方法是一样的 。
示例:

Set fd = fs.getfolder("c:tmp")
Set f = fd.CreateTextFile("testfile.txt", True)
可在C盘tmp文件夹下创建testfile.txt文件 。
(四)处理文件
1、获取文件的信息
可以利用File对象来获取有关文件的信息,File对象的属性和Folder的属性是完全一样的 , 只是少了Files 属性、IsRootFolder 属性、SubFolders 属性这3个属性 。这里就不列了 。
2、File对象的方法
⑴Copy 方法
⑵Move 方法
⑶Delete 方法
以上三种方法与Folder的是完全类似的,语法也一样,同样也可用FileSystemObject对象相应的方法代替 。
⑷OpenAsTextStream 方法
语法:object.OpenAsTextStream([iomode, [format]])
作用:打开一个指定的文件并返回一个 TextStream 对象 , 该对象可用来对文件进行读、写、追加操作 。
说明:此方法与FileSystemObject对象的 OpenTextFile 方法相同的功能 。参数也是一致的 。
总结
从上面的介绍,我们看到使用FileSystemObject对象处理文件、文件夹比使用VBA语句的方法具有更容易存在的特点 。这是因为FileSystemObject对象使用了面向对象的语法 。另外FileSystemObject对象处理文本文件毫不逊色于VBA语句,非常值得推荐 。唯一的问题是不能处理二进制文件,微软在有关文档中称计划将来支持二进制文件,不过应该只是计划而已 。


通过介绍完FileSystemObject的知识,可参考以下代码是通过FileSystemObject对象模型遍历指定文件夹 , 然后打开该文件和另外的excel,实现两个excel的数据之间操作 。
【对每个excel表遍历做一些操作 如何遍历文件夹下所有excel文件】Sub Test()
Application.DisplayAlerts = False'禁止信息提示
Application.ScreenUpdating = False'禁止屏幕刷新
mypath = Sheets(1).Range("B2").Value '文件夹路径

For Each DeleFile In CreateObject("scripting.filesystemobject").getfolder(Sheets(1).Range("B3").Value).Files '遍历文件夹下的所有文件
DeleFile.Delete '删除每遍历一次的文件
Next

For Each myfile In CreateObject("scripting.FileSystemObject").getfolder(mypath).Files '遍历文件夹下的所有文件

If myfile.Name Like "*.xlsx*" Then'筛选excel文件

Filename = Mid(myfile.Name, 1, (InStr(myfile.Name, "_") - 1)) '获取文件名

With Workbooks.Open(Op.Range("B1").Value & "" & Op.Range("C1").Value)'打开另一个excel文件为A

Set wb = Workbooks(Op.Range("C1").Value).Worksheets(1)'设置A的workbook为wb

With GetObject(myfile)'打开当前遍历的excel文件为B
wb.Range("A1").Value = https://www.itzhengshu.com/excel/.Sheets(1).Range("C1").Value'将B的C1单元格值赋给A的A1单元格
.Close '关闭B
End With
.SaveAs Filename:=Op.Range("B3") & "" & Filename & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False'另存为excel文件

.Close False '关闭A
End With
End If

Next
Application.DisplayAlerts = True '恢复信息提示
Application.ScreenUpdating = True '恢复屏幕刷新
End Sub

相关经验推荐