我有100多个.xlsx文件,每个文件都有两个表格。第一个表格(始终称为sts)通常有15-20万行,其中有一个名为“ Code”的列。第二个表格(始终称为cps)大约有85k行,也有相同的Code列。
我需要从表格sts中提取特定代码的所有行,放入一个表格/工作表中,并从表格cps中提取特定代码的所有行,放入第二个表格/工作表中。我需要对所有文件执行此操作。
我尝试了两种方法:
1)使用Excel VBA打开每个文件,使用自动筛选器将所需的代码行复制到主工作簿进行汇总。使用以下代码从预定义的起始目录获取文件并进一步搜索:
打开每个工作簿需要花费5-10秒的时间,整个过程非常缓慢(而且目前还存在错误)。
2) 将所有内容导入两个Access表中,然后仅保留我想要的代码行。由于行数较多,这种方法比Excel更慢。
我需要从表格sts中提取特定代码的所有行,放入一个表格/工作表中,并从表格cps中提取特定代码的所有行,放入第二个表格/工作表中。我需要对所有文件执行此操作。
我尝试了两种方法:
1)使用Excel VBA打开每个文件,使用自动筛选器将所需的代码行复制到主工作簿进行汇总。使用以下代码从预定义的起始目录获取文件并进一步搜索:
Public Sub SearchFiles()
。Public Sub SearchFiles()
'Macro to start the file extraction by drilling down from the mydir path specified
Dim code As String
Dim time1 As Double
Dim time2 As Double
Range("a1").Value = InputBox("Please type code to extract", code)
time1 = Timer
myFileSearch _
myDir:="C:\Data\Dashboard\2014\New Files Excel Loop", _
FileNameLike:="Reporting", _
FileTypeLike:=".xlsx", _
SearchSubFol:=True, _
myCounter:=0
time2 = Timer
MsgBox time2 - time1 & "seconds"
End Sub
Private Sub myFileSearch(myDir As String, FileNameLike As String, FileTypeLike As String, _
SearchSubFol As Boolean, myCounter As Long)
Dim fso As Object, myFolder As Object, myFile As Object
Dim Rowcount As Long
Dim rowcount2 As Long
Dim masterbook As Workbook
Set masterbook = ThisWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
Dim commodity As String
code = Range("a1").Value
Application.ScreenUpdating = False
For Each myFile In fso.GetFolder(myDir).Files
Workbooks.Open (myDir & "\" & myFile.Name)
myCounter = myCounter + 1
ReDim Preserve myList(1 To myCounter)
myList(myCounter) = myDir & "\" & myFile.Name
''loop to pull out all code rows in your directories into new file
Workbooks(Workbooks.Count).Worksheets(1).Range("d2").Activate
Rowcount = Workbooks(1).Sheets(1).Range("a1").CurrentRegion.Rows.Count + 1
Rows(1).AutoFilter
Range("A1").AutoFilter Field:=3, Criteria1:=code, Operator:=xlAnd
Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _
Destination:=Workbooks(1).Sheets(1).Range("a" & Rowcount)
'filter out the code data
Workbooks(Workbooks.Count).Worksheets(2).Activate
Range("d2").Activate
rowcount2 = Workbooks(1).Sheets(2).Range("a1").CurrentRegion.Rows.Count + 1
Rows(1).AutoFilter
Range("A1").AutoFilter Field:=6, Criteria1:=code, Operator:=xlAnd
Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _
Destination:=Workbooks(1).Sheets(2).Range("a" & Rowcount)
Workbooks(myFile.Name).Close savechanges:=False
Next
If SearchSubFol Then
For Each myFolder In fso.GetFolder(myDir).SubFolders
myFileSearch myDir & "\" & myFolder.Name, FileNameLike, FileTypeLike, True, myCounter
Next
End If
End Sub
打开每个工作簿需要花费5-10秒的时间,整个过程非常缓慢(而且目前还存在错误)。
2) 将所有内容导入两个Access表中,然后仅保留我想要的代码行。由于行数较多,这种方法比Excel更慢。
Sub pulloop()
DoCmd.RunSQL "delete * from sts"
DoCmd.RunSQL "delete * from cps"
strSql = "PathMap"
Set rs = CurrentDb.OpenRecordset(strSql)
With rs
If Not .BOF And Not .EOF Then
.MoveLast
.MoveFirst
While (Not .EOF)
importfile = rs.Fields("Path")
DoCmd.TransferSpreadsheet acimport, acSpreadsheetTypeExcel12, "Sts", importfile, True, "Sts!A:G"
DoCmd.TransferSpreadsheet acimport, acSpreadsheetTypeExcel12, "CPs", importfile, True, "CPs!A:Q"
'Debug.Print rs.Fields("Path")
.MoveNext
Wend
End If
.Close
End With
End Sub
我尝试使用AcLink进行适应,但在实现过程中遇到了困难。是否可能在Access导入文件时使用aclink而不是acimport来查询所需的代码行,并且这样做可能会更快速?
xlsx
文件保存为csv
文件,并使用PowerShell(学习起来不太难)来操作csv
文件,这样针对可重复任务会有所改善。 - brettdj