既然你问了两个不同的问题,我将分别解决它们。
遇到空白行时停止处理的最简单方法是在第二个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
允许您独立循环遍历每个选定的范围,如果您在其中一个范围中有空白行,它将不会完全退出。