VBA汇总统一文件夹下的多个表格的数据?

VBA汇总统一文件夹下的多个表格的数据?,第1张

大家好,今天继续讲解《VBA数据库解决方案》,今日讲解的是第37讲,利用ADO,实现同一文件夹下多个EXCEL工作表的数据汇总。最近的内容实用性比较强,如今日的内容,只把需要汇总的EXCEL文件放在同一个文件夹下,而且格式一致,那么利用ADO汇总这几个文件的数据是非常快的,这讲的内容和第32讲的内容是类似的,不过第32讲的内容是要事先知道文件的名称,然后建立一个数组来分别对应每个文件,通过循环来实现从每个文件中提取数据的目的,本讲的内容是事先不知道每个文件的名称。

实例:在一个文件夹下有若干个文件,如下图:

我们现在,需要把上面的文件夹中除了“VBA与数据库 *** 作”之外的各个文件的内容一次性汇总出来,这个VBA程序该如何写呢?代码如下:

Sub mynzexcels_6()

'第37讲,利用ADO,实现同一文件夹下EXCEL工作表数据的汇总

Dim cnADO As Object

Dim strPath, strTable, strSQL, Z As String

Set cnADO = CreateObject("ADODB.Connection")

Range("a:g").ClearContents

Range("a1:e1") = Array("日期", "型号", "批号", "出库数量", "库存数量")

Z = Dir(ThisWorkbook.Path &"\*.*")

strPath = ThisWorkbook.Path &"\" &Z

strTable = "[sheet1$A2:h65536]"

'建立连接,提取数据

x = 2

Do While Z <>""

If Z <>"VBA与数据库 *** 作.xlsm" Then

cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0extended properties='excel 8.0hdr=noimex=1'data source=" &strPath

strSQL = "select F1,F2,F3,F4,F5 from " &strTable

Range("A" &x).CopyFromRecordset cnADO.Execute(strSQL)

x = Range("b65536").End(xlUp).Row

cnADO.Close

End If

Z = Dir

Loop

Set cnADO = Nothing

End Sub

代码截图:

代码讲解:

1 Z = Dir(ThisWorkbook.Path &"\*.*") 其中DIR函数用来指定文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。如果没有找到 pathname,则会返回零长度字符串 ("")。

2 strPath = ThisWorkbook.Path &"\" &Z

strTable = "[sheet1$A2:h65536]"

上述代码分别给出了文件的路径名称和数据表的范围,数据的范围是sheet1工作表除去表头后的全部$A2:h65536.

3 strSQL = "select F1,F2,F3,F4,F5 from " &strTable

Range("A" &x).CopyFromRecordset cnADO.Execute(strSQL)

建立连接后把需要的数据拷贝出来,需要的数据是第1列,第2列,第3列,第4列 ,第5列

4 x = Range("b65536").End(xlUp).Row 下次复制的位置确定.

5 Z = Dir

特别注意:第一次调用 Dir 函数时,必须指定 pathname,否则会产生错误。如果也指定了文件属性,那么就必须包括 pathname。Dir 会返回匹配 pathname 的第一个文件名。若想得到其它匹配 pathname 的文件名,再一次调用 Dir,且不要使用参数。如果已没有合乎条件的文件,则 Dir 会返回一个零长度字符串 ("")。一旦返回值为零长度字符串,并要再次调用 Dir 时,就必须指定 pathname,否则会产生错误。不必访问到所有匹配当前 pathname 的文件名,就可以改变到一个新的 pathname 上。但是,不能以递归方式来调用 Dir 函数。以 vbDirectory 属性来调用 Dir 不能连续地返回子目录。由于文件名并不会以特别的次序来返回,所以可以将文件名存储在一个数组中,然后再对这个数组排序。

上述的Z=dir 就是实现的下一个文件名的调用。

下面看运行的结果:

点击“ADO实现同文件夹下所有文件数据汇总”按钮:

汇总后再A到E列给出了数据的汇总:

今日内容回向:

1 在不知道文件名和文件个数的前提下,如何汇总文件?

2 DIR函数的意义是否理解?

【引用位置】 https://blog.csdn.net/pashine/article/details/42100237

'-------------------------------------------

'获取某文件夹下的所有Excel文件

'-------------------------------------------

Sub getExcelFile(sFolderPath As String)

On Error Resume Next

Dim f As String

Dim file() As String

Dim x

k = 1

ReDim file(1)

file(1) = sFolderPath &""

End Sub

'-------------------------------------------

'获取某文件夹下的所有文件和子目录下的文件

'-------------------------------------------

Sub getAllFile(sFolderPath As String)

'Columns(1).Delete

On Error Resume Next

Dim f As String

Dim file() As String

Dim i, k, x

x = 1

i = 1

k = 1

ReDim file(1 To i)

file(1) = sFolderPath &""

'-- 获得所有子目录

Do Until i >k

f = Dir(file(i), vbDirectory)

Do Until f = ""

If InStr(f, ".") = 0 Then

k = k + 1

ReDim Preserve file(1 To k)

file(k) = file(i) &f &""

End If

f = Dir

Loop

i = i + 1

Loop

'-- 获得所有子目录下的所有文件

For i = 1 To k

f = Dir(file(i) &" . ")'通配符 . 表示所有文件,*.xlsx Excel文件

Do Until f = ""

'Range("a" &x) = f

Range("a" &x).Hyperlinks.Add Anchor:=Range("a" &x), Address:=file(i) &f, TextToDisplay:=f

x = x + 1

f = Dir

Loop

Next

End Sub


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12104540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存