2016-07-26 186 views
0

我有一个大型的VBA项目,负责改变它如何收集一些数据。空白单元格 - 如何停止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列中的数据为空/空时停止这样做。

不是在VBA的专业人士,不知道该说什么或在哪里......任何建议?

+0

您可以通过查找列W中的值的最后一行来限制范围,请参阅此处:http://stackoverflow.com/questions/11169445/error-in-finding-last-used-cell-in-vba或者你可以在第一个代码块的第二行之前放置一条IF语句,如果'rCell.Value =“”''rCell.Value =“”' –

回答

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

相反的Exit Sub我只想用Exit 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第一操作的范围。

+0

这是疯狂的工作是SOLO IT人“所有事情IT”,但我忘记发表评论这对我如何工作,我非常感激。 – Brian

+0

最后一个问题......我如何使用上面的代码强制它在W列上输入的内容?他们遇到了一个问题,他们进入一个工作,说161616,如果这个工作有阶段,我们的名字就像161616A,161616B等,它将拉动所有相关的工作,从161616开始。我们需要它完全匹配。 – Brian

+0

我唯一可能看到的原因是'strPath&“*”'。根据目录模式的不同,'strPath&“\ *”'可能会解决它,但这比实际问题更关注于您的特定任务。 – cheezsteak

相关问题