Excel 使用“查找/替换”清除vbNullString
我有一个电子表格,在我们的企业系统中作为报告生成,并下载到Excel电子表格中。产生的电子表格中的空白单元格并不是真正的空白,即使没有数据存在,并且空白单元格不包含“空格”字符。 例如,A2中的以下单元格公式返回TRUE(如果A1是空白单元格): 但是,Excel 使用“查找/替换”清除vbNullString,excel,vba,Excel,Vba,我有一个电子表格,在我们的企业系统中作为报告生成,并下载到Excel电子表格中。产生的电子表格中的空白单元格并不是真正的空白,即使没有数据存在,并且空白单元格不包含“空格”字符。 例如,A2中的以下单元格公式返回TRUE(如果A1是空白单元格): 但是, =ISBLANK(A1) 返回FALSE 您可以通过在单元格中键入撇号(')并复制单元格来复制此问题。然后,使用“粘贴特殊…”值粘贴到另一个单元格,撇号在粘贴的单元格或公式栏中不可见。似乎有一个清晰的单元格,但使用ISBLANK将计算为FAL
=ISBLANK(A1)
返回FALSE
您可以通过在单元格中键入撇号(')并复制单元格来复制此问题。然后,使用“粘贴特殊…”值粘贴到另一个单元格,撇号在粘贴的单元格或公式栏中不可见。似乎有一个清晰的单元格,但使用ISBLANK将计算为FALSE。
这会导致排序在升序排序的顶部产生假空白单元格,而它们需要位于排序的底部
我可以使用vba循环来修复假空格,循环遍历每一列并进行计算
IF Cell.VALUE = "" Then
Cell.Clear
但由于电子表格有数万行数据和多达50列,这给程序增加了大量开销,我更喜欢使用FIND和Replace
以下是当前不起作用的代码:
Range("ZZ1").Copy
Range("Table1[#All]").Select
With Selection
.Replace What:="", Replacement:=.PasteSpecial(xlPasteValues, xlNone, False, False), _
LookAt:=xlWhole, SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End With
以下操作也无法清除假空白单元格:
Replacement:= vbnullstring
Replacement:= ""
Replacement:= Cells.Clear
Replacement:= Cells.ClearContents
Replacement:= Cells.Value = ""
我尝试了20种其他方法也不起作用。问题是您正在搜索一个隐藏的
.PrefixCharacter
,它不在标准替换函数的范围内。有关此方面的更多信息,您可能希望访问MSDN:
为了查找和替换这些公式,您必须使用.find
函数,因为它可以查看公式(而不仅仅是单元格的值)。下面是一个简短的示例代码来说明:
Option Explicit
Public Sub tmpTest()
Dim cell As Range
Dim rngTest As Range
Dim strFirstAddress As String
Set rngTest = ThisWorkbook.Worksheets(1).Range("A1:G7")
Set cell = rngTest.Find("", LookIn:=xlFormulas, lookat:=xlPart)
If Not cell Is Nothing Then
strFirstAddress = cell.Address
Do
cell.Value = vbNullString
Set cell = rngTest.FindNext(cell)
Loop While strFirstAddress <> cell.Address And Not cell Is Nothing
End If
End Sub
选项显式
公共分公司
暗淡单元格作为范围
变暗rngTest As范围
Dim strFirstAddress作为字符串
Set rngTest=此工作簿。工作表(1)。范围(“A1:G7”)
Set cell=rngTest.Find(“,LookIn:=xlFormulas,lookat:=xlPart)
如果不是的话,那细胞就什么都不是了
strFirstAddress=单元格地址
做
cell.Value=vbNullString
设置单元格=rngTest.FindNext(单元格)
循环,而strFirstAddress单元格。地址和非单元格为空
如果结束
端接头
我想不出你可以用什么来替换它。恐怕你被套住了。您可以通过使用.Find
而不是循环遍历每个单元格来减少开销
Sub ClearBlanks()
Dim rng As Range
Dim rFound As Range
Dim sFirstAdd As String
Dim rFoundAll As Range
Set rng = Sheet1.UsedRange
Set rFound = rng.Find(vbNullString, , xlValues, xlWhole)
If Not rFound Is Nothing Then
sFirstAdd = rFound.Address
Do
If rFoundAll Is Nothing Then
Set rFoundAll = rFound
Else
Set rFoundAll = Application.Union(rFound, rFoundAll)
End If
Set rFound = rng.FindNext(rFound)
Loop Until rFound.Address = sFirstAdd
End If
If Not rFoundAll Is Nothing Then
rFoundAll.ClearContents
End If
End Sub
您可以使用表格过滤器选择每列中的(看似)空白单元格并清除内容。这应该比查找每个空白单元格更快
Sub clearBlankTableEntries()
Dim tbl As ListObject, c As Byte
Set tbl = ActiveSheet.ListObjects("testTable")
For c = 1 To tbl.Range.Columns.Count
tbl.Range.AutoFilter Field:=c, Criteria1:="="
Range(tbl.Name & "[Column" & c & "]").ClearContents
tbl.Range.AutoFilter Field:=c
Next c
End Sub
试试这个
With ActiveSheet.UsedRange
.NumberFormat = "General"
.Value = .Value
End With
变量数组提供了一种处理假空的有效方法:
Sub CullEm()
Dim lngRow As Long
Dim lngCol As Long
Dim X
X = ActiveSheet.UsedRange.Value2
For lngRow = 1 To UBound(X, 1)
For lngCol = 1 To UBound(X, 2)
If Len(X(lngRow, lngCol)) = 0 Then X(lngRow, lngCol) = vbNullString
Next
Next
ActiveSheet.UsedRange.Value2 = X
End Sub
这很好,很快。它确实删除了所有的公式和格式。如果格式化很重要,我想你可以分成两行,第一行,复制粘贴格式,第二行,复制粘贴格式。保留公式需要循环所有单元格,但我假设导出的文件不包含公式。我在问题中没有指出表中的某些列不包含任何假空白单元格。这段代码适用于带空格的列。但是,如果一列的每个单元格都填充了数据(其中没有空格),那么整个列将清除其现有数据。这不好!您可以检查这种情况,仅当筛选的表显示的不仅仅是标题行时才清除内容:
If(tbl.Range.SpecialCells(xlCellTypeVisible.Rows.Count>1),然后是范围(tbl.Name&“[Column”&c&“])。ClearContents
Sub CullEm()
Dim lngRow As Long
Dim lngCol As Long
Dim X
X = ActiveSheet.UsedRange.Value2
For lngRow = 1 To UBound(X, 1)
For lngCol = 1 To UBound(X, 2)
If Len(X(lngRow, lngCol)) = 0 Then X(lngRow, lngCol) = vbNullString
Next
Next
ActiveSheet.UsedRange.Value2 = X
End Sub