2013-04-20 3 views
2

여러 셀을 동일한 셀 범위 내에서 바꿀 수있는 큰 Excel 시트가 있습니다. 예를 들어, -5보다 크고 5보다 작은 모든 숫자를 숫자 0으로 대체하려고합니다. 5보다 크고 10보다 작은 모든 숫자는 1로 대체해야하고, -10보다 크고 -5보다 작은 모든 숫자는 -1 등으로 바뀝니다. Excel 2010 매크로 :보다 큰 숫자보다 큰 숫자의 셀을 모두 바꾸기

나는이 0으로 모든 것을 대체 마찬가지로, this 솔루션 중 하나 트릭을하지 않는 매우 트릭을하지 않습니다이 공식

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 

를 사용했습니다. 내 필요에 맞게 수식을 수정하거나 그렇게 할 수없는 대체 방법은 무엇입니까?

감사합니다.

답변

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으로 설정 한 이유 0 또는 1, 그건 반환하거나 부울 함수입니다보십시오. \ (당신은 정수 나누기를 사용할 때

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

+0

@DanielHagemeier : rng> 5, rng> 10, ...을 다루는 더 간단한 솔루션에 대한 편집 내역을 참조하십시오. –

+0

@DocBrown :이 범위는 작지만 코드 앞에 'Application.ScreenUpdating = False'가 있고 코드 앞에'Application .ScreenUpdating = True' 루프가 깜박임을 피할 것입니다. – shahkalpesh

2

답변으로 선택하지 마십시오.

이 게시물은 실제로 사용하는 것보다 훨씬 빠른 방법을 보여주기위한 것입니다. 기술적으로 당신은 B2:AI40에있는 모든 세포를 반복하고 있습니다. 즉, 코드가

여기에만 17 루프

를 사용하여 훨씬 더 빠른 방법입니다 1326 번 ( =34 Cols * 39 Rows를) 루핑

논리 : 즉 6에서

  1. < 10과> 5 (, 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 
+0

+1 효율적인 코드 – Santosh

+1

+1 완전히 다른 apporach를 표시하고,이 종류의 문제에 대해 "바꾸기"를 사용하는 방법. 그러나 Excel은 내부적으로 루프해야하고 "바꾸기"는 복잡한 함수이기 때문에 실제로는 더 효율적이라는 것이 분명하지 않습니다. 실제로 실행 시간을 측정 했습니까? 그리고이 솔루션은 IMHO보다 훨씬 유지 보수가 쉽습니다. –

+0

@DocBrown : 감사합니다 :) 예. 이것이 더 효율적입니다. 효율성은 훨씬 더 큰 범위에서 크게 볼 수 있습니다. 지금은 단지 38 줄입니다. 10000 개의 행을 상상해보십시오 ... 340000 번과 비교하여 17 번 루핑합니다! :) –