Excel VBA - 如果为0,则将最后一位替换为1

时间:2016-10-04 13:45:26

标签: excel vba excel-vba replace

我有一个包含2位和3位数字列的电子表格。如果它是一个以0结尾的3位数字,则最终0应该替换为1.因此150变为151而200变为201.

这就是我正在使用的,只是为了测试功能,它很慢并且通常会崩溃Excel,因为(我认为)它基本上在每个单元格上进行多次查找和替换,即使它已经替换了值。所以我想我需要走另一条路。

Sub FixNumbers()
Dim c As Range

For Each c In Selection.Cells
    Selection.NumberFormat = "General"
    c = Replace(c, "100", "101")
    c = Replace(c, "150", "151")
    c = Replace(c, "200", "201")
    c = Replace(c, "250", "251")
    c = Replace(c, "300", "301")
    c = Replace(c, "350", "351")
    c = Replace(c, "400", "401")
   Next
End Sub

4 个答案:

答案 0 :(得分:4)

如果单元格包含2-3位数字 - 请勿对其使用文本操作。格式更改应该在循环之外。

Sub FixNumbers()
    Dim c As Range

    Selection.NumberFormat = "General"
    For Each c In Selection.Cells
      If (c > 99) And (c Mod 10) = 0 Then c = c + 1
    Next
End Sub

答案 1 :(得分:2)

在vba中执行此操作:

Sub FixNumbers()
Dim c As Range
Selection.NumberFormat = "General"
For Each c In Selection.Cells

    If Len(c) = 3 And Right(c, 1) = "0" Then
        c.Value = CInt(Left(c, 2) & "1")
    End If

   Next
End Sub

答案 2 :(得分:2)

我个人通过测试值模数10,然后加1:

来做到这一点
Sub FixNumbers()
    Dim height As Long
    Dim c As Range
    For Each c In Selection.Cells
        height = CLng(c.Value)
        If height > 99 And height < 1000 And height Mod 10 = 0 Then c.Value = height + 1        Next
End Sub

答案 3 :(得分:1)

请勿在VBA中执行此操作。模仿工作表可以做得非常好的东西是毫无意义的。

而是在工作簿中创建一个新列。假设A列包含您的数字。

然后在新列中使用=IF(MOD(A1,10),A1,A1+1)向下复制。 (MOD(A1,10)当且仅当数字以零结尾时才为0。