Search code examples
excelvbaif-statementforeachmultiple-conditions

How to give multiple conditions in if statement in VBA


I have written a VBA code to auto hide rows when the three column " D" , "E" and "F" simultaneously show zero value. If any one of them is having non-zero value it should not hide the rows. Moreover, I also want to add "#N/A" also, like if #NA is there just like Zero it should hide the row.

But it seems there is some problem with the code.

Sub HideRows()
Application.ScreenUpdating = False
Application.Calculation = xlManual
 
For Each x In Range("D2:D2000")
Next
For Each y In Range("E2:E2000")
Next
For Each Z In Range("F2:F2000")
Next
If x.Value = 0 And y.Value = 0 And Z.Value = 0 Then x.EntireRow.Hidden = True

Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub

Solution

  • Welcome to the site!

    Your syntax is not correct. The loop For Each ... Next should encompass the code that you want to repeat . Since your loop does not contain anything inside, it does absolutely nothing. I tried to write an understandable code for you:

    Sub HideRows()
    Dim i as Long 'Counter
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
    
    With ActiveSheet
        For i = 2 To 2000
            If (.Range("D" & i).Value = 0 Or .Range("D" & i).Text = "#N/A") And _
               (.Range("E" & i).Value = 0 Or .Range("E" & i).Text = "#N/A") And _
               (.Range("F" & i).Value = 0 Or .Range("F" & i).Text = "#N/A") Then
            .Range("D" & i).EntireRow.Hidden = True
            End If
        Next
    End With
    
    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True
    End Sub
    

    In the example you see that the loop For ... Next encompasses some code, therefore the code will be done, as you can see, for 1999 times counting from 2 to 2000.Everything is enclosed in With ActiveSheet ... End With statement. The reason is to make the code more readable and not to repeat ActiveSheet. If you did not use it, instead of .Range you would have to write the full thing (ActiveSheet.Range).