2013-04-20 47 views
2

我有一個大的Excel表格,我想在其中取代幾個數字範圍(都在相同的單元格範圍內)。例如,我想用數字0替換大於-5和小於5的所有數字。大於5和小於10的所有數字都應該用1替換,所有大於-10和小於-5的數字應該是用-1代替,依此類推。Excel 2010宏:替換所有單元格包含數量大於和小於

我試圖用這個公式

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解決方案不會做的伎倆無論是。我如何修改公式以適應我的需求,或者這樣的替換是不可能的?

謝謝!

回答

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 
+0

謝謝你,這個完美!這是所有的數值,所以它與第一個解決方案一起工作! – rf2012 2013-04-20 19:42:19

+0

@DanielHagemeier:看看我編輯的一個更簡單的解決方案,它也涉及rng> 5,rng> 10,... – 2013-04-20 19:43:49

+0

@DocBrown:儘管這是一個小範圍,Application.ScreenUpdating = False在代碼和Application之前。循環後的.ScreenUpdating = True'將避免閃爍。 – shahkalpesh 2013-04-20 19:46:16

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 And > -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 
+0

+1高效代碼 – Santosh 2013-04-21 03:54:53

+1

+1用於顯示完全不同的應用程序,以及如何使用「替換」來解決此類問題。但是,由於Excel必須在內部循環,而「替換」是一個複雜的功能,因此它實際上更加高效 - 實際上是否測量了運行時間?而這個解決方案是恕我直言,比我的維護更少。 – 2013-04-22 07:44:39

+0

@DocBrown:感謝讚賞:)是的,這是更高效。效率可以在更大的範圍內顯着地看到。現在它只有38行。想象10000行......循環17次,而不是340000次! :) – 2013-04-22 08:12:17

相關問題