我有一张大型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解决方案也不能解决问题。我如何修改任何一个公式以满足我的需要,或者这样的替代是不可能的?
谢谢!
答案 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个循环的快得多的方法
<强>逻辑:强>
现在我们不是循环使用单元格,而是使用.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