VBA在第一个空行停止处理

时间:2013-07-12 07:41:23

标签: excel vba excel-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并左键单击各个单元格,我也能够获得宏来生成输出,它目前只输出第一个高亮显示。

非常感谢

2 个答案:

答案 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"