2017-06-01 52 views
2

當循環條件包括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已由腳本確定?

另外,對於循環中的每個變量cellSkill會發生什麼?我可以在沒有問題的情況下將這個變量重用到另一個For Each循環中嗎?

回答

4

使用相交將列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 

是的,你可以在以下對於.... Next循環再利用cellSkill。當你退出最後一個循環時,cellSkill應該是Nothing

+0

使用Intersect產生相同類型的不匹配錯誤。但是,正如我所想,最後一行方法正常工作。 Intersect是否像你寫的那樣爲你工作?什麼可能是我的錯誤的原因? –

+0

我在循環之前使用了'Debug.Print Intersect(skillSheet.Columns(「F」),skillSheet.UsedRange).Address'和循環內的'Debug.Print cellSkill.Address'。兩者都是正確的。 – Jeeped