VBA在第一个空行停止处理

VBA在第一个空行停止处理,vba,excel,Vba,Excel,我有一个生成所选列的平面文本文件的 问题是该过程需要一段时间,因为通常会单击列字母,并高亮显示整个列,包括所有未使用的单元格 如何使宏在找到第一个空行时停止处理 这是我的密码 Sub testlist() Open "C:\Users\gaum\Desktop\Work\NCL\testlist.lst" For Output As #1 For NR = 1 To Selection.Rows.Count For NC = 1 To Selection.Columns.Count ExpDat

我有一个生成所选列的平面文本文件的

问题是该过程需要一段时间,因为通常会单击列字母,并高亮显示整个列,包括所有未使用的单元格

如何使宏在找到第一个空行时停止处理

这是我的密码

Sub testlist()
Open "C:\Users\gaum\Desktop\Work\NCL\testlist.lst" For Output As #1
For NR = 1 To Selection.Rows.Count
For NC = 1 To Selection.Columns.Count
ExpData = Selection.Cells(NR, NC).Value
If IsNumeric(ExpData) Then ExpData = Val(ExpData)
If IsEmpty(Selection.Cells(NR, NC)) Then ExpData = ""
If NC <> NumCols Then
If Not ExpData = "FilePath" Then Print #1, ExpData
End If
Next NC
Next NR
Close #1
End Sub
子测试列表()
打开“C:\Users\gaum\Desktop\Work\NCL\testlist.lst”,输出为#1
对于NR=1的Selection.Rows.Count
对于NC=1到Selection.Columns.Count
ExpData=Selection.Cells(NR,NC).Value
如果为数字(ExpData),则ExpData=Val(ExpData)
如果为空(Selection.Cells(NR,NC)),则ExpData=“”
如果是NC NumCols,则
如果不是ExpData=“FilePath”,则打印#1,ExpData
如果结束
下一个NC
下一个NR
关闭#1
端接头
此外,如果我有多个选择,即ctrl和左键单击各个单元格,我也可以让宏生成输出,它当前仅输出第一个高亮显示


非常感谢

鉴于此过程需要一段时间,您最好不要停留在空白单元格处,而完全删除低效的量程循环。下面的代码

  • 使用变量数组而不是范围
  • 删除冗余的两步
    IF
    测试(如果
    ExpData
    为数字,则不能为
    “文件路径”
代码

Sub testlist()
Dim X
Dim lngCnt As Long
X = Selection
If IsEmpty(X) Then Exit Sub
Open "C:\Users\gaum\Desktop\Work\NCL\testlist.lst" For Output As #1
For lngCnt = 1 To UBound(X)
If Len(X(lngCnt, 1)) = 0 Then Exit For
If IsNumeric(X(lngCnt, 1)) Then Print #1, Val(X(lngCnt, 1))
Next
Close #1
End Sub

既然你问了两个不同的问题,我将分别回答这两个问题

遇到空行时停止处理的最简单方法是在第二次
For..Next
循环之前添加检查。问题是如何检查。检查整个范围是否为空的最简单方法是使用
CountA
工作表函数

If WorksheetFunction.CountA(Range(NR & ":" & NR).EntireRow) = 0 Then Exit For
上面将基本上使用工作表函数
CountA
,并计算范围内非空单元格的数量(这里使用
CountA
很重要,因为
Count
工作表函数只计算数值单元格而不计算非数值单元格,而
CountA
将计算除空格以外的任何单元格。使用
工作表函数
对象的另一个好处是,您可以根据需要调整
范围
对象如果只想通过指定特定的
范围而不使用
.EntireRow
来检查少数列,而不是整行


下一个问题是如何处理多个选定范围。名为
Selection
类的另一个成员应为您提供所需的功能。
Areas
是一个集合,其中包含您所做的每个单独选择范围的范围

通过使用选择的基于1的索引,可以独立引用每个选择范围:

NumAreaRows = Selection.Areas(1).Rows.Count 'gets the number of rows in the first selected range
NumAreaCols = Selection.Areas(2).Columns.Count 'gets the number of columns in the second selected range

因此,您可以将这两者结合到您的解决方案中:

Sub testlist()
    Open "C:\Users\gaum\Desktop\Work\NCL\testlist.lst" For Output As #1

    For NA = 1 To Selection.Areas.Count
        For NR = 1 To Selection.Areas(NA).Rows.Count

            If WorksheetFunction.CountA(Range(NR & ":" & NR).EntireRow) = 0 Then Exit For

            For NC = 1 To Selection.Areas(NA).Columns.Count
                ExpData = Selection.Areas(NA).Cells(NR, NC).Value
                If IsNumeric(ExpData) Then ExpData = Val(ExpData)
                If IsEmpty(Selection.Areas(NA).Cells(NR, NC)) Then ExpData = ""
                If NC <> NumCols Then
                    If Not ExpData = "FilePath" Then Print #1, ExpData
                End If
            Next NC
        Next NR
    Next NA
    Close #1
End Sub
子测试列表()
打开“C:\Users\gaum\Desktop\Work\NCL\testlist.lst”,输出为#1
对于NA=1到Selection.Areas.Count
对于NR=1,选择.area(NA).Rows.Count
如果工作表function.CountA(范围(NR&“:”&NR).EntireRow)=0,则退出以进行
对于NC=1到Selection.area(NA).Columns.Count
ExpData=选择区域(NA).单元格(NR,NC).值
如果为数字(ExpData),则ExpData=Val(ExpData)
如果为空(Selection.Areas(NA).Cells(NR,NC)),则ExpData=“”
如果是NC NumCols,则
如果不是ExpData=“FilePath”,则打印#1,ExpData
如果结束
下一个NC
下一个NR
下一个NA
关闭#1
端接头

这里的
CountA
函数和
Exit For
语句的位置允许您独立地循环每个选定的范围,如果其中一个范围中有一个空行,它将不会完全退出。

正如我在回答中所说的,应该避免范围循环,因为它们通常非常慢,并且不会完全退出hat过程需要一段时间。此外,为了保持一致性,上述Ansare中的
COUNTA
应适用于
选择
——而不是整个选择row@brettdj我正在研究OP的语句,即当宏找到第一个空行时,如何让宏停止处理?
我同意有比<代码>COUNTA在整行,但他现在删除的评论(作为答案发布)表明你的答案不是他想要的,所以我完全按照他的帖子中的描述去做。我的评论更多的是关于COUNTA(一个很好的测试)应该应用于所选内容的交集,而不是整行。是的,我确实看到了现在已删除的注释,我确实测试了我的所有代码预发布,因此不确定为什么对theOP失败:)