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失败:)