我在 VBA for Excel 中创建了一个工具,可以根据多种标准分析我们收到的 .xlsx 文件。其中之一是数据集中的空单元格数量。但不幸的是,我注意到我们收到的许多文件包含带有零长度字符串的单元格,这些单元格被“错误地”计为非空单元格。
如果我能够从文件中删除这些内容,实际上对整个过程非常有益。
我已经用谷歌搜索了很多这个问题,但到目前为止我能找到的唯一解决方案是循环遍历工作表中的所有单元格(我也尝试过只使用常量,并且还使用 Find 来查找所有 zls) 。这不是很有效,因为工作表中包含大量数据。 编辑:我还尝试了UsedRange.values =usedRange.values方法,但这会删除我需要的前导零。
我还发现这是可行的(-@- 是一个随机字符串,极不可能是我的数据中的单个单元格,如果存在,则可以将其删除):
ws.UsedRange.Replace what:=vbNullString, replacement:="-@-", _
lookat:=xlWhole, MatchCase:=False
ws.UsedRange.Replace what:="-@-", replacement:="", _
lookat:=xlWhole, MatchCase:=False
但如果我只使用单个替换来完成它,则不会:
ws.UsedRange.Replace what:=vbNullString, replacement:="", _
lookat:=xlWhole, MatchCase:=False
第一个是可以的,但是有很多问题:
- 所需时间是单次替换的两倍
- 并不总是清楚它是崩溃了还是继续工作
- 如果它确实崩溃了,我会留下许多包含 -@- 的单元格,这并不总是显而易见的,并且该工具应该可以被无法理解 VBA 的人使用。<
所以我的问题:
- 有没有办法只使用一次替换来做到这一点?为什么替换可以使用双重替换,但不能使用单一替换?
- 如果第一个不可能,那么在代码崩溃时是否有办法“回滚”替换?
- 有没有办法更新状态栏以显示替换进行了多远,以证明代码正在运行(很像在 Excel 本身中运行替换时)?
- 或者是否有更好的方法来完成这一切?
提前致谢!
编辑:不幸的是,由于正在处理数据,我需要保留格式,包括前导零
编辑:这是我正在查看的数据类型的示例。我想替换零长度字符串(它们是没有值的非空白单元格),因此它们是真正的空白单元格。
最佳答案
我知道这也是一个循环,但也许是一种更快的方法:
之前:
在示例数据上运行此代码:
Dim X As Double
Option Explicit
Sub Test()
Application.ScreenUpdating = False
Application.Calculation = xlManual
With ActiveWorkbook.Sheets(1).Range("A1:C7")
For X = 1 To 3
.AutoFilter Field:=X, Criteria1:=""
.Columns(X).Offset(1, 0).SpecialCells(xlCellTypeVisible).Clear
Next X
.AutoFilter
End With
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub
之后:
关于excel - 如何使用 VBA 删除 Excel 中的零长度字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56021321/