我有一个电子表格,在我们的企业系统中作为报告生成并下载到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种其他不起作用的东西。
答案 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