我有一个大型的VBA项目,我的任务是改变它收集一些数据的方式。
基本上,数据将输入到工作表的W列中,而宏中的代码是:
For Each rCell In Worksheets("REPORT").Range("W2:W50")
Debug.Print rCell.Value:
sJob = rCell.Value
它抓取我希望它在W列中抓取的数据。
在此之后不久,它将启动此代码块中的函数:
vJobFolders = Split(FindJobDir(strpathtofile & sJob), ",")
For i = 0 To UBound(vJobFolders)
这个名为FindJobDir的函数看起来像这样:
Function FindJobDir(ByVal strPath As String) As String
Dim sResult As String
sResult = Dir(strPath & "*", vbDirectory)
FindJobDir = UCase$(sResult)
Do While sResult <> ""
sResult = Dir
If Len(sResult) > 0 Then FindJobDir = FindJobDir & "," & UCase$(sResult)
Loop
End Function
发生了什么,在抓取所有数据后,它可以找到W列,它只是继续添加作业路径中的所有内容。它并没有停止,直到所有&#34;工作&#34;在那条路上找到了。当W列中的数据为空/空时,我需要它停止这样做。
不是VBA的专业人士,不知道该说什么或在哪里......有什么建议吗?
答案 0 :(得分:1)
如果我理解正确,如果W列中的值为空,则要停止运行代码。如果是这样,以下编辑应该对你有用......
改变这个:
For Each rCell In Worksheets("REPORT").Range("W2:W50")
Debug.Print rCell.Value:
sJob = rCell.Value
到此:
For Each rCell In Worksheets("REPORT").Range("W2:W50")
If IsEmpty(rCell.Value) Then Exit Sub
Debug.Print rCell.Value:
sJob = rCell.Value
答案 1 :(得分:1)
而不是Exit Sub
我只会使用Exit For
来跳出for循环,以防你有代码在for循环之后运行。
For Each rCell In Worksheets("REPORT").Range("W2:W50")
If IsEmpty(rCell.Value) Then Exit For
Debug.Print rCell.Value:
sJob = rCell.Value
' ...
Next
我也不会硬编码你的范围到49个单元格。如果你输入的数据多于或少于那么你会遇到像你刚才遇到的问题。最好的解决方案是先选择
之类的操作范围Dim reportSheet As Worksheet
Set reportSheet = Worksheets("REPORT")
Dim lastRow As Integer
lastRow = reportSheet.Cells(reportSheet.Rows.Count, "W").End(xlUp).Row
Dim jobRange As Range
Set jobRange = reportSheet.Range("W2:W" & lastRow)
For Each rCell In jobRange
Debug.Print rCell.Value ' colon is only needed for line breaks
sJob = rCell.Value
' ...
Next
有关如何计算最后一行的说明,请参阅this answer。