【发布时间】:2023-03-24 03:22:01
【问题描述】:
我在一个文件夹中有 200 多个工作簿,我通过在代码中提供一个范围为 Set rng = sht.Range("C3:C50000") 来删除空行。
如果Column C 任何单元格为空,则删除整个行。日复一日的数据正在增强,下面的代码需要将近半个小时才能完成处理。这个时间限制也随着数据的增加而增加。
我正在寻找一种在几分钟或更短的时间内完成此操作的方法。我希望能得到一些帮助。
Sub Doit()
Dim xFd As FileDialog
Dim xFdItem As String
Dim xFileName As String
Dim wbk As Workbook
Dim sht As Worksheet
Application.ScreenUpdating = FALSE
Application.DisplayAlerts = FALSE
Set xFd = Application.FileDialog(msoFileDialogFolderPicker)
If xFd.Show Then
xFdItem = xFd.SelectedItems(1) & Application.PathSeparator
Else
Beep
Exit Sub
End If
xFileName = Dir(xFdItem & "*.xlsx")
Do While xFileName <> ""
Set wbk = Workbooks.Open(xFdItem & xFileName)
For Each sht In wbk.Sheets
Dim rng As Range
Dim i As Long
Set rng = sht.Range("C3:C5000")
With rng
'Loop through all cells of the range
'Loop backwards, hence the "Step -1"
For i = .Rows.Count To 1 Step -1
If .Item(i) = "" Then
'Since cell Is empty, delete the whole row
.Item(i).EntireRow.Delete
End If
Next i
End With
Next sht
wbk.Close SaveChanges:=True
xFileName = Dir
Loop
Application.ScreenUpdating = TRUE
Application.DisplayAlerts = TRUE
End Sub
【问题讨论】:
-
发帖时请尽量缩进代码。
-
sht.Range("C3:C5000").specialcells(xlcelltypeblanks).entirerow.delete将是删除行的更快方法。 -
我尝试使用你的方式它给出了错误
Object required在这一行sht.Range("C3:C5000").specialcells(xlcelltypeblanks).entirerow.delete -
与删除一样,将范围收集到单个对象中然后一次性删除它会更快。这样,应用程序不需要在每个删除的行之后刷新和重新计算。即使您将计算变为手动,应用程序也需要将新地址应用于所有因删除而移动的数据。使用
Union将行保存到一个范围内,然后在循环之后使用Range.Delete。 -
最后,打开和保存 200 多个(大)文件(可能是通过网络)总是需要时间......也许值得回顾一下这个过程本身......
标签: excel vba autofilter