使用多个变量重复IF语句

时间:2017-02-07 17:34:19

标签: excel vba excel-vba

如果下面的行有一个包含括号的数字"(2)"和另一个包含单词" Adult"。

的单元格

它是这样的:

Sub BUBFindAdults2()

lastRow = Sheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row

For x = 3 To lastRow

  If InStr(1, Sheets("Sheet1").Cells(x, 3), "(2)") <> 0 _
  And InStr(1, Sheets("Sheet1").Cells(x, 31), "Adult") <> 0 Then
    Sheets("Sheet1").Cells(x - 1, 53).Value = _
    Sheets("Sheet1").Cells(x - 1, 53).Value + 1
  End If

Next x

End Sub

但是,如果下面的两个行包含&#34;(3)&#34;我还需要将它添加到同一个单元格中。和#34;成人&#34;。 如果下面的三个行包含&#34;(4)&#34;和#34;成人&#34;。等等。你看到了模式!

到目前为止,我通过重复相同的代码来解决这个问题:

Sub BUBFindAdults2()

lastRow = Sheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row

For x = 3 To lastRow

  If InStr(1, Sheets("Sheet1").Cells(x, 3), "(2)") <> 0 _
  And InStr(1, Sheets("Sheet1").Cells(x, 31), "Adult") <> 0 Then
    Sheets("Sheet1").Cells(x - 1, 53).Value = _
    Sheets("Sheet1").Cells(x - 1, 53).Value + 1
  End If

  If InStr(1, Sheets("Sheet1").Cells(x, 3), "(3)") <> 0 _
  And InStr(1, Sheets("Sheet1").Cells(x, 31), "Adult") <> 0 Then
    Sheets("Sheet1").Cells(x - 2, 53).Value = _
    Sheets("Sheet1").Cells(x - 2, 53).Value + 1
  End If

  If InStr(1, Sheets("Sheet1").Cells(x, 3), "(4)") <> 0 _
  And InStr(1, Sheets("Sheet1").Cells(x, 31), "Adult") <> 0 Then
    Sheets("Sheet1").Cells(x - 3, 53).Value = _
    Sheets("Sheet1").Cells(x - 3, 53).Value + 1
  End If

Next x

End Sub

你可能会说,当我处理10次以上的重复时,这开始有点傻了!我知道编写VBA的主要规则之一是避免重复代码。我已经看了一些人们循环他们的代码的例子,但是我没有运气将这些方法应用到我自己的。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您可以先在列31上使用过滤器,只显示出现"Adult"的行。之后它变得更简单,肯定更快。

Sub BUBFindAdults2()
    With Sheets("Sheet1").UsedRange
       .AutoFilter 31, "*Adult*"
       Dim r As Range, i As Integer
       For Each r In .SpecialCells(xlCellTypeVisible).EntireRow
         For i = 2 To 4
            If r.Cells(3) Like "*(" & i & ")*" Then
                With r.Offset(1 - i).Cells(53)
                    .Value = .Value + 1
                End With
            End If
         Next
       Next
      .Parent.AutoFilterMode = False
  End With
End Sub

答案 1 :(得分:2)

我无法运行您的代码,但使用嵌套for循环可以很容易地实现这一点。请参阅以下代码,该代码将根据您在问题中提供的代码执行10次重复:

Sub BUBFindAdults2()

lastRow = Sheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row

For x = 3 To lastRow     
  If InStr(1, Sheets("Sheet1").Cells(x, 31), "Adult") <> 0 Then      
    For i = 1 To 10
      If InStr(1, Sheets("Sheet1").Cells(x, 3), "(" & (i+1) & ")") <> 0 Then
        Sheets("Sheet1").Cells(x - i, 53).Value = _
        Sheets("Sheet1").Cells(x - i, 53).Value + 1
      End If
    Next i
  End If
Next x

End Sub