用多个variables重复一个IF语句

如果在它下面的行有一个包含括号数字“(2)”的单元格和另一个包含单词“成人”的单元格,我有一个macros在列53(列BA)中的单元格加1。

它是这样的:

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 

但是,如果下面行包含“(3)”和“成人”,我也需要它加1到同一个单元格。 如果下面三行包含“(4)”和“成人”。 等等。 你看到的模式!

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

 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的一个主要规则是避免重复的代码。 我已经看了一些循环其代码的人的其他例子,但是我还没有将这些方法应用到我自己的方法中。

任何帮助将非常感激。

我不能让你的代码运行,但是这可以很容易地使用嵌套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 

您可以首先在列31上使用filter,只有"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