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

时间:2016-03-17 07:05:30

标签: vba csv

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

附件是代码段: -

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 csv文件),上面的代码运行完美并检索值,但我想如何从所有文件中检索值。

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

任何帮助都将非常感谢!!!

3 个答案:

答案 0 :(得分:0)

首先,这没有任何意义:

    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).它总是占用第一张工作表,因此您最终会得到重复值。请改为Sheet.

然后,如果你真的要处理一百万个文件,你应该从根本上改变你的方法来限制所用的内存。

一些提示:

  1. 不要在Excel中托管您的脚本。您现在似乎是从Excel VBA执行此操作。在独立的VBscript中移动它。您必须重新编写代码以使用Excel对象而不是Application.,例如Set objExcel = CreateObject("Excel.Application")

  2. 甚至不尝试在Excel文件中写入结果,在某些时候你会失去记忆。使用文件系统对象又名 FSO 将其写入简单的文本文件中。 之后,您将从文本文件中将结果导回到Excel中。

    1. 在你的循环中,你应该确保始终清理内存垃圾。您应该实例化一个工作簿对象并在复制完成后将其终止。第一个循环步骤应该类似Set objWorkbook = objExcel.Workbooks.Open(mydata & Filename),当你的副本完成后,在循环到下一个循环之前,执行Set objWorkbook = Nothing
  3. 这一切都不能保证你能达到你想要的效果,但会增加你的机会

    我在火车上打电话,很抱歉,但我无法提供更多细节和格式。

    祝你好运

答案 1 :(得分:0)

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

答案 2 :(得分:0)

1,000,000?哇靠!我不确定Excel或VBA或那种性质的任何东西都能处理这项任务。你可以使用SQL服务器完成这项工作吗?文件名中必须有一个模式...我当然希望如此...尝试SQL server express,你可以使用下面的链接免费获得。

https://www.microsoft.com/en-us/download/details.aspx?id=42299

然后,使用您可以使用的任何模式遍历CSV文件。在下面的脚本中,我正在改变日期,一次一天。这只是一个例子。我确定你没有1,000,000个日期,除非你是在测量恐龙走动时的东西。只需更改脚本以满足您的需求。

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