VBA - 使用日期搜索条件循环遍历网络位置上的多个子文件夹/提高搜索速度
VBA - Loop through multiple subfolders on a network location with date search criteria/ Improve search speed
我的问题和 VBA 代码的目的:
从网络目录中的每个 "table.csv" 文件中获取特定数据(几列)。每个 networkdirectory/subfolders01/subfolders02 包含一个 "table.csv" 文件,但每个 network/subfolders01 包含 100 个其他子文件夹。不需要其他文件夹,我们唯一感兴趣的是每个 subfolder01 的 subfolder02。网络目录中的subfolders01数量约为15000个。但是我只需要从2020年1月到2020年4月的subfolders01,例如(200个子文件夹)。
最终目的是趋势数据。
问题:
我试图了解如何改进我当前使用的 VBA 代码。
此代码逐一检查每个子文件夹,然后检查日期和文件名。
我想知道是否有办法为子文件夹日期和名称添加任何搜索过滤器标准以实现更快的循环。
我们如何避免代码遍历每个子文件夹?
请看下面我使用的代码,
非常感谢您抽出时间,希望我的要求很明确。
'''
Function GetFiles(startPath As String) As Collection
Dim fso As Object, rv As New Collection, colFolders As New Collection, fpath As String
Dim subFolder As Object, f, dMinfold, dtMod
Set fso = CreateObject("Scripting.FileSystemObject")
dMinfold = ThisWorkbook.Sheets("Enter_Date").Cells(2, 1)
colFolders.Add startPath
Do While colFolders.Count > 0
fpath = colFolders(1)
colFolders.Remove 1
'process subfolders
For Each subFolder In fso.getfolder(fpath).subfolders
If subFolder.DateLastModified >= dMinfold Then
colFolders.Add subFolder.Path
End If
Next subFolder
'process files
f = Dir(fso.buildpath(fpath, "*Table.csv"), vbNormal)
Do While f <> ""
f = fso.buildpath(fpath, f)
dtMod = FileDateTime(f)
If dtMod >= dMinfold And Right(f, 3) = "csv" Then
rv.Add f
End If
f = Dir()
Loop
Loop
Set GetFiles = rv
End Function'''
然后我有了从每个文件获取传输数据的代码。
谢谢。
我将放入屏幕截图以阐明 Get & Transform 方法,因为它是 GUI 方法而不是代码。
可以在加载内容之前进行过滤,这将大大加快速度。
我尝试将几千个子文件夹过滤到 20 个,立即加载。
这是从文件夹中获取数据的初始屏幕
然后您可以过滤路径。在您的情况下,它将基于文件夹名称中的日期。
现在它已被过滤,您可以使用页眉按钮展开内容。
内部内容,您必须再次展开才能从 csv 转换为 excel table
根据需要 Choose/rename 列,然后点击 "close and load" 将其放入 excel。
默认为新 table,但如果需要更多自定义内容,您可以 "load to"。
这是你的输出。您可以根据需要右键刷新或从vba刷新。
编辑 - 刚注意到我对文件使用了 .txt 而不是 .csv。可能会改变中间一两步的样子,但总体思路是一样的。
我的问题和 VBA 代码的目的: 从网络目录中的每个 "table.csv" 文件中获取特定数据(几列)。每个 networkdirectory/subfolders01/subfolders02 包含一个 "table.csv" 文件,但每个 network/subfolders01 包含 100 个其他子文件夹。不需要其他文件夹,我们唯一感兴趣的是每个 subfolder01 的 subfolder02。网络目录中的subfolders01数量约为15000个。但是我只需要从2020年1月到2020年4月的subfolders01,例如(200个子文件夹)。 最终目的是趋势数据。
问题: 我试图了解如何改进我当前使用的 VBA 代码。 此代码逐一检查每个子文件夹,然后检查日期和文件名。 我想知道是否有办法为子文件夹日期和名称添加任何搜索过滤器标准以实现更快的循环。 我们如何避免代码遍历每个子文件夹?
请看下面我使用的代码, 非常感谢您抽出时间,希望我的要求很明确。
'''
Function GetFiles(startPath As String) As Collection
Dim fso As Object, rv As New Collection, colFolders As New Collection, fpath As String
Dim subFolder As Object, f, dMinfold, dtMod
Set fso = CreateObject("Scripting.FileSystemObject")
dMinfold = ThisWorkbook.Sheets("Enter_Date").Cells(2, 1)
colFolders.Add startPath
Do While colFolders.Count > 0
fpath = colFolders(1)
colFolders.Remove 1
'process subfolders
For Each subFolder In fso.getfolder(fpath).subfolders
If subFolder.DateLastModified >= dMinfold Then
colFolders.Add subFolder.Path
End If
Next subFolder
'process files
f = Dir(fso.buildpath(fpath, "*Table.csv"), vbNormal)
Do While f <> ""
f = fso.buildpath(fpath, f)
dtMod = FileDateTime(f)
If dtMod >= dMinfold And Right(f, 3) = "csv" Then
rv.Add f
End If
f = Dir()
Loop
Loop
Set GetFiles = rv
End Function'''
然后我有了从每个文件获取传输数据的代码。 谢谢。
我将放入屏幕截图以阐明 Get & Transform 方法,因为它是 GUI 方法而不是代码。
可以在加载内容之前进行过滤,这将大大加快速度。 我尝试将几千个子文件夹过滤到 20 个,立即加载。
这是从文件夹中获取数据的初始屏幕
然后您可以过滤路径。在您的情况下,它将基于文件夹名称中的日期。
现在它已被过滤,您可以使用页眉按钮展开内容。
内部内容,您必须再次展开才能从 csv 转换为 excel table
Choose/rename 列,然后点击 "close and load" 将其放入 excel。
默认为新 table,但如果需要更多自定义内容,您可以 "load to"。
这是你的输出。您可以根据需要右键刷新或从vba刷新。
编辑 - 刚注意到我对文件使用了 .txt 而不是 .csv。可能会改变中间一两步的样子,但总体思路是一样的。