细胞中的幽灵值

时间:2014-01-30 03:49:42

标签: excel-vba vba excel

我似乎有一个奇怪的问题,因为一些幽灵值进入了我的档案。我从某人那里得到了这个文件,但看起来文件已经看到了几个删除,复制粘贴等。请参阅附图。

enter image description here

它显示单元格J186中的重影值以及单元格j186上各种IS ***函数返回的值。这些值存在于文件的多个列中,我确信它们消耗了大量的Filesize,并且文件时不时地崩溃。该文件是100 MB。

例如,当我选择列L中的任何单元格表示单元格L56并按Ctrl +向下时,即使没有值,光标也会卡在单元格L186中。如果我选择单元格L3:L186并手动输入删除,则会删除某些内容(我无法看到),然后该范围将作为正常范围运行(即如果我选择该范围内的任何随机单元格并执行Ctrl + Down,则会Excel行1048576中的最后一行)L186范围内的任何单元格都与单元格J186相同。

有没有办法编写VBA代码来识别此类单元格并清除此类单元格的内容? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

是的,这里有一些奇怪的东西......实际上不是空白的零长度单元格(使用SpecialCells(xlBlank)进行测试时

在您的示例文件=CODE(A117)上返回#VALUE。然而,细胞不是空白

这个基于数组的代码提供了一种将单元格转换为真正空白的快速方法

Sub QuickReplace()
Dim rng1 As Range
Dim X
Dim lngRow As Long
Dim lngCol As Long

ActiveSheet.UsedRange

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

答案 1 :(得分:0)

此代码成功。但文件大小没有减少太多。

Sub cleancolumns()
Dim i As Integer
Dim j As Integer
Dim Rng As Range

j = 1

Do While j < 5010
Set Rng = Range(Cells(5, j), Cells(186, j))
If WorksheetFunction.Sum(Rng) = 0 Then
    Rng.Select
    Selection.ClearContents
    j = j + 1
Else
    j = j + 1
End If
Loop

ActiveWorkbook.Save

End Sub

总共有一百万个细胞,也计算上述范围,其中全范围是“”。逐个搜索每个单元格非常慢。因此我做了上述解决方法。

上面的代码检查范围的总和,如果范围的总和为零,则假定它包含“”并清除内容。否则它会跳过列并检查下一列。

但是,这并不能解决真正价值观很少而其余的都是“”的情况。我猜这些也必须在单独的If语句中考虑。这将使它变得非常缓慢,但这样做似乎是不可避免的。


根据Brettdj的回复进行更新


以下Brettdj代码的变体奏效了。 usedrange似乎比我的6GB计算机可以处理的要大。所以我打破了数据块,以避免“内存不足”错误。还有一些错误值必须在应用Len函数之前删除。现在文件大小缩小了三分之一(主要是通过空白替换0 - 有太多)。值得庆幸的是,鬼魂似乎已被破坏。

Sub QuickReplace1()
Dim rng1 As Range
Dim X As Variant
Dim lngRow As Long
Dim lngCol As Long

' took no more than 500 columns at a time not to risk file crashing. Changed the values      manually to clear chunk by chunk
Set rng1 = Range(Cells(1, 3501), Cells(7500, 4000))

X = rng1.Value2
For lngRow = 1 To UBound(X, 1)
    For lngCol = 1 To UBound(X, 2)
        If IsError(X(lngRow, lngCol)) Then X(lngRow, lngCol) = vbNullString
        If X(lngRow, lngCol) = 0 Then X(lngRow, lngCol) = vbNullString
        If Len(X(lngRow, lngCol)) = 0 Then X(lngRow, lngCol) = vbNullString
    Next
Next

rng1.Value2 = X

End Sub
相关问题