【问题标题】:Using the Replace method in VBA leaves numbers stored as strings在 VBA 中使用 Replace 方法将数字存储为字符串
【发布时间】:2012-04-09 16:01:30
【问题描述】:

我正在使用一个使用奇怪空间作为千位分隔符的工作簿。 Excel 将包含此分隔符的数字视为文本。当我使用查找和替换工具删除此分隔符时,数字会被正确识别为数字。当我使用 VBA 执行相同操作时,使用 Cells.Replace 方法,数字继续存储为文本。然后,包含这些数字的单元格上会出现一个绿色角,允许我将它们转换为数字格式,但此选项在 VBA 中似乎不可利用,因为宏记录器不会记录此操作。

我可以将工作表的单元格复制到一个数组中,然后循环遍历值以替换千位分隔符,然后将数组粘贴回工作表。我的问题是:有没有更有效的方法来删除这些千位分隔符,以便我的数字被视为数字?

【问题讨论】:

  • 你能上传一个只有 5 个单元格的示例工作簿,这样我们就可以看到那个奇怪的字符是什么?您可以在 wikisend.com 上传示例文件并在此处分享链接。
  • 我假设奇怪的空间是 Chr(160),它是非中断空间,但无论它是什么你都必须知道才能替换它。我能想到的最好的方法是使用 Find 将 Rng 设置为每个包含奇怪空间的单元格的循环。如果Rng 不是NothingRng.Value = Val(Replace(Rng.Value,StrangeSpace, " ")) 去除奇怪的空格并强制评估结果。
  • @SiddharthRout: link
  • @TonyDallimore:这个空间确实是一个不间断的空间。但是在循环中使用 Find 方法会很慢。将工作表的值复制到数组中并在其中编辑它们要快得多。唯一的问题是我在使用非常大的表时收到“内存不足”错误。
  • 您可以尝试一次加载 10,000(或其他)行以避免“内存不足”错误。您如何强制重新评估已编辑的值?

标签: excel vba


【解决方案1】:

您是指单元格 B3 和 B5 中 9 和 5 之间的空格吗?如果是,那么仅仅删除空格并不能解决问题。您还需要删除逗号以将其转换为数字,然后使用适当的千位分隔符对其进行格式化。查看此代码和快照

快照

代码

Sub Sample()
    With Sheets("Feuil1").Columns(2)
        .Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:= _
        xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

        .Replace What:=",", Replacement:="", LookAt:=xlPart, SearchOrder:= _
        xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

        .NumberFormat = "#,##0"
    End With
End Sub

HTH

【讨论】:

  • 我意识到该解决方案必须适用于任何区域设置。我的系统的小数分隔符是逗号 (,),因此,使用查找和替换工具(没有 VBA)删除空格足以让 Excel 将值视为数字。但是,VBA 的内部小数点分隔符似乎是点 (.),因此,当我像您一样使用 .Replace 方法时,VBA 认为它正在处理字符串,并将编辑后的值作为字符串复制回单元格。这就是为什么我在使用 .Replace 方法后得到绿色角建议将单元格转换为数字格式的原因。
  • ... 由于我不能使用 .Replace 方法,最好的解决方案似乎是将 Range 的值复制到数组中,删除空格并用 Application.DecimalSeparator 替换逗号,然后复制数组回到范围。一个问题是,这会删除用于在我的表格中强制进行文本转换的任何前导撇号,因为它不包含在 .Value 或 .Formula 属性中。
  • 另一种方法是录制宏:) 然后手动复制9和5之间的数据。然后进行替换。同样替换小数分隔符。看看宏吐出什么?
  • 我做到了。正如我试图解释的那样,查找和替换方法在我手动执行时有效:单元格的内容被转换为数字。但是当我重播录制的宏时,单元格的内容仍为文本格式,Excel 建议使用单元格旁边的一个小按钮将它们转换为数字。 Imgur
  • 是的。您在代码中缺少一行。如果您也包含将“,”替换为“”的代码,会发生什么?暂时不要包含.NumberFormat = "#,##0"
【解决方案2】:

上面的答案是对的。 问题来自 Excel 区域设置。 (即:在法国,数字的格式为 1234,56,而在英文版的 Excel 中为 1234.56) 使用查找和替换工具,不影响区域设置。

但是,当使用 VBA 将点替换为逗号时,基于英语的 VBA 会将所有数字设置为字符串。 如果将分隔符替换回点,数字将显示在区域设置之后(英文设置为点,法国设置为逗号)。

希望对你有帮助

【讨论】:

    【解决方案3】:

    将不间断空格作为千​​位分隔符和逗号作为小数分隔符的数字存储为文本。在 VBA 中使用 Cells.Replace 方法删除空格并没有将值转换为数字格式,而是将它们存储为文本。解决方案是第二次使用Cells.Replace 用点替换逗号,以便 VBA 将值视为数字并将它们复制到工作表中。 Excel 然后根据区域设置格式化数字(必要时用逗号替换点)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2019-01-06
      • 2023-03-14
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多