image

FileSystemObject用于处理与系统连接的文件夹和文件。我们可以使用它来访问文件,文件夹,驱动器和文本流。它不仅可以访问文件,文件夹和文本文件,还可以创建。这些操作不限于系统的硬盘,而是连接到该文件的任何设备。这意味着您可以访问笔式驱动器,CD ROM或虚拟连接的网络驱动器。

这些是我们可以在VBA中使用FileSystemObject进行的操作:

用于创建,打开,阅读,编写和删除文本文件。

用于添加,更改和删除文件夹。

遍历文件和文件夹。

用于将文件或文件夹复制并移动到其他位置。

用于检查文件或文件夹是否在该位置

如何在VBA中访问FileSystemObject?

文件系统对象是Microsoft脚本运行时库的一部分。

要访问FileSystemObject,我们需要连接或添加对Microsoft Scripting Runtime Library或Scrrun.dll *的引用。

注意:FileSystemObject不支持二进制文件的操作,因为Scrrun.dll支持使用TextStream Object创建和操纵文件。

在VBA中有两种创建FileSystemObject的方法:

1:使用CreateObject方法创建FSO对象:

使用此方法,我们首先声明一个变量对象类型。然后使用CreateObject将FSO对象的引用设置为该变量:

Sub LearnFso()

'Creating the object variable

Dim fso As Object

'Create the FileSystemObject using Create Object Method

Set fso = CreateObject("Scripting.FileSystemObject")

Debug.Print fso.GetBaseName("E:\MTR\Feb'18 MTR")

End Sub

该方法是动态的并且可以转移。这意味着,如果您将代码共享给其他系统,则此代码将正常运行。您所拥有的Microsoft Runtime脚本版本是什么版本。

唯一的缺点是您将看不到VBA提供的智能感知。您将必须依靠自己的知识来使用FileSystemObject的所有属性和方法。

2:通过添加对Microsoft运行时脚本的引用来创建FSO对象您可以使用new关键字在VBA中直接创建FileSystemObject。

为此,您将必须在系统中添加对最新Microsoft Scripting Runtime的引用。

要添加参考,请转到工具菜单中的参考选项。

在这里,找到Microsoft脚本运行时dll。检查它,然后单击确定。

image

现在,您准备创建和使用FSO对象。

Sub LearnFso()

Dim fso as new FileSystemObject

Debug.Print fso.GetBaseName("E:\MTR\Feb'18 MTR")

End Sub

Sub LearnFso()

Dim fso as FileSystemObject

Set fso = New FileSystemObject

Debug.Print fso.GetBaseName("E:\MTR\Feb'18 MTR")

End Sub

两者都可以正常工作。

这种方法的主要优点是您将能够看到VBA的智能。 VBA将向您显示fso对象的所有属性和方法。它还会告诉您它将接受哪种变量以及将返回哪种值。

image

如果您将此代码共享给其他系统,则必须告诉他们从工具中添加对脚本运行时的引用,否则它们将收到未定义用户定义类型的编译错误。因此,就像导入其他编程语言一样。

请注意,FSO不是关键字。您可以将其用作变量名。将文件系统对象命名为fso只是一种惯例。这就是为什么有些人将它作为关键字感到困惑。创建FSO对象的两种方法都有其优点和缺点,我在解释它们时已经提到过。因此,请根据需要使用。在本文中,我将使用创建FileSystemObject的第二种方法。

现在我们知道了如何在VBA中创建FileSystemObject,让我们在做一些有意义的任务时使用这些知识。我的意思是让我们跳到示例。

示例1:在指定文件夹中获取所有子文件夹我们将看到的第一个示例是从特定文件夹获取子文件夹名称。

Sub LearnFso()

' decaring variables that we will need

Dim fso As FileSystemObject ' Variable for the FileSystemObject

Dim fdr As Folder      ' Variable for the base folder

Dim subfdr As Folder     ' Variable for the sub folders

Dim fdrpath As String 'to store path of base folder

'Intializing the objects

fdrpath = "D:\Downloads" 'Declaring the folder

Set fso = New FileSystemObject 'Creating the fso object

Set fdr = fso.GetFolder(fdrpath) 'Creating the folder object of given folder

'loop to get all the sub folders name in

For Each subfdr In fdr.SubFolders

Debug.Print subfdr.Name

Next subfdr

End Sub

当您运行上面的代码时,您会得到什么。

image

是的那就是我的下载文件夹。不要专心于此。

这是如何工作的?

让我们逐步了解:

1:减少我们需要的变量

Dim fso作为FileSystemObject’用于FileSystemObject的变量 Dim fdr作为文件夹’用于基础文件夹的变量 _Dim subfdr作为文件夹’用于子文件夹的变量_首先,我们声明了此示例中需要的所有变量。

第一个变量当然是fso作为文件系统对象。两个变量fdr和subfdr属于文件夹类型。我们将使用fso对象创建文件类型对象,而不是直接创建。 fdrpath *是use变量,用于保存要获取其所有子文件夹的基本文件夹的路径。

2:初始化对象

fdrpath =“ D:\ Downloads” _ ‘声明文件夹 _Set fso =新FileSystemObject’创建fso对象 _Set fdr = fso.GetFolder(fdrpath)’创建给定文件夹的文件夹对象_在此步骤中,我们初始化了所有我们已经声明了subfdr除外。注意,我们已经使用fso对象的getFolder方法初始化了fdr文件变量。

FileSystemObject的GetFolder()方法将文件夹或目录的路径作为字符串,并返回文件类型对象。

3:循环获取文件夹对象

中的所有子文件夹名称_For fdr.SubFolders中的每个子fdr_ Debug.Print subfdr.Name _Next subfdr_在这里,我们为每个循环使用a来循环遍历fdr文件对象中的每个子文件夹。我们使用文件对象的SubFolders属性进行循环。

我们使用name属性来获取每个子文件夹的名称。完成了。

示例2:获取文件夹及其子文件夹中的所有文件路径要获取文件夹及其子文件夹中所有文件的所有路径或完全限定名称,我们需要在示例1代码中添加几行。

Sub LearnFso()

Dim fso As FileSystemObject

Dim fdr As Folder  ' Variable for the base folder

Dim subfdr As Folder ' Variable for the sub folders

Dim fdrpath As String 'to store path of base folder

Dim fl As File    'to store file object

fdrpath = "D:\downloads"

Set fso = New FileSystemObject

Set fdr = fso.GetFolder(fdrpath)

'loop to get all the sub folders name in

For Each subfdr In fdr.SubFolders

For Each fl In subfdr.Files 'to loop throgh each file

Debug.Print fl.Path 'getting file name

Next fl

Next subfdr

'to get the files of main folder

For Each fl In fdr.Files

Debug.Print fl.Path

Next fl

End Sub

Folder.Files()方法是在子文件夹中返回文件的方法。 File.Path()方法返回文件的完整地址。我们每个人都有一个内部循环来遍历主文件夹及其子文件夹中的所有文件。要获取主文件夹的文件,我们使用另一个循环。

示例3:将文件名保存在CSV文件中。

在前面的示例中,我们学习了如何在即时窗口上打印特定文件夹的文件路径。在此示例中,我们将学习如何将这些路径保存在CSV文件中。为此,我们只需要在代码中添加几行即可。请参阅下面的粗体代码行。

Sub LearnFso()

Dim fso As FileSystemObject

Dim fdr As Folder  ' Variable for the base folder

Dim subfdr As Folder ' Variable for the sub folders

Dim fdrpath As String 'to store path of base folder

Dim fl As File    'to store file object

Dim fileList As TextStream 'A textstream object

fdrpath = "D:\downloads"

Set fso = New FileSystemObject

Set fdr = fso.GetFolder(fdrpath)

Set fileList = fso.CreateTextFile(fdrpath & "\File List in This Folder.csv", True, False)

'loop to get all the sub folders name in

For Each subfdr In fdr.SubFolders

For Each fl In subfdr.Files 'to loop through each file

fileList.Write fl.Path & ","

Next fl

Next subfdr

'to get the files of main folder

For Each fl In fdr.Files

fileList.Write fl.Path & ","

Next fl

fileList.Close

End Sub

在这里,我们已经声明了一个名为

的FileStream类型的新对象。 === fileList

我们使用以下代码行使用文件流对象初始化文件列表变量。

设置fileList = fso.CreateTextFile(fdrpath和“ \ File List in this Folder.csv”,是,否),我们使用FSO的CreateTextFile方法创建FileStream对象。

它创建一个文本文件。此方法接受具有完整路径的文件名。第一个变量是这样做的。我们使用.csv扩展名创建一个csv文件。第二个变量用于允许覆盖。

第三个参数为False,以声明它不是二进制文件。在循环中,我们将debug.print替换为filelist.Write方法,以在创建的文件中写入每个文件路径。好的,这就是您可以使用FileSystemObject的方式。 FSO可以用于更多事情,我们将在以后的文章中进行讨论。如果您对此FSO相关查询的文章有任何疑问,请在下面的评论部分中问我。

相关文章:

Excel VBA UserForms入门 | *我将解释如何在excel中创建表单,如何使用VBA工具箱,如何处理用户输入,最后如何存储用户输入。我们将使用一个示例和逐步指南来介绍这些主题。

`link:/ general-topics-in-vba-vba-variables-in-excel [Excel中的VBA变量] || * VBA代表Visual Basic for Applications。

它是Microsoft的一种编程语言。它与Microsoft Office应用程序(例如MSExcel,MS-Word和MS-Access)一起使用,而VBA变量是特定的关键字。

Excel VBA变量范围 | *在所有编程语言中,我们都有变量访问说明符,用于定义可从何处访问已定义变量。 Excel VBA也不例外。 VBA也具有范围说明符。

ByRef和ByVal参数当参数作为ByRef参数传递给其他子函数时,将发送实际变量的引用。对变量副本所做的任何更改都将反映在原始参数中。

在Microsoft Excel中使用VBA删除无确认提示的工作表由于要使用VBA删除工作表,因此您知道自己在做什么。

您想告诉Excel不要显示此警告并删除该死的表。

在Microsoft Excel 2016中使用VBA添加和保存新工作簿] |在此代码中,我们首先创建了对工作簿对象的引用。然后,我们使用一个新的工作簿对象对其进行了初始化。这种方法的好处是您可以轻松地对此新工作簿进行操作。像保存,关闭,删除等一样,链接:/ menus-toolbars-status-bar-in-vba-在Microsoft Excel中使用vba-显示状态栏上的消息Excel VBA状态栏*]| excel中的状态栏可用作代码监视器。当您的VBA代码很长并且您使用VBA执行多项任务时,通常会禁用屏幕更新,以免看到屏幕闪烁。

`link:/ general-topics-in-vba-off-warning-messages-using-vba-in-microsoft-excel [在Microsoft Excel 2016中使用VBA关闭警告消息] | **此代码不仅禁用VBA警报,但也增加了代码的时间效率。让我们看看如何。

热门文章:

50 Excel快捷方式以提高生产率更快地完成任务。这50个快捷键将使您在Excel上的工作速度更快。

Excel中的VLOOKUP函数在Excel 2016中为COUNTIF使用此惊人的功能对条件进行计数。您无需过滤数据即可计算特定值。

Countif功能对于准备仪表板至关重要。

如何在Excel中使用SUMIF函数这是仪表板的另一个重要功能。这可以帮助您汇总特定条件下的值。