VBA实现工作表单元格值匹配时,如何保持当前循环单元格直到条件满足?
问题与解决:匹配两个工作表单元格值
需求
检查工作表s4中的每个单元格是否与工作表s1中的某个单元格值相同。
最初尝试的问题与代码
最初想用For Each循环实现,期望匹配条件不满足时,阻止Next c将c跳转到下一个单元格,直到条件成立。但通过MsgBox c.Value & "hiiiii"测试发现,c始终会自动跳转到下一个单元格,无法实现预期逻辑。
最初的VBA代码:
Dim s1 As Worksheet Dim s2 As Worksheet Dim s3 As Worksheet Dim s4 As Worksheet Set s1 = ThisWorkbook.Sheets("test1") Set s2 = ThisWorkbook.Sheets("test2") Set s3 = ThisWorkbook.Sheets("test3") Set s4 = ThisWorkbook.Sheets("test4") Dim l As Integer l = 8 lastrow = s4.Range("J" & s4.Rows.count).End(xlUp).row Set rd = s4.Range("J2:J" & lastrow) Set rf = s1.Range("A" & l) For Each c In rd MsgBox c.Value & "hiiiii" If rf.Value = "" Then: Exit For If c.Value = rf.Value Then s1.Range("B" & l).Value = c.Offset(, -1) l = 8 Set rf = s1.Range("A" & l) Else l = l + 1 Set rf = s1.Range("A" & l) Set c = c.Offset(-1, 0) End If Next c
优化后的解决方案:嵌套For循环
后续调整代码结构,采用嵌套For循环实现了需求,优化后的代码如下:
Dim l As Integer Dim i As Integer lastrow = s4.Range("J" & s4.Rows.count).End(xlUp).row LastRow2 = s1.Range("A" & s1.Rows.count).End(xlUp).row l = 8 i = 8 Set rd = s4.Range("J2:J" & lastrow) Set rf = s1.Range("A" & i) For Each c In rd If c.Value <> rf.Value Then For i = 8 To LastRow2 Set rf = s1.Range("A" & i) If rf.Value = c.Value Then rf.Offset(, 1).Value = c.Offset(, -1) End If Next i Else rf.Offset(, 1).Value = c.Offset(, -1) End If Next c End Sub
感谢Cyril提供的其他循环方式建议。
内容的提问来源于stack exchange,提问作者Black Mamba
相关产品推荐
相关产品推荐

