【发布时间】:2012-07-12 07:20:40
【问题描述】:
我正在 VBA 中创建一组 csv 文件。
我的脚本正在创建我需要的数据集,但循环的多次迭代中的行数不同。例如,对于 i=2,我有 100,000 行,但对于 i=3,我有 22,000 行。问题是当 Excel 保存这些单独的 csv 文件时,它不会在末尾截断空间。这会在文件末尾留下 78,000 个空白行,这是一个问题,因为我需要生成大约 2,000 个文件,每个文件都有几兆字节大。 (我在 SQL 中有一些我需要的数据,但无法在 SQL 本身中进行数学运算。长话短说。)
此问题通常在手动保存时发生 - 您需要在删除行后关闭文件,然后重新打开,在这种情况下这不是一个选项,因为它在 VBA 中自动发生。使用另一种语言的脚本保存后删除空白行并不是一个真正的选择,因为我实际上需要输出文件以适合可用的驱动器,而且它们现在不必要地巨大。
我试过Sheets(1).Range("A2:F1000001").ClearContents,但这不会截断任何内容。在保存之前删除行应该同样没有效果,因为 Excel 将所有行保存到文件末尾,因为它存储了操作的最右下角的单元格。有没有办法让excel只保存我需要的行?
这是我用来保存的代码:(截断发生在前面,在调用这个的路由中)
Sub SaveCSV()
'Save the file as a CSV...
Dim OutputFile As Variant
Dim FilePath As Variant
OutputPath = ActiveWorkbook.Worksheets("Macro").Range("B2").Value
OutputFile = OutputPath & ActiveWorkbook.Worksheets("Macro").Range("B1").Value
Application.DisplayAlerts = False 'DISABLE ALERT on Save - overwrite, etc.
ActiveWorkbook.SaveAs Filename:=OutputFile, FileFormat:=xlCSV, CreateBackup:=False
Application.DisplayAlerts = True 'DISPLAY ALERTS
End Sub
相关的代码在这里:
'While looping through Al, inside of looping through A and B...
'Created output values needed in this case, in an array...
Sheets(1).Range("A2:E90001") = Output
ActiveWorkbook.Worksheets(1).Range("F2").Formula = "=(does not matter, some formula)"
ActiveWorkbook.Worksheets(1).Range("F2").AutoFill Destination:=Range("F2:F90001")
'Set Filename to save into...
ActiveWorkbook.Worksheets("Macro").Range("B1").Value = "Values_AP" & Format(A, "#") & "_BP" & Format(B, "#") & "_Al" & Format(Al, "#")
'Save Sheet and reset...
Call SaveCSV
Sheets(1).Range("A2:F90001").ClearContents
CurrRow = 1
Next Al
【问题讨论】:
-
我添加了一段调用保存例程的代码。它是我无法真正在线共享的系统的一部分,而且使用的数百行代码与问题无关。当然,如果有某种方法可以完成任务,所有这些都应该是无关紧要的——我不只是想要“固定”代码作为解决方案,我想知道如何做到这一点。