我有一个大型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列找到的数据后,它只是继续添加作业路径中的所有内容。直到找到该路径中的所有"作业",它才会停止。当W列中的数据为null/空时,我需要它停止这样做。
不是VBA专业人员,不知道该说什么或在哪里。。。有什么建议吗?
如果您有在for循环之后运行的代码,我只会使用Exit For
来突破for循环,而不是Exit Sub
。
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
有关如何计算最后一行的说明,请参见此答案。
如果我理解正确,如果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