Excel 2010宏:替换包含大于AND且小于的数字的所有单元格

时间:2013-04-20 19:26:06

标签: excel excel-vba excel-2010 vba

我有一张大型Excel工作表,我想在其中替换多个数字范围(所有数据范围都在同一范围内)。例如,我想用数字0替换大于-5且小于5的所有数字。所有大于5且小于10的数字应替换为1,所有大于-10且小于-5的数字应为替换为-1,等等。

我尝试使用此公式

Sub replace()
    Dim rng As Range

    For Each rng In Range("B2:AI40")
        If IsNumeric(rng) < 5 And IsNumeric(rng) > -5 Then
            rng = 0
        End If
    Next rng
End Sub

这并不能完全解决问题,因为它用0替换所有内容。同样,this解决方案也不能解决问题。我如何修改任何一个公式以满足我的需要,或者这样的替代是不可能的?

谢谢!

2 个答案:

答案 0 :(得分:4)

尝试

Sub replace()
    Dim rng As Range

    For Each rng In Range("B2:AI40")
        If rng.Value < 5 And rng.Value > -5 Then
            rng = 0
        End If
    Next rng
End Sub

IsNumeric是一个布尔函数,它返回0或1,这就是之前每个单元格都设置为0的原因。如果您希望单元格中存在非数字值,则可能必须使用以下代码:

Sub replace()
    Dim rng As Range

    For Each rng In Range("B2:AI40")
        If IsNumeric(rng) then
            If rng.Value < 5 And rng.Value > -5 Then
                rng = 0
            End If
        End if
    Next rng
End Sub

当您使用整数除法(\)乘以5时,整个任务变得更简单(并且还处理您提到的其他情况):

Sub replace()
    Dim rng As Range

    For Each rng In Range("B2:AI40")
        If IsNumeric(rng) then
            rng = rng.Value \ 5
        End if
    Next rng
End Sub

答案 1 :(得分:2)

请不要选择此作为答案。

这篇文章只是为了向您展示比您实际使用的方法快得多的方法。从技术上讲,您循环遍历B2:AI40中的每个单元格。即你的代码循环1326次(=34 Cols * 39 Rows

这是一个使用仅17个循环的快得多的方法

<强>逻辑:

  1. &LT; 10&gt; 5(换句话说,6,7,8,9将被1代替)
  2. &LT; 5&gt; -5(换言之,-4,-3,-2,-1,0,1,2,3,4将被0代替)
  3. &LT; -5和&gt; -10(换言之,-6,-7,-8,-9将被-1替换)
  4. 现在我们不是循环使用单元格,而是使用.Replace来搜索上面的数字,所以从技术上讲,我们只会循环17次而不是1326

    请参阅此示例代码

    Option Explicit
    
    Sub replace()
        Dim ws As Worksheet
        Dim rng As Range
        Dim i As Long
    
        Set ws = ThisWorkbook.Sheets("Sheet1")
        Set rng = ws.Range("B2:AI40")
    
        With rng
            For i = 6 To 9 '<~~ 4 loops
                .replace What:=i, Replacement:="1", LookAt:=xlWhole, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
            Next i
    
            For i = -4 To 4 '<~~ 9 loops ; 7 if when i = 1 or 0 it doesn't do anyting
                If i <> 1 And i <> 0 Then
                    .replace What:=i, Replacement:="0", LookAt:=xlWhole, _
                    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                    ReplaceFormat:=False
                End If
            Next i
    
            For i = -9 To -6 '<~~ 4 loops   
                .replace What:=i, Replacement:="-1", LookAt:=xlWhole, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
            Next i
        End With
    End Sub