VBA之Excel应用第三章第五节:循环提取某目录下的所有文件

《VBA之Excel应用》(版权10178983)是非常经典的,是我推出的第七套教程,定位于初级,目前是第一版修订。这套教程从简单的录制宏开始讲解,一直到窗体的搭建,内容丰富,实例众多。大家可以非常容易的掌握相关的知识,这套教程共三册,十七章,都是我们在利用EXCEL工作过程中需要掌握的知识点,希望大家能掌握利用。今日讲解的内容是:VBA之Excel应用第三章第五节:循环提取某目录下的所有文件

【分享成果,随喜正能量】去找一个像太阳一样的人,帮你晒晒,所有不值一提的迷茫。。

第三章 工作簿(Workbook)和工作表(Worksheet)对象(Object)

大家好,我们今日开始讲解工作簿(Workbook)和工作表(Worksheet)对象(Object),我们经常讲的面向对象编程,这里的工作表和工作簿就是所谓的对象。对象是一个名词,每个对象有着自己的属性和方法。这些属性和方法就是我们要利用的工具。这个章节中我们将讲解到对象的层次结构、集合、属性和方法,同时还会讲解到工作簿的打开和关闭以及工作表的循环处理。由于这套教程是针对EXCEL而写的,所以这章内容非常重要。

第五节 循环提取某目录下的所有文件

大家好,在上一讲中,我们讲了如何提取已经打开工作薄的名称和工作簿所有工作表的名称,那么如何提取某个目录文件夹下面的所有文件并同时提取文件的所有工作表名称呢(这讲我们单就EXCEL文件进行提取)?在这讲中,我们将学习到Dir函数及Do While循环,并再次展示给大家对象的层次结构。

1 循环提取某目录下的所有文件的实用场景分析

在当前路径下有个“提取文件”的文件夹,其下有若干个文件,如下图:

我们要提取出其中的EXCEL文件,并将每个文件的名称及每个文件的所有工作表名称提取出来回填到当前的工作表中。

2 提取文件夹中文件的VBA代码思路分析

为了提取文件夹中的Excel文件及每个文件的工作表名称,我们要在文件夹中建立一个循环,在循环中取得每个文件的文件名,然后打开这个文件,最后利用上节的方法得到文件的工作表名称。

上述信息得到后,可以将信息回填给工作表。

这里要求提取到的是Excel类型的文件,所以我们在提取文件的时候要注意文件类型,同时为了提高程序的运行效率,我们可以关闭电脑的屏幕刷新功能。下面我们将逐步讲解上述思路的实现过程。

3 Dir 函数的讲解

我们先来看看一个函数:Dir 函数,这个函数返回一个 String,它表示与指定模式或文件属性或驱动器的卷标匹配的文件、目录或文件夹的名称。

语法:

Dir [ (pathname, [ attributes ] ) ]

参数:

1)pathname可选。 指定文件名的字符串表达式,可包括目录或文件夹和驱动器。 如果未找到 pathname,则返回零长度字符串 ("")。

2)attributes可选。 其和指定文件属性的常量或数值表达式。 如果省略它,则返回与 pathname 匹配但没有属性的文件。

attributes 参数设置为:

常量 值 说明

vbNormal0(默认)指定没有属性的文件。

vbReadOnly1指定只读文件以及不带属性的文件。

vbHidden 2指定隐藏文件以及不带属性的文件。

vbSystem 4指定系统文件以及不带属性的文件。 在 Macintosh 上不可用。

vbVolume8指定卷标;如果指定任何其他属性,则忽略 vbVolume。 在 Macintosh 上不可用。

vbDirectory16指定目录或文件夹以及不带属性的文件。

vbAlias 64指定文件名为别名。 仅在 Macintosh 上可用。

  • 在 Microsoft Windows 中,Dir 支持使用多字符 (*) 和单字符 (?) 通配符来指定多个文件。在 Macintosh 上,这些字符被视为有效文件名称字符,且不能用作指定多个文件的通配符。因为 Macintosh 不支持通配符,请使用文件类型来标识文件组。可以使用 MacID 函数指定文件类型而不是使用文件名。
  • 必须在首次调用 Dir 函数时指定 pathname,否则将发生错误。 如果还指定文件属性,则必须包括 pathname。
  • Dir 返回与 pathname 匹配的第一个文件名。 若要获取与 pathname 匹配的任何其他文件名,请重新调用 Dir 而不使用参数。 当不再有匹配的文件名时,Dir 将返回零长度字符串 ("")。 在返回零长度字符串后,必须在后续调用中指定 pathname,否则将发生错误。
  • 可以更改为新的 pathname,而无需检索与当前 pathname 匹配的所有文件名。 但是,不能以递归方式调用 Dir 函数。 调用带 vbDirectory 属性的 Dir 不会连续返回子目录。
  • 在 Excel for Mac 2016 中,初始 Dir 函数调用将成功。 但是,对指定目录进行迭代的后续调用将导致错误。很遗憾,这是一个已知 bug。

4 DO WHILE 循环讲解

我们来详细看看在VBA中利用的第二种循环语句DO WHILE 循环:

1)语法:

Do { While | Until } condition

[ statements ]

[ Continue Do ]

[ statements ]

[ Exit Do ]

[ statements ]

Loop

或者

Do

[ statements ]

[ Continue Do ]

[ statements ]

[ Exit Do ]

[ statements ]

Loop { While | Until } condition

2)参数说明:

① Do 必需。 开始循环的定义 Do 。

② While 必选项(除非使用了Until)。 重复循环,直到 condition 为False。

③ Until必选项(除非使用了 While)。 重复循环,直到 condition 为True。

④ condition可选。 Boolean 表达式。 如果 condition 为 Nothing ,则 Visual Basic 将其视为 False 。

⑤ statements可选。 一个或多个重复的语句,或在之前重复 condition True 。

⑥ Continue Do可选。 将控制转移到循环的下一次迭代 Do 。

⑦ Exit Do可选。 将控制转移到 Do 循环外。

⑧ Loop必需。 终止循环的定义 Do 。

使用说明:

3)Do...Loop 如果希望在满足条件之前重复执行一组语句,请使用此结构。如果要在判断条件之后将一组语句重复执行一定次数,则可以使用 While 或 Until 来指定 condition ,但不能同时使用两者。condition 只能在循环的开头或结尾测试一次。

4) Do...Loop 结构和do While 语句的区别在于condition 在循环的开头或结尾进行测试。

5)Exit Do语句可以提供退出 Do…Loop的替代方法。Exit Do 将控制代码立即传输到Loop

语句后面的语句。

6)Exit Do 通常在计算某些条件后(例如在结构中)使用 If...Then...Else。如果检测到可能导致不必要或无法继续迭代的条件(如错误值或终止请求),则可能需要退出循环。Exit Do的另一种用途是测试可能导致无限循环的情况,这是一个可运行很大甚至无限次数的循环。这时可以使用Exit Do 来转义循环。

7)可以在程序中的任意位置使用任意数量的 Exit Do 语句,在嵌套循环内使用时Exit Do 将控制转移出最内层循环,并将其转移到下一个更高的嵌套级别。

5 实现提取文件夹中文件的代码及代码运行效果

有了上面的知识点讲解,我们来看下面的代码:

Sub mynzJ() '循环提取某目录下的所有文件

Dim directory As String, myfileName As String, mysheet As Worksheet

Application.ScreenUpdating = False '关闭屏幕更新

directory = ThisWorkbook.Path & "\提取文件\"

myfileName = Dir(directory & "*.xl??") '使用Dir函数来查找存储在此目录中的第一个文件*.xl??,变量fileName现在保存在目录中找到的第一个Excel文件的名称

Do While myfileName <> ""

i = i + 1

j = 2

Cells(i, 1) = myfileName '提取文件名

Workbooks.Open (directory & myfileName) '从关闭的Excel文件中提取数据(或工作表名称)没有简单的方法。因此,我们打开Excel文件

For Each mysheet In Workbooks(myfileName).Worksheets '将Excel文件的所有工作表名称添加到第i行的其他列中。

ThisWorkbook.Worksheets(7).Cells(i, j).Value = mysheet.Name

j = j + 1

Next

Workbooks(myfileName).Close '关闭Excel文件。

myfileName = Dir() 'Dir函数是一个特殊函数。要获取其他Excel文件,您可以再次使用Dir函数而不带参数。

Loop

Application.ScreenUpdating = True '再次启用屏幕更新

End Sub

代码截图:

代码的讲解:

1)这讲的代码和上一讲的代码思路类似,只是多了一个DIR函数的文件名提取。

2)为了提取到EXCEL文件我们利用了Dir(directory & "*.xl??")的格式,写法要注意,如果不需要值提取EXCEL文件,我们就可以直接用Dir(directory & "*.*")即可。

下面看一个代码的执行效果:

这样就完全提取出来了文件夹中的excel文件。

今日内容回向:

1) Dir函数的意义是什么?

2) 如何利用dir函数提取指定的类型文件?

3) do循环的格式是怎样的,意义是什么?

4) 如何提取文件夹中的EXCEL文件的文件名及工作表名称并回填给工作表?

我20多年的VBA成果全在下面的资料中: