使用“查找/替换”清除vbNullString

时间:2016-06-17 11:57:46

标签: excel excel-vba vba

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

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

tableViewController

然而,

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

返回FALSE。

您可以通过在单元格中键入撇号(')并复制单元格来复制此问题。然后,使用“选择性粘贴... ...值”粘贴到另一个单元格,并且粘贴的单元格和“公式栏”中都不显示撇号。似乎有一个明确的单元格,但它将使用ISBLANK评估为FALSE。 当它们需要位于排序的底部时,这会导致排序导致虚假空白单元格位于升序排列的顶部。

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

=ISBLANK(A1)

但由于电子表格包含数万行数据和多达50列,这会给程序增加大量开销,我宁愿使用FIND和Replace。

以下是目前无效的代码:

IF Cell.VALUE = "" Then
   Cell.Clear

以下内容无法清除假空白单元格:

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

我已经尝试过20种其他不起作用的东西。

5 个答案:

答案 0 :(得分:2)

试试这个

With ActiveSheet.UsedRange
    .NumberFormat = "General"
    .Value = .Value
End With

答案 1 :(得分:1)

变量数组提供了一种处理虚假空的有效方法:

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

答案 2 :(得分:0)

问题是您正在搜索标准替换功能未涵盖的隐藏.PrefixCharacter。有关此问题的详细信息,您可能需要访问MSDN:https://msdn.microsoft.com/en-us/library/office/ff194949.aspx

为了找到并替换它们,您必须使用.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

答案 3 :(得分:0)

我无法弄清楚你可以放入Replacement以使其发挥作用的任何事情。我担心你会陷入困境。您可以使用.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

答案 4 :(得分:0)

您可以使用表格过滤器选择每列中的(看似)空白单元格并清除内容。这应该比找到每个空白单元更快。

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