使用查找/replace来清除vbNullString

我有一个电子表格,在我们的企业系统中生成为一个报表,并下载到Excel电子表格中。 即使没有数据存在,生成的电子表格中的空白单元格也不是真的空白,而空白单元格不包含“空格”字符。

例如,A2中的以下单元格公式返回TRUE(如果A1是空白单元格):

=IF(A1="","TRUE","FALSE") 

然而,

 =ISBLANK(A1) 

返回FALSE。

您可以通过在单元格中input撇号(')并复制单元格来复制此问题。 然后,使用select性粘贴…值粘贴到另一个单元格,撇号在粘贴的单元格中,也不在公式栏中可见。 似乎有一个明确的单元格,但是它将使用ISBLANK评估为FALSE。 这会导致sorting导致虚假的空白单元格在升序的顶部,当他们需要在sorting的底部。

我可以使用vba循环来修复虚拟空白,循环遍历每一列并进行评估

 IF Cell.VALUE = "" Then Cell.Clear 

但由于电子表格有数以万计的数据行和多达50列,这增加了大量的程序开销,我宁愿使用查找和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个不起作用的其他东西。

尝试这个

 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 

问题是,您正在寻找一个隐藏的.PrefixCharacter不包括在标准的replacefunction。 有关此更多信息,您可能需要访问MSDN: https : //msdn.microsoft.com/en-us/library/office/ff194949.aspx

为了find并replace它们,你必须使用.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 

我找不到任何你可以放在Replacement ,以使其工作。 恐怕你被卡住了循环。 您可以通过使用.Find而不是循环遍历每个单元格来减less开销。

 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 

您可以使用表格filter来select每列中的(看似)空白单元格并清除内容。 这应该比find每个空白单元更快。

 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