我有vba生成所选列的平面文本文件。
问题是该过程需要一段时间,因为通常会单击列字母并突出显示整个列,包括所有未使用的单元格。
如何在宏找到第一个空行时让宏停止处理?
这是我的代码。
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
如果我有多个选项,即ctrl并左键单击各个单元格,我也能够获得宏来生成输出,它目前只输出第一个高亮显示。
非常感谢
答案 0 :(得分:1)
由于您提出了2个单独的问题,我将分别对其进行处理。
遇到空行时停止处理的最简单方法是在第二个For..Next
循环之前添加一个检查。问题是如何检查。检查整个范围是否为空的最简单方法是使用CountA
工作表函数。
If WorksheetFunction.CountA(Range(NR & ":" & NR).EntireRow) = 0 Then Exit For
上面基本上会使用工作表函数CountA
并计算范围内非空白的单元格数量(使用CountA
非常重要,因为Count
工作表函数只会计算数字单元格而不是非数字单元格,而CountA
将计算除空格之外的任何内容。使用WorksheetFunction
对象获得的另一个好处是可以根据需要调整Range
对象如果您只想指定特定的Range
而不是.EntireRow
来检查几列而不是整行。
接下来的问题是如何处理多个选定的范围。 Selection
类的另一个成员名为Areas
,它应该为您提供所需的功能。 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
此处放置CountA
函数和Exit For
语句允许您独立循环遍历每个选定范围,如果其中一个范围中有空行,则不会完全退出。
答案 1 :(得分:0)
鉴于此过程需要一段时间,您最好不要停留在空白单元格,并完全删除低效的范围循环。
下面的代码IF
测试(如果ExpData
是数字,则 <{1}} <强>码强>
"FilePath"