2

我有一个大的 Excel 表,我想在其中替换几个数字范围(都在同一单元格范围内)。比如我想把所有大于-5小于5的数字都换成数字0。所有大于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。同样,解决方案也无法解决问题。如何修改任一公式以满足我的需要,或者这样的替代是不可能的?

谢谢!

4

2 回答 2

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
于 2013-04-20T19:30:38.707 回答
2

请不要选择此作为答案。

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

这是一个更快的方法,只使用 17 个循环

逻辑:

  1. < 10 且 > 5 (也就是说 6,7,8,9 被 1 代替)
  2. < 5 和 > -5 (也就是说 -4,-3,-2,-1,0,1,2,3,4 被 0 代替)
  3. < -5 和 > -10 (也就是说 -6,-7,-8,-9 被 -1 代替)

现在,我们将使用.Replace搜索上述数字而不是循环任何单元格,因此从技术上讲,与 1326 相比,我们只会循环 17 次

请参阅此示例代码

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
于 2013-04-20T20:21:32.640 回答