vba遍历文件夹|vba 遍历指定文件夹(含子目录)获取文件名哪种方法速度最快

vba遍历文件夹|vba 遍历指定文件夹(含子目录)获取文件名哪种方法速度最快的第1张示图

❶ vba 遍历指定文件夹(含子目录)获取文件名,哪种方法速度最快

Sub LoopAllExcelFilesInFolder()Dim wb As WorkbookDim myPath As StringDim myFile As StringDim myExtension As StringDim FldrPicker As FileDialog'这里很关键,决定宏执行快慢的关键Application.ScreenUpdating = FalseApplication.EnableEvents = FalseApplication.Calculation = xlCalculationManual'打开目录选择框Set FldrPicker = Application.FileDialog(msoFileDialogFolderPicker)With FldrPicker.Title = "请选择目录".AllowMultiSelect = FalseIf .Show <> -1 Then GoTo NextCodemyPath = .SelectedItems(1) & "\"End With'取消选择NextCode:myPath = myPathIf myPath = "" Then GoTo ResetSettings'指定过滤的文件后缀myExtension = "*.xls*"'遍历全路径myFile = Dir(myPath & myExtension)'循环处理每一个文件Do While myFile <> ""'打开Set wb = Workbooks.Open(Filename:=myPath & myFile)'确保工作簿被打开,在处理下一个文件时DoEvents'设置背景色wb.Worksheets(1).Range("A1:Z1").Interior.Color = RGB(51, 98, 174)'保存工作簿wb.Close SaveChanges:=True'确保工作簿被关闭,在处理下一个文件时DoEvents'接着处理下一个myFile = DirLoop'提示处理完成MsgBox "处理完成!"ResetSettings:'恢复设置Application.EnableEvents = TrueApplication.Calculation = xlCalculationAutomaticApplication.ScreenUpdating = TrueEnd Sub

❷ 怎么用vba遍历文件夹里的所有文件

遍历操作,一般运用于提取和写入等的操作,其基本原理和代码都一样,

遍历的方法也有很多种,以下我提供一种方法open法,除去红框以内

的代码基本都是遍历的基础代码,在这个基础上可以做根据实际需要的添加修改

❸ VBA中怎么遍历所选路径中所有文件夹及其子文件夹(多个子文件),并返回所有的最底层的文件夹路径

答:执行"获取所有文件夹",按提示操作。文件夹清单会显示在工作表的AB列中。

Sub获取所有文件夹()DimDirectoryAsStringWithApplication.FileDialog(msoFileDialogFolderPicker).InitialFileName=Application.DefaultFilePath&"".Title="请选择一个文件夹".ShowIf.SelectedItems.Count=0ThenExitSubElseDirectory=.SelectedItems(1)EndIfEndWithCells.ClearContentsCallRecursiveDir(Directory)EndSubPublicSubRecursiveDir(ByValCurrDirAsString)DimDirs()AsStringDimNumDirsAsLongDimFilesizeAsDoubleDimTotalFolders,SingleFolderCells(1,1)="目录名"Cells(1,2)="日期/时间"Range("A1:B1").Font.Bold=TrueSetTotalFolders=CreateObject("Scripting.FileSystemObject").GetFolder(CurrDir).SubFoldersCells(WorksheetFunction.CountA(Range("A:A"))+1,1)=CurrDirCells(WorksheetFunction.CountA(Range("B:B"))+1,2)=FileDateTime(CurrDir)IfTotalFolders.Count<>0ThenReDimPreserveDirs(0ToNumDirs)AsStringDirs(NumDirs)=SingleFolderNumDirs=NumDirs+1NextEndIfFori=0ToNumDirs-1RecursiveDirDirs(i)NextiEndSub

❹ 如何用vba遍历文件夹里面的子文件并且复制指定数据形成一张新的表格,ps:子文件的数据格式一直

尝试用下边代码试试:

Sub OpenAndClose()

Dim MyFile As String

Dim s As String

Dim count As Integer

MyFile = Dir(文件夹目录 & "*.xlsx")

'读入文件夹中的第一个.xlsx文件

count = count + 1 '记录文件的个数

s = s & count & "、" & MyFile

Do While MyFile <> ""

MyFile = Dir '第二次读入的时候不用写参数

If MyFile = "" Then

Exit Do '当MyFile为空的时候就说明已经遍历完了,这时退出Do,否则还要运行一遍

End If

count = count + 1

If count Mod 2 <> 1 Then

s = s & vbTab & count & "、" & MyFile

Else

s = s & vbCrLf & count & "、" & MyFile

End If

Loop

Debug.Print s

End Sub

另外,可以考虑用python试试

❺ VBA中历遍文件夹中的图片为什么第二个就失效了myfile成了空值!哪里出了问题

看到有网友问如何 VBA中遍历 文件夹下(含有子文件夹) 的所有文件,就做了一个示例教程。VBA中遍历文件夹下所有文件(含子文件夹)的方法1)使用Dir() 的方法2)使用VBA的filesercth对象3)使用FileSystemObject对象及递归各种方法存在的问题及对比1)Dir()的方法遍历子文件夹文件不太方便2)FileSearch方法在office 2007中微软把Application对象FileSearch方法删除了3)所有比较安全的方法是使用 FileSystemObject对象实现遍历文件夹及子文件夹中所有文件主要设计思路及程序要点1)为避免显式引用FileSystemObject,我们使用Set fso = CreateObject("Scripting.FileSystemObject")创建对象2)为了让程序更高效,我们使用了递归,在获取子文件夹文件时调用了函数自身完整的实现代码如下(tmtony)Dim lngSeqNo As Long '用来统计获取到的文件的个数,以便定义单元格行号' 表格上单击的测试按钮代码 作者:tmtonySub 矩形圆角1_Click()测试程序End Sub’自定义过程Public Sub 测试程序()Dim strPath As StringDim fso As Object, objFolder As ObjectSet fso = CreateObject("Scripting.FileSystemObject")lngSeqNo = 0strPath = "E:\NewTools\TreesizePro\TreeSize_7.1.3_Portable" '可改成你自己的指定目录Set objFolder = fso.GetFolder(strPath)GetAllFiles objFolder' ReDim Preserve arrFiles(1 To lngFileCnt)' For i = 1 To lngFileCnt' Debug.Print arrFiles(i)' Next iEnd Sub'自定义的获取子文件夹所有文件的过程,递归调用Sub GetAllFiles(ByVal objFolder As Object)Dim objFile As Object ' FileDim objSubFolder As Object ' FolderDim arrFiles()Dim lngFileCnt As LongDim i As LongReDim arrFiles(1 To 1000)lngFileCnt = 0For Each objFile In objFolder.FileslngFileCnt = lngFileCnt + 1If lngFileCnt > UBound(arrFiles) Then ReDim Preserve arrFiles(1 To lngFileCnt + 1000)lngSeqNo = lngSeqNo + 1' arrFiles(lngFileCnt) = objFile.PathActiveSheet.Cells(lngSeqNo, 1).Value = objFile.PathNext objFileIf objFolder.SubFolders.Count = 0 Then Exit SubFor Each objSubFolder In objFolder.SubFoldersGetAllFiles objSubFolderNextEnd Sub执行后的结果写到Excel单元格中,效果如下原创不易,如果您觉得这个示例能帮到您。请给我们点个赞及关注一下我们。谢谢

❻ 如何用VBA遍历指定文件夹内的所有文件

用dir函数加上循环即可。比如将D:ABC文件夹内的所有文件显示到A列,代码如下:

Sub遍历所有文件()DimFn$,N%Fn=Dir("D:ABC*.*")WhileFn<>""N=N+1Range("A"&N)=FnFn=DirWendEndSub

❼ 如何使用VBA遍历文件夹及其子文件夹中的所有excel,并打开后进行修改

把 .Filename = “C:\Users\Desktop\c.png"换成 .Filename ="C:\Users\Desktop\c.png"试试,=号后面的双引号不是英文字符

❽ VBA编程,遍历文件夹下的excel表,对每个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:est.txt") '立即窗口显示"c:"

3、GetExtensionName 方法

语法:object.GetExtensionName(path)

作用:返回一个包含路径中最后部件扩展名的字符串。

示例:

Debug.Print fso.GetExtensionName("c:est.txt") '立即窗口显示"txt"

4、GetBaseName 方法

语法:object.GetBaseName(path)

作用:返回一个包含路径中最后部件的基本名字(去掉任何文件扩展名)的字符串。

示例:

Debug.Print fso.GetBaseName("c:abcest.txt") '立即窗口显示"test"

5、GetAbsolutePathName 方法

语法:object.GetAbsolutePathName(pathspec)

作用:从提供的路径说明中返回一个完整、明确的路径。

示例:如果pathspec为空字符串"",则返回当前路径。假设当前路径为C:Documents and SettingsycMy Documents

Debug.Print fs.GetAbsolutePathName("") '显示C:Documents and SettingsycMy DocumentsDebug.Print fs.GetAbsolutePathName("c:..") '显示C:Documents and Settingsyc,即上层目录Debug.Print fs.GetAbsolutePathName("abc") '显示C:Documents and SettingsycMy DocumentsabcDebug.Print fs.GetAbsolutePathName("c:est.txt") '显示C:est.txt

6、GetFile 方法

语法:object.GetFile(filespec)

作用:返回一个和指定路径中文件相对应的 File 对象。

示例:

Dim fSet f = fso.GetFile("c:est.txt") '变量f就代表了文件test.txt对象

注意:如果指定的文件不存在,则发生一个错误。

7、GetFileName 方法

语法:object.GetFileName(pathspec)

作用:返回指定路径中的最后部件,该路径不是驱动器说明的一部分。

示例:

Debug.Print fso.GetFileName("c:abcest.txt") '立即窗口显示"test.txt"

8、GetFolder 方法

语法:object.GetFolder(folderspec)

作用:返回一个和指定路径中文件夹相对应的 Folder 对象。

示例:

Dim fdSet fd = fso.GetFolder("c:windows") '变量f就代表了文件夹windows对象

注意:如果指定的文件夹不存在,则发生一个错误。

9、GetSpecialFolder 方法

语法:object.GetSpecialFolder(folderspec)

作用:返回指定的特殊文件夹。

说明:folderspec 参数可为任何的下列值:

WindowsFolder 0 Windows 文件夹,包含由 Windows 操作系统安装的文件。 SystemFolder 1 系统文件夹,包含库、字体、设备驱动程序。 TemporaryFolder 2 Temp 文件夹,用于存储临时文件。它的路径在 TMP 环境变量中。

10、GetParentFolderName 方法

语法:object.GetParentFolderName(path)

作用:返回一个包含指定路径最后部件父文件夹名字的字符串。

示例:

Debug.Print fso.GetParentFolderName("c:mpest.txt") '显示"c:mp"

11、GetTempName 方法

语法:object.GetTempName

作用:返回一个随机产生的临时文件或文件夹的名字,该名字在执行需要临时文件或文件夹的操作时有用。

说明:GetTempName 方法不产生一个文件,它仅提供一个临时文件名字,该名字可被 CreateTextFile 用于创建一个文件。

示例:

Debug.Print fso.GetTempName '显示"radB0208.tmp",每次都会变。

12、BuildPath 方法

语法:object.BuildPath(path, name)

作用:追加一个名字到一个已经存在的路径。

示例:

Debug.Print fso.BuildPath("c:mp", "abc") '显示"c:mpabc"

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:mp")

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:estfile.txt", True)

21、OpenTextFile 方法

语法:object.OpenTextFile(filename[, iomode[, create[, format]]])

作用:打开一个指定的文件并返回一个 TextStream 对象,该对象可用于对文件进行读、写、追加操作。

说明:·iomode 参数可为下面设置值中的任何值:

ForReading 1 打开一个只读文件,不能对此文件进行写操作。 ForWriting 2 打开一个用于写操作的文件。如果和此文件同名的文件已存在,则覆盖以前内容。 ForAppending8 打开一个文件并写到文件的尾部。

注意:在VBA帮助里是没有ForWriting的,其实是有的,VBA帮助也是有错误的。另外,这些常数在使用前要先声明,或者直接用数值。

·create可选的,它表示如果指定的 filename 不存在是否可以创建一个新文件。如果创建新文件,其值为 True。若不创建文件其值为 False。缺省值为 False。

·Format参数可为下面设置值中的任何值:

TristateUseDefault –2 使用系统缺省打开文件。 TristateTrue –1 以 Unicode 格式打开文件。 TristateFalse 0 以 ASCII 格式打开文件。

示例:

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

或者:

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

这两者功能是一样的,一个声明了常量,一个直接用数值。都是在C盘创建文件testfile.txt(如不存在),或以写的方式打开(如存在)。

22、CopyFile 方法

语法:object.CopyFile source, destination[, overwrite]

作用:把一个或多个文件从一个地方复制到另一个地方。

说明:需要注意的地方与CopyFolder是完全类似的。

示例:

fso.file "c:estfile.txt", "f:abc" '若abc不存在则出错。fso.file "c:estfile.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 属性 文件夹的属性。可为下列值中的任意一个或任意的逻辑组合: Normal 0 一般文件。未设置属性。 ReadOnly 1 只读文件。属性为读/写。 Hidden 2 隐藏文件。属性为读/写。 System 4 系统文件。属性为读/写。 Volume 8 磁盘驱动器卷标。属性为只读。 Directory 16 文件夹或目录。属性为只读。 Archive 32 自上次备份后已经改变的文件。属性为读/写。 Alias 64 链接或快捷方式。属性为只读。 Compressed 128 压缩文件。属性为只读。 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 方法是一样的。

示例:

Setfd=fs.getfolder("c:mp")Setf=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的数据之间操作。

SubTest()Application.DisplayAlerts=False'禁止信息提示Application.ScreenUpdating=False'禁止屏幕刷新mypath=Sheets(1).Range("B2").Value'文件夹路径ForEachDeleFileInCreateObject("scripting.filesystemobject").getfolder(Sheets(1).Range("B3").Value).Files'遍历文件夹下的所有文件DeleFile.Delete'删除每遍历一次的文件NextForEachmyfileInCreateObject("scripting.FileSystemObject").getfolder(mypath).Files'遍历文件夹下的所有文件Ifmyfile.NameLike"*.xlsx*"Then'筛选excel文件Filename=Mid(myfile.Name,1,(InStr(myfile.Name,"_")-1))'获取文件名WithWorkbooks.Open(Op.Range("B1").Value&""&Op.Range("C1").Value)'打开另一个excel文件为ASetwb=Workbooks(Op.Range("C1").Value).Worksheets(1)'设置A的workbook为wbWithGetObject(myfile)'打开当前遍历的excel文件为Bwb.Range("A1").Value=.Sheets(1).Range("C1").Value'将B的C1单元格值赋给A的A1单元格.Close'关闭BEndWith.SaveAsFilename:=Op.Range("B3")&""&Filename&".xlsx",_FileFormat:=xlOpenXMLWorkbook,CreateBackup:=False'另存为excel文件.CloseFalse'关闭AEndWithEndIfNextApplication.DisplayAlerts=True'恢复信息提示Application.ScreenUpdating=True'恢复屏幕刷新EndSub

❾ 求助]如何用VBA遍历指定目录下的所有子文件夹和文件-字典模式

F是一个临时逻辑变量,在循环查找工作簿中是否有名为“XLS文件清单”的工作表,找到为“真”,否则为假。目的是方便后续的代码处理,如果没有这个工作表,则先创建建这个工作表,后面才能放置遍历出来的文件夹及文件名。

未经允许不得转载:山九号 » vba遍历文件夹|vba 遍历指定文件夹(含子目录)获取文件名哪种方法速度最快

赞 (0)