当循环条件包括F列的整个范围时,此代码可以正常工作:
Dim ABnumb As String
Dim cellSkill As Range
Let ABnumb = dayWS.Cells(i1, 2).Value
For Each cellSkill In skillSheet.Range("F:F")
If cellSkill.Value = ABnumb Then
Let skillNumb = cellSkill.Offset(0, -5).Value
Let skillDelimited = skillDelimited & ";" & skillNumb
End If
Next cellSkill
但为了提高效率,我想将循环限制在使用范围内。当我将代码更改为:
For Each cellSkill In skillSheet.UsedRange("F")
我的表达式出现类型不匹配错误:
If cellSkill.Value = ABnumb Then
我玩改变了两个变量'声明的数据类型,但没有任何用处。
有没有办法可以使用.UsedRange(" F")?或者我应该使用.Range(1,lastRow),其中lastRow已经由脚本确定了?
此外,循环中For Each变量cellSkill会发生什么?我是否可以将此变量重复用于另一个For Each循环通过单元格范围而不会出现问题?
答案 0 :(得分:4)
使用Intersect将列F修剪为工作表的.UsedRange属性。
For Each cellSkill In Intersect(skillSheet.Columns("F"), skillSheet.UsedRange)
...
next cellSkill
要解决您的选择,应该是,
with skillSheet
for each cellSkill in .Range(.cells(1, "F"), .cells(.rows.count, "F").end(xlup))
...
next cellSkill
end with
是的,您可以在以下For .... Next循环中重复使用cellSkill。当您退出最后一个循环时,cellSkill应为Nothing
。