【问题标题】:For each loop conditions causing type mismatch对于导致类型不匹配的每个循环条件
【发布时间】:2017-06-01 22:51:27
【问题描述】:

当循环条件包括 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 循环重复使用此变量吗?

【问题讨论】:

    标签: vba excel loops


    【解决方案1】:

    使用相交将 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 .... 下一个循环中重用 cellSkill。当你退出最后一个循环时,cellSkill 应该是Nothing

    【讨论】:

    • 使用 Intersect 会产生相同的类型不匹配错误。但是,正如我所想,最后一行方法工作正常。相交对你有用吗?我的错误可能是什么原因?
    • 我在循环前使用了Debug.Print Intersect(skillSheet.Columns("F"), skillSheet.UsedRange).Address,在循环内使用了Debug.Print cellSkill.Address。两者都正确。
    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 2012-11-03
    • 2019-02-19
    • 1970-01-01
    • 2016-02-23
    • 2022-12-13
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多