我非常感谢您花时间阅读我的消息,并且我了解堆栈溢出的目的更多是针对失败的代码,但是我是新手,想获得一些提示 VBA 问题:在使用文件搜索对象(相对于使用目录功能)时,我看到过类似的问题询问有关长时间运行的问题。就我而言,我的运行时间超过 3 小时,因为我试图遍历每个子文件夹中的 1000 个子文件夹和 100 个文件。我不确定如何将在线阅读的答案应用于我正在使用的特定代码,因为我必须遍历文件夹的不同子文件夹。问题已编辑:我想降低宏的运行时间。我认为这里的问题是 FSO 正在遍历许多不符合条件(文件名和日期)的子文件夹和文件。如何减少运行时间以避免宏遍历所有这些文件夹和文件?代码用途:从 2019 年 1 月 1 日至 1 月 1 日期间的所有子文件夹中的所有“结果”文件中复制/粘贴两列,2020 到活动工作簿。非常感谢你的帮助,
请看下面我的代码:
Sub LoopAllSubFolders(FSOFolder As Object)
Dim R0 As Range, R1 As Range, R2 As Range, R3 As Range, R4 As Range, RN0 As Range, RN1 As Range, R5 As Range, RN2 As Range, RN3 As Range
Dim FSOSubFolder As Object
Dim FSOFile As Object
Dim FSOFilepath As String
Dim wb As Workbook
Dim sspec As String
Dim DateY As Date
Dim DateW As Date
'For each subfolder, macro is called'
For Each FSOSubFolder In FSOFolder.SubFolders
DateY = DateSerial(2019, 1, 1)
DateW = DateSerial(2020, 1, 1)
If FSOSubFolder.DateLastModified > DateY Then
If FSOSubFolder.DateLastModified < DateW Then
LoopAllSubFolders FSOSubFolder
End If
End If
Next
For Each FSOFile In FSOFolder.Files
sspec = "Results"
Application.ScreenUpdating = False
Application.DisplayAlerts = False
FSOFilepath = FSOFile.Path
If Right(FSOFilepath, 3) = "csv" Then
If InStr(FSOFilepath, sspec) > 0 Then
If FSOFile.DateLastModified > DateY Then
If FSOSFile.DateLastModified < DateW Then
Set wb = Workbooks.Open(FSOFile.Path)
Set R0 = wb.Sheets(1).Cells(2, 1)
Set R1 = R0.End(xlDown)
Set R2 = Range(R0, R1)
Set R3 = wb.Sheets(1).Cells(2, 2)
Set R4 = R3.End(xlDown)
Set R5 = Range(R3, R4)
Set RN0 = ThisWorkbook.Sheets(1).Cells(1, 1)
Set RN1 = RN0.End(xlDown)
Set RN2 = ThisWorkbook.Sheets(1).Cells(1, 2)
Set RN3 = RN2.End(xlDown)
wb.Sheets(1).Activate
R2.Select
Selection.Copy
ThisWorkbook.Activate
RN0.Select
RN1.Offset(1, 0).Select
ActiveSheet.Paste
wb.Sheets(1).Activate
R5.Select
Selection.Copy
ThisWorkbook.Activate
RN3.Offset(1, 0).Select
ActiveSheet.Paste
wb.Close
Application.CutCopyMode = False
End If
End If
End If
End If
Next FSOFile
ThisWorkbook.Activate
ThisWorkbook.Save
End Sub
Sub loopAllSubFolderSelectStartDirectory()
Dim FSOLibrary As Object
Dim FSOFolder As Object
Dim folderName As String
Dim fileName As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
ThisWorkbook.Activate
Range("A1").Value = "ID"
Range("A2").Value = "ID"
Range("B1").Value = "Value"
Range("B2").Value = "Value"
'Set the folder name to a variable
folderName = "\\pah1\path2\"
'Set the reference to the FSO Library
Set FSOLibrary = CreateObject("Scripting.FileSystemObject")
'Another Macro call LoopAllSubFolders Macro to start
LoopAllSubFolders FSOLibrary.GetFolder(folderName)
Application.ScreenUpdating = True
ThisWorkbook.Activate
Rows(2).EntireRow.Delete
End Sub