Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用“查找/替换”清除vbNullString_Excel_Vba - Fatal编程技术网

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

Excel 使用“查找/替换”清除vbNullString,excel,vba,Excel,Vba,我有一个电子表格,在我们的企业系统中作为报告生成,并下载到Excel电子表格中。产生的电子表格中的空白单元格并不是真正的空白,即使没有数据存在,并且空白单元格不包含“空格”字符。 例如,A2中的以下单元格公式返回TRUE(如果A1是空白单元格): 但是, =ISBLANK(A1) 返回FALSE 您可以通过在单元格中键入撇号(')并复制单元格来复制此问题。然后,使用“粘贴特殊…”值粘贴到另一个单元格,撇号在粘贴的单元格或公式栏中不可见。似乎有一个清晰的单元格,但使用ISBLANK将计算为FAL

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

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

但是,

=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