【问题标题】:Ghost values in the cells单元格中的鬼值
【发布时间】:2014-01-30 03:49:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您尝试在这些单元格上使用Debug.Print 会怎样?结果如何?
  • 这些“幽灵”单元格中是否可能存在空格或多个空格?
  • 嘿 Sam092 和 DeabBDean。谢谢你们俩阅读我的帖子。我认为问题似乎在于它们包含“”。我写了一个代码来删除“”,希望它能修复它。一旦代码成功,我将发布代码。这个文件是某人发给我的,我不知道他是如何设法放这么多“”的。看起来像使用 if 语句放置“”,然后将所有单元格作为值复制粘贴。
  • 我曾经继承过一个有类似问题的文件。来源是用户更喜欢通过按空格键而不是删除或退格来清除单元格。它引起了各种各样的问题,非常烦人。
  • 另外,想知道它是否是不间断空格 - CHAR(160) 问题。见stackoverflow.com/questions/9578397/…

标签: excel vba


【解决方案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

【讨论】:

  • 哇!!我认为这将需要至少 2 个小时才能逐个细胞进行。清理范围几乎不需要 2 分钟。极好的!!!!非常感谢!!!
  • 我曾经使用过小于 Usedrange 的范围,它就像一个魅力。非常感谢。
  • 对不起,我之前的帖子有误导性。我无法让它适用于某些文件。对于一个文件,它可以工作,而对于其他文件,它会出现内存不足错误。
  • 对于您有问题的文件或所有文件?与您最初提到的文件一样大的文件可能已损坏。您对 alppy 做了哪些修改以使其 小于 UsedRange 的范围
  • 感谢您的持续关注。为了回答您的问题,我只有有问题的文件。 :-)。但是我已经管理了一个工作区,并且我发布了最终有效的代码。非常感谢您让我朝着正确的方向前进。
【解决方案2】:

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

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

【讨论】:

  • 悉达多。谢谢。我可以上传文件的样本。如何在此处上传文件?我将一些鬼影缠身的范围复制到另一个示例工作表中,鬼影很快就被转移了。我可以上传示例文件。
  • 您可以将其上传到 www.wikisend.com 并在此处分享链接
  • 原始文件有多大?我想查看原始文件,以便确定文件过大的确切原因。
  • 我尝试将文件逐页转换为 csv,并将 csv 文件的总大小与原始文件的总大小进行比较。总数与原始文件在同一范围内。原因是庞大的数据。所以我首先清理数据,然后用几个带有 VBA 宏的嵌套 if 替换长公式。不确定我可以分享原始尺寸。还是谢谢。
  • 大约有 1000 万个公式,每个公式的长度超过 200 个字符。
猜你喜欢
  • 2015-11-23
  • 2020-02-20
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多