Vba 使用VBScript从100多万个csv文件中检索值

Vba 使用VBScript从100多万个csv文件中检索值,vba,csv,Vba,Csv,我需要复制多个文件的值(比如一百万个csv文件)并将其粘贴到主文件中 附件是代码片段:- Public Sub GetDataFromClosedBook() Dim Filename As String Dim wkb As Workbook Application.EnableEvents = False Application.ScreenUpdating = False Sheets("Meter-1").Visible = True Sheets("Meter-1").Select

我需要复制多个文件的值(比如一百万个csv文件)并将其粘贴到主文件中

附件是代码片段:-

Public Sub GetDataFromClosedBook()
Dim Filename As String
Dim wkb As Workbook

Application.EnableEvents = False
Application.ScreenUpdating = False
Sheets("Meter-1").Visible = True
Sheets("Meter-1").Select

mydata = "G:\BIS Dashboard(Finalised-13012016)\Files_Oct-21\"
Filename = Dir(mydata & "\AC PANEL-2_22_**************.csv", vbNormal)

Do Until Filename = ""
Workbooks.Open Filename:=mydata & Filename, ReadOnly:=True
For Each Sheet In ActiveWorkbook.Sheets
Sheets(1).Range("C8, E8").Copy ThisWorkbook.Sheets("Meter-  1").Range("A1048576").End(xlUp).Offset(1, 0)
Next Sheet
Workbooks(Filename).Close
Filename = Dir()
Loop

Sheets("Meter-1").Select
Sheets("Meter-1").Visible = True
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub  
如果csv文件少于1000个(比如说1000个csv文件),上面的代码运行得很好,并且可以检索值,但是无论我多么希望从所有文件中检索值

代码运行了一段时间,没有响应,最后excel在大约一个小时后崩溃


任何帮助都将不胜感激

首先,这毫无意义:

    For Each Sheet In ActiveWorkbook.Sheets
    Sheets(1).Range("C8, E8").Copy ThisWorkbook.Sheets("Meter-  1").Range("A1048576").End(xlUp).Offset(1, 0)
    Next Sheet
您的目标似乎在当前书籍的所有工作表上循环,但是通过说
sheets(1)。
它总是在第一个工作表上循环,因此您将得到重复的值。请填写
表格。

然后,如果你真的有一百万个文件要处理,你应该彻底改变你的方法来限制在任何时候使用的内存

一些提示:

  • 不要在Excel中托管脚本。似乎您现在正在从Excel VBA执行此操作。在独立VBscript中移动此项。要使用Excel对象而不是
    应用程序,您必须稍微重写代码。
    ,就像这样
    设置objExcel=CreateObject(“Excel.Application”)

  • 甚至不要尝试将结果写入Excel文件,总有一天你的内存会耗尽。使用文件系统对象akaFSO将其写入一个简单的文本文件中。 之后,您将从文本文件将结果导入Excel

  • 在循环中,您应该确保内存垃圾始终被清除。您应该实例化工作簿对象,并在复制完成后将其杀死。第一个循环步骤应该类似于
    Set objWorkbook=objExcel.Workbooks.Open(mydata和Filename)
    ,当您的复制工作完成后,在循环到下一个步骤之前,执行
    Set objWorkbook=Nothing
  • 所有这些都不能保证你会达到你想要的,但会增加很多机会

    我在火车上用我的电话,很抱歉,但我不能提供更多的细节和格式更好


    祝你好运,一百万?天哪!我不确定Excel或VBA或任何类似性质的东西是否能处理这项任务。您可以使用SQL server执行此作业吗?文件名中一定有某种模式…我当然希望如此。。。试试SQL server express,您可以使用下面的链接免费获得它

    Do Until Filename = ""
    On Error Resume Next
    Set wkb = Workbooks.Open(mydata & Filename)
    wkb.Sheets.Range("C8, E8").Copy ThisWorkbook.Sheets("Meter-1").Range("A1048576").End(xlUp).Offset(1, 0)
    wkb.Close False
    Filename = Dir()
    Loop
    

    然后,使用您可以使用的任何模式循环浏览CSV文件。在下面的脚本中,我每天都在更改日期。这只是一个例子。我肯定你没有1000000次约会,除非你是在测量恐龙行走时的数据。只需更改脚本以满足您的需要

    DECLARE @intFlag INT
    SET @intFlag = 1
    WHILE (@intFlag <=10000)
    BEGIN
    
    PRINT @intFlag
    
    
    declare @fullpath1 varchar(1000)
    select @fullpath1 = '''\\FTP\your_path' + convert(varchar, getdate()- @intFlag , 112) + '_your_file.txt'''
    declare @cmd1 nvarchar(1000)
    select @cmd1 = 'bulk insert [dbo].[your_table] from ' + @fullpath1 + ' with (FIELDTERMINATOR = ''\t'', FIRSTROW = 2, ROWTERMINATOR=''0x0a'')'
    exec (@cmd1)
    
    
    SET @intFlag = @intFlag + 1
    
    END
    GO
    
    DECLARE@intFlag INT
    设置@intFlag=1
    
    虽然(@intFlag试图通过自动化来实现这一点会带来麻烦,而且开销太大。它会循环所有工作表,但只使用工作表1,是否只有一张工作表,不需要循环,如果有多张工作表,则只使用工作表(1),没有任何东西使用工作表。您也可以查看ADO,使用它,但不说这肯定会解决问题,但值得一试……每个*.cvs需要复制多少行?每个*.cvs文件到底有多少*.cvs文件?每个csv文件中只有一个工作表。我只想从包含一个工作表的每个工作簿中复制两个单元格值。@SusiloT谢谢你的建议。是的,csv文件中只有一张工作表,我会根据你的建议进行更改。@Nathan_抱歉,代码中有一个小的编辑,我正在重新发布代码。@Thomas G谢谢你的建议,我会处理它,我会很快发布结果soon@ThomasG