VBA——处理以文本形式存储的数字的更快方法



我有这个功能,它可以删除所有存储为文本的数字:

Public Function find_numbers_formated_as_text(ByVal sh As Worksheet)

Dim c As Range

On Error GoTo A

''''For Each r In sh.UsedRange.Cells.SpecialCells(xlCellTypeConstants, xlTextValues)
For Each c In sh.ListObjects(1).DataBodyRange
''''For Each c In sh.UsedRange.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
''''For Each c In sh.ListObjects(1).DataBodyRange.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
If IsNumeric(c.Value) = True Then
c.Value = c.Value
End If
Next c

Exit Function

A:
On Error GoTo 0
End Function

但它真的很慢。。。有人对如何使它更快有什么建议吗?


我确实尝试了其他一些东西,这就是为什么源代码中有一些注释的原因。但注释并没有起作用,因为在我的例子中,范围也是空的(即使表中充满了数据(。

请替换您代码的这一部分:

For Each C In sh.ListObjects(1).DataBodyRange
''''For Each c In sh.UsedRange.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
''''For Each c In sh.ListObjects(1).DataBodyRange.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
If IsNumeric(C.Value) = True Then
C.Value = C.Value
End If
Next C

这个:

Dim lRng As Range, arr, i As Long, j As Long

Set lRng = sh.ListObjects(1).DataBodyRange
arr = lRng.Value2
For i = 1 To UBound(arr)
For j = 1 To UBound(arr, 2)
If IsNumeric(arr(i, j)) Then arr(i, j) = CDbl(arr(i, j))
Next j
Next i
With lRng
.NumberFormat = "General"
.Value2 = arr
End With

它将范围放在一个数组中,所有过程都只在内存中进行,修改后的数组内容会立即放在代码的末尾。

最耗时的是每个单元格和写入单元格间隔单元格之间的迭代。。。

如果";"概述";格式化可能会影响列表对象的格式,请说明应该在哪些列中进行转换,我将调整代码以仅格式化相应的表列。

现在我可以看到你的一条评论说,在要处理的范围内存在(并且必须保留(公式。上面的代码不处理这种情况。我认为你应该在你的问题中说明。。。

编辑

如果用于返回数值(而不是字符串(的公式,并且错误地将相应的范围格式化为Text,则可以尝试下一种方法(维护公式(:

With sh.ListObjects(1).DataBodyRange
.NumberFormat = "General"
.Formula = .Formula
End With
这个问题有很多答案。这是一件简单的尝试。在此之前添加:
Application.Calculation = xlManual

之后:

Application.Calculation = xlAutomatic

将范围存储为数组比在工作表中更改值更快。

sh.ListObjects(1).DataBodyRange.formula = sh.ListObjects(1).DataBodyRange.formula

如果数字是文本,那么它们将默认为数字,因此您不需要测试它是否是数字。

(使用此方法不会丢失公式。(

最新更新