2017-08-10 289 views
0

我已經寫了2個宏來完成這個任務,但我試圖鞏固並使之更高效。Excel-VBA循環ifs

  • 如果有一個值= 1 I柱(它要麼是空白的或= 1),則看柱G
  • 如果在列G < 30或者該值的值在H <柱0.03 THEN 列覆蓋i的值=「0」 ...(如果沒有則不要更改I列中的值,並移動到檢查下)

範圍是I9:I45000G9:G45000H9:H45000

我認爲有一個簡單的解決方案,但幾個小時後,我的未受過教育的自我找不到它。

模塊1:

Dim rngCell As Range, _ 
    rngDataRange As Range 

Set rngDataRange = Range("G9:G45000") 
For Each rngCell In rngDataRange 
    With rngCell 
     If .Value < 30 Then 
      .Offset(0, 2).Value = "0" 'A[rngCell] to C[rngCell] 
     End If 
    End With 
Next rngCell 
End Sub 

單詞數:

Sub Macro1() 
Dim rngCell As Range, _ 
    rngDataRange As Range 

Set rngDataRange = Range("H9:H45000") 

For Each rngCell In rngDataRange 
    With rngCell 
     If .Value < 0.03 Then 
      .Offset(0, 1).Value = "0" 'A[rngCell] to C[rngCell] 
     End If 
    End With 
Next rngCell 
End Sub 

這是我第一運行宏....它把值一些細胞在列I(其中列C的值小於1575):

S UB宏1() 昏暗rngCell量程,_ rngDataRange作爲範圍

Set rngdataRange = Range (C9:C45000) 

For Each rngCell In rngDataRange 
    With rngCell 
     If .Value < 1575 Then 
      .Offset (0,6).Value="1" 
     End If 
    End With 
Next rngCell 

末次

+2

到目前爲止您嘗試過什麼?什麼在工作/不工作? – BruceWayne

+0

你可以編輯你的問題,並在那裏添加你的宏? –

+0

感謝您的指導。對不起,我應該被編輯......希望有點正確 –

回答

0

什麼這樣的事情?

Sub Macro1() 
    OnError Goto OopsIDidItAgain 
    Dim rngCell As Range, rngDataRange As Range 

    Application.ScreenUpdating = False 
    Set rngDataRange = Range("G9:G45000") 

    For Each rngCell In rngDataRange 
     With rngCell 
      If .Value < 30 Or .Offset(0, 1).Value < 0.03 Then .Offset(0, 2).Value = "0" 
     End With 
    Next rngCell 
OopsIDidItAgain: 
    Application.ScreenUpdating = True 
End Sub 
+3

由於範圍很大,我會關閉screenupdating宏的開始之前,並重新激活它後的for循環 – TJYen

+0

@TJYen,是的真的 –

+1

是的,我將它納入我的答案爲好吧 – Variatus

2

這應該做的工作。

Sub CheckClmI() 

    Dim Rl As Long      ' Last row 
    Dim R As Long 

    Application.ScreenUpdating = False 
    With ActiveSheet 
     ' Used range should be enough 
     Rl = .UsedRange.Rows.Count 

     For R = 9 To Rl 
      If Val(.Cells(R, "I").Value) = 1 Then 
       If Val(.Cells(R, "G").Value) < 30 Or _ 
        Val(.Cells(R, "H").Value < 0.03) Then 
        .Cells(R, "I").Value = 0 
       End If 
      End If 
     Next R 
    End With 
    Application.ScreenUpdating = True 
End Sub 
+0

這看起來像是要走的路我只是不明白整列「I」部分發生了什麼...... –

+0

謝謝,但是,當我運行它時,宏用0填充列I即使在沒有1開始的情況下和/或列G和H的值大於(30或0.03)的情況下......不知道爲什麼這樣,對於我未經訓練的眼睛來說,你的回答看起來不錯 –

+0

似乎就像我需要一些語言,說明如果IF語句爲假時該怎麼辦......就像在Next之前移動Next R line如果...但是當我嘗試這樣做時,我收到一條錯誤消息,它不會讓我試試它:( –

0

你可以做所有的測試一氣呵成:

Dim rngCell As Range 
Dim rngDataRange As Range 
Dim iCell as range 
Dim hVal as variant 

Set rngDataRange = Range("G9:G45000") 
For Each rngCell In rngDataRange 
    With rngCell 
     Set iCell = .Offset (0,2) 
     hVal = .Offset (0,1).Value 

     If iVal = 0 or iVal = vbnullstring then 
      If .Value < 30 or hVal > .3 Then 
       iCell.Value = "0"  
      End If 
     End if 
    End With 
Next rngCell 
End Sub 
0

我喜歡算行,這樣就不必浪費循環。

Dim LstRw As Long 
Dim Rng As Range, c As Range 

LstRw = Cells(Rows.Count, "G").End(xlUp).Row 
Set Rng = Range("G9:G" & LstRw) 
For Each c In Rng.Cells 
    If c < 30 Or c.Offset(, 1) < 0.03 Then c.Offset(, 2) = 0 
Next c