Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
空白单元格-如何使用空/空单元格停止VBA过程/函数_Vba_Excel - Fatal编程技术网

空白单元格-如何使用空/空单元格停止VBA过程/函数

空白单元格-如何使用空/空单元格停止VBA过程/函数,vba,excel,Vba,Excel,我有一个大型VBA项目,我的任务是改变它收集数据的方式 基本上,数据将在工作表的W列中输入,其在宏中的代码如下: For Each rCell In Worksheets("REPORT").Range("W2:W50") Debug.Print rCell.Value: sJob = rCell.Value 它获取我希望它在W列中获取的数据 之后不久,它将启动此代码块中的一个函数: vJobFolders = Split(FindJobDir(strpathtofile & sJ

我有一个大型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
函数FindJobDir(ByVal strPath作为字符串)作为字符串
作为字符串的Dim sResult
sResult=Dir(strPath&“*”,vbDirectory)
FindJobDir=UCase$(sResult)
在sResult“”时执行
sResult=Dir
如果Len(sResult)>0,则FindJobDir=FindJobDir&“,”&UCase$(sResult)
环
端函数
所发生的事情是,在它获取了它能找到的所有数据(列W)之后,它只是继续添加作业路径中的所有内容。直到找到该路径中的所有“作业”,它才会停止。当W列中的数据为null/空时,我需要它停止这样做


不是VBA的专家,不知道该说什么或在哪里…有什么建议吗

如果我理解正确,您希望在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

如果我理解正确,您希望在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

我将使用
Exit For
来打破For循环,而不是
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

有关如何计算最后一行的说明,请参见。

我将使用
Exit for
来中断for循环,而不是使用
Exit 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

有关如何计算最后一行的说明,请参见。

您可以通过在W列中查找最后一行的值来限制范围,请参见此处:或者,如果
rCell.Value=“”的话,您可以在第一个代码块的第二行之前放置一条IF语句来跳过该迭代
您可以通过在W列中查找最后一行的值来限制范围,请参见此处:或者,如果
rCell.Value=“”
为“所有的东西都是It”而单独工作,您可以在第一个代码块的第二行之前放置一条IF语句来跳过该迭代但我忘了评论这对我来说是如何起作用的,我非常感激。最后一个问题……我如何使用上面的代码强制它与他们在W列上键入的内容完全一致?他们遇到了一个问题,他们输入一个作业,比如161616,如果该作业有阶段,我们称之为161616A、161616B等。它将从161616开始引入所有相关作业。我们需要精确匹配。我唯一可能看到原因的地方是
strPath&“*”
。根据你的目录模式,
strPath&“\*”
可能会解决这个问题,但这更侧重于你的具体任务,而不是实际问题。是的,我尝试了“*”,它变得古怪,带来了大量不相关的东西……我想它就在这里。。。对于工作表(“报告”).Range(“W2:W50”)中的每个rCell,如果是空的(rCell.Value),则退出子调试。打印rCell.Value:sJob=rCell.Value。我认为这里需要一些确保rCell.Value准确的东西。在工作中,为“所有的东西都是它”而单独使用It的人是疯狂的但我忘了评论这对我来说是如何起作用的,我非常感激。最后一个问题……我如何使用上面的代码强制它与他们在W列上键入的内容完全一致?他们遇到了一个问题,他们输入一个作业,比如161616,如果该作业有阶段,我们称之为161616A、161616B等。它将从161616开始引入所有相关作业。我们需要精确匹配。我唯一可能看到原因的地方是
strPath&“*”
。根据你的目录模式,
strPath&“\*”
可能会解决这个问题,但这更侧重于你的具体任务,而不是实际问题。是的,我尝试了“*”,它变得古怪,带来了大量不相关的东西……我想它就在这里。。。对于工作表(“报告”).Range(“W2:W50”)中的每个rCell,如果是空的(rCell.Value),则退出Sub-Debug.Print rCell.Value:sJob=rCell.Value,我认为这里需要确保rCell.Value是准确的。