我在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
答案 0 :(得分:4)
您可以让UsedRange
重新计算自己而不用简单的
ActiveSheet.UsedRange
或者,您可以通过使用DRJ's VBAexpress article等代码删除上次使用过的单元格下方的区域,或使用ASAP Utilities
DRJ文章的功能是;
Option Explicit
Sub ExcelDiet()
Dim j As Long
Dim k As Long
Dim LastRow As Long
Dim LastCol As Long
Dim ColFormula As Range
Dim RowFormula As Range
Dim ColValue As Range
Dim RowValue As Range
Dim Shp As Shape
Dim ws As Worksheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
For Each ws In Worksheets
With ws
'Find the last used cell with a formula and value
'Search by Columns and Rows
On Error Resume Next
Set ColFormula = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
Set ColValue = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
Set RowFormula = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
Set RowValue = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
On Error GoTo 0
'Determine the last column
If ColFormula Is Nothing Then
LastCol = 0
Else
LastCol = ColFormula.Column
End If
If Not ColValue Is Nothing Then
LastCol = Application.WorksheetFunction.Max(LastCol, ColValue.Column)
End If
'Determine the last row
If RowFormula Is Nothing Then
LastRow = 0
Else
LastRow = RowFormula.Row
End If
If Not RowValue Is Nothing Then
LastRow = Application.WorksheetFunction.Max(LastRow, RowValue.Row)
End If
'Determine if any shapes are beyond the last row and last column
For Each Shp In .Shapes
j = 0
k = 0
On Error Resume Next
j = Shp.TopLeftCell.Row
k = Shp.TopLeftCell.Column
On Error GoTo 0
If j > 0 And k > 0 Then
Do Until .Cells(j, k).Top > Shp.Top + Shp.Height
j = j + 1
Loop
If j > LastRow Then
LastRow = j
End If
Do Until .Cells(j, k).Left > Shp.Left + Shp.Width
k = k + 1
Loop
If k > LastCol Then
LastCol = k
End If
End If
Next
.Range(.Cells(1, LastCol + 1), .Cells(.Rows.Count, .Columns.Count)).EntireColumn.Delete
.Range("A" & LastRow + 1 & ":A" & .Rows.Count).EntireRow.Delete
End With
Next
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
答案 1 :(得分:2)
Excel保存UsedRange
。要截断UsedRange
,您需要删除整行并保存文件。
如果这不是一个选项,请插入一个新的工作表,将准备好的数据复制到它(从而保留其UsedRange
匹配的实际数据),使用Worksheet.SaveAs
(而不是Workbook.SaveAs
)并删除工作表。
虽然这里的实际问题是你UsedRange
首先获得那么大的原因。