我需要复制多个文件中的值(比如一百万个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在大约一小时后崩溃。
任何帮助都将非常感谢!!!
答案 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.
。
然后,如果你真的要处理一百万个文件,你应该从根本上改变你的方法来限制所用的内存。
一些提示:
不要在Excel中托管您的脚本。您现在似乎是从Excel VBA执行此操作。在独立的VBscript中移动它。您必须重新编写代码以使用Excel对象而不是Application.
,例如Set objExcel = CreateObject("Excel.Application")
甚至不尝试在Excel文件中写入结果,在某些时候你会失去记忆。使用文件系统对象又名 FSO 将其写入简单的文本文件中。 之后,您将从文本文件中将结果导回到Excel中。
Set objWorkbook = objExcel.Workbooks.Open(mydata & Filename)
,当你的副本完成后,在循环到下一个循环之前,执行Set objWorkbook = Nothing
这一切都不能保证你能达到你想要的效果,但会增加你的机会
我在火车上打电话,很抱歉,但我无法提供更多细节和格式。
祝你好运答案 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